Ограничение использования CPU/IO для служб Linux
Я видел, как EXIM ломал систему, когда он загружался 10000 сообщениями от пользователя / скрипта. Мне было интересно, есть ли способ ограничить его использование в системе и защитить систему или службу от злоупотреблений.
3 ответа
Есть несколько вещей, которые exim может сделать, чтобы уменьшить нагрузку.
- Обнаружьте высокую нагрузку и сделайте exim очередь большого количества входящих сообщений, генерируемых скриптом, вместо того, чтобы пытаться доставить его. Для этого важны следующие опции:
queue_only_load нет немедленной доставки, если нагрузка высокая queue_only_load_latch не переоценивать нагрузку для каждого сообщения queue_only_override разрешить переопределение командной строки
- Скорее всего, вы привыкли использовать greg или exigrep для извлечения информации из вашего файла /var/log/exim/main.log (или как он называется в вашем дистрибутиве). Exim также по умолчанию поддерживает копию этого журнала для каждого сообщения, группируя почтовые журналы каждого сообщения в один файл, удаляя его при доставке сообщения. Вы можете просмотреть их для одного сообщения с помощью 'exim -Mvl QUEUEID'. Или просто выключите его:
В сильно загруженной системе может быть желательно отключить использование журналов для каждого сообщения, чтобы уменьшить объем дискового ввода-вывода. Это можно сделать, установив опцию message_logs false.
- Протестируйте использование системного журнала для входа на удаленный сервер, а не локально. Это немного уменьшит дисковый ввод / вывод, хотя я думаю, что он побледнеет по сравнению с вводом / выводом, вызванным большим объемом создания электронной почты и тому подобным.
- Когда вы закончите вводить электронные письма на почтовый сервер, загрузка будет снижена. В этот момент запустите кучу бегунов в очереди. Exim известен тем, что медленно доставляет сообщения из очереди, но если у вас низкая загрузка, нет ничего плохого в запуске достаточного количества процессов доставки, чтобы запустить очередь и доставить почту быстрее... до тех пор, пока ваша нагрузка не станет запрещенной (обычно указывает, что использование дискового ввода-вывода достигает насыщения). Попробуйте создать 10 участников очереди одновременно. Я подозреваю, что вы могли бы сделать 100 или 150 без чрезмерной нагрузки. 'iostat -x -d 1' - ваш друг, чтобы убедиться, что дисковый ввод / вывод является узким местом или не является узким местом.
- Проверьте DNS как вперед, так и назад для вашего сервера исходящей почты. Убедитесь, что IP-адрес, который видят серверы получателей, такой же, как вы думаете, и что ЭТО также должно быть разрешено с прямой и обратной разрешающей способностью, иначе у вас будут замедления, поскольку получатели будут выполнять поиск DNS на вашем IP (для их журналов и тому подобного).
Я предлагаю вам проверить инструменты "nice" и "ionice", чтобы уменьшить влияние требовательного процесса на загрузку процессора, а другие - для уменьшения влияния на задачи ввода-вывода. (Планировщик CFQ необходимо использовать, если вы не хотите использовать ionice для регулирования пропускной способности диска)
В качестве альтернативы вы можете проверить подсистему ядра cgroups. Cgroups поддерживает создание жестких и мягких ограничений памяти, а также регулирование использования диска. (Планировщик CFQ должен использоваться для регулирования использования диска)
Возможно, вы сможете делать то, что вам нужно, с помощью лимитов PAM (/etc/security/limits.conf
) или ulimit.