Жесткие и мягкие пределы памяти задач AWS ECS

Я смущен тем, что для определения задач ECS заданы как жесткие, так и мягкие ограничения памяти.

IIRC. Предельный размер - это объем памяти, который планировщик резервирует для экземпляра для выполнения задачи, а жесткий предел - сколько памяти контейнер может использовать до того, как он будет убит.

Моя проблема в том, что если планировщик ECS распределяет задачи на экземпляры на основе мягкого предела, у вас может быть ситуация, когда задача, использующая память выше мягкого предела, но ниже жесткого предела, может привести к тому, что экземпляр превысит его максимальный памяти (при условии, что все остальные задачи используют память, немного ниже или равную их мягкому пределу).

Правильно ли это?

Спасибо

Ответ 1

Если вы ожидаете запустить вычислительную рабочую нагрузку, которая в основном связана с памятью, а не с процессором, то вам следует использовать только жесткое ограничение, а не мягкое ограничение. Из документов:

Вы должны указать ненулевое целое число для одного или обоих элементов памяти или memoryReservation в определениях контейнеров. Если вы укажете оба, память должна быть больше, чем memoryReservation. Если вы укажете memoryReservation, то это значение будет вычтено из доступных ресурсов памяти для экземпляра контейнера, в который помещен контейнер; в противном случае используется значение памяти.

http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html

Указывая только жесткий предел памяти для ваших задач, вы избегаете исчерпания памяти, так как ECS прекращает помещать задачи в экземпляр, а Docker убивает все контейнеры, которые пытаются преодолеть жесткий предел.

Функция мягкого ограничения памяти предназначена для приложений с ограниченным использованием процессора, где вы хотите зарезервировать небольшой минимум памяти (мягкое ограничение), но допускаете случайные выбросы до жесткого ограничения. В этом типе большой рабочей нагрузки на ЦП вы на самом деле не заботитесь об особой ценности использования памяти для контейнеров, так как контейнеры исчерпают ЦП задолго до того, как они исчерпают память экземпляра, поэтому вы можете размещать задачи на основе Резервирование процессора и ограничение мягкой памяти. В этой настройке жесткий предел является просто отказоустойчивым на случай, если что-то выйдет из-под контроля или произойдет утечка памяти.

Таким образом, в итоге вы должны оценить свою рабочую нагрузку, используя нагрузочные тесты, и посмотреть, имеет ли она тенденцию не хватать сначала ЦП или сначала нехватки памяти. Если вы привязаны к процессору, вы можете использовать мягкое ограничение памяти с дополнительным жестким ограничением в качестве отказоустойчивого. Если вы ограничены памятью, вам нужно будет использовать только жесткий предел без мягкого ограничения.