Назад | Перейти на главную страницу

Избежать сбоя, когда процесс выделяет слишком много памяти?

Похожий на этот вопрос, у нас есть вычислительный сервер с 96 ГБ ОЗУ, который используется для параллельного выполнения больших заданий.

Иногда превышается общий объем физической ОЗУ, в результате чего сервер перестает отвечать, что вызывает перезагрузку. Для меня это неприемлемое поведение, поэтому я ищу способы исправить это.

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

Я подозреваю, что проблема может возникать из-за того, что в системе есть 20 ГБ подкачки: вместо того, чтобы убивать вызывающий нарушение процесс (-ы), система выделяет память на диске, что делает его невосприимчивым. Уменьшение суммы свопа - хорошая идея?

Мы высоко ценим любые идеи или опыт решения подобной проблемы!

РЕДАКТИРОВАТЬ

Я провел несколько экспериментов, используя следующую программу на C ++:

#include <vector>
#include <unistd.h>

using namespace std;

int main(int argc,char * argv[])
{
        while(true) {
                vector<double>* a = new vector<double>(50000000);
                sleep(1);
        }
}

Я запустил его в первый раз с файлом подкачки 256 МБ. Система полностью зависла минут 5, после чего ожила. В журналах я увидел, что убийца OOM успешно уничтожил мою дырявую программу.

Второй раз запустил без подкачки. На этот раз машина не оживала как минимум десять минут, после чего я перезагрузил машину. Для меня это стало неожиданностью, поскольку я ожидал, что убийца OOM сработает раньше на машине без подкачки.

Я не понимаю следующего: почему Linux ждет, пока система полностью не зависнет, чтобы что-то предпринять с нарушением процесса? Неужели слишком много ожидать, что ОС не будет полностью убита одним плохо закодированным процессом?

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

Вам нужно либо контролировать использование памяти для ваших заданий, либо установить дополнительные модули памяти на сервер.

Можешь попробовать cgroups (группы управления), чтобы контролировать использование ЦП и памяти процессами.

У вас есть журналы oom в / var / log / messages.

Я бы посоветовал проверить /proc/meminfo и контролировать его в часы пиковой нагрузки. Параметр Committed_AS показывает, сколько памяти потребуется, если ядро ​​разрешит все запросы к памяти всеми процессами в это время. Если это значение ниже свободной памяти, то существует потенциальная вероятность того, что система в конечном итоге перейдет в режим OOM.

Как всегда, соответствуйте рабочей нагрузке, которую может выдержать оборудование. Лучше либо увеличить оперативную память, либо снизить нагрузку.