Как я могу настроить monit для уничтожения процесса с высокой загрузкой процессора через несколько секунд?

Я хочу использовать monit, чтобы убить процесс, который использует более X% ЦП более N секунд.

Я использую stress для генерации нагрузки, чтобы попробовать простой пример.

Мой .monitrc:

check process stress
    matching "stress.*"
    if cpu usage > 95% for 2 cycles then stop

Запускаю monit (проверил синтаксис с monit -t .monitrc):

monit -c .monitrc -d 5

И запускаю стресс:

stress --cpu 1 --timeout 60

Стресс отображается в top как использование 100 % ЦП.

Я ожидал, что monit убьет стресс примерно за 10 секунд, но стресс успешно завершается. Что я делаю не так?

Я также попробовал monit procmatch "stress.*", который почему-то показывает два совпадения. Может это актуально?

List of processes matching pattern "stress.*":
stress --cpu 1 --timeout 60
stress --cpu 1 --timeout 60
Total matches: 2
WARNING: multiple processes matched the pattern. The check is FIRST-MATCH based, please refine the pattern

РЕДАКТИРОВАТЬ: Пробовал метод e.lopez

Мне пришлось удалить оператор запуска из .monitrc, потому что он вызывал ошибку в monit ('stress' failed to start (exit status -1) -- Program /usr/bin/stress timed out, а затем зомби-процесс).

Итак, запустил стресс вручную:

stress -c 1
stress: info: [8504] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd

.monitrc:

set daemon 5
check process stress
    matching "stress.*"
    stop program = "/usr/bin/pkill stress"
    if cpu > 5% for 2 cycles then stop

Запустил монитор:

monit -Iv -c .monitrc
Starting Monit 5.11 daemon
'xps13' Monit started
'stress' process is running with pid 8504
'stress' zombie check succeeded [status_flag=0000]
'stress' cpu usage check skipped (initializing)
'stress' 
'stress' process is running with pid 8504
'stress' zombie check succeeded [status_flag=0000]
'stress' cpu usage check succeeded [current cpu usage=0.0%]
'stress' process is running with pid 8504
'stress' zombie check succeeded [status_flag=0000]
'stress' cpu usage check succeeded [current cpu usage=0.0%]
'stress' process is not running
'stress' trying to restart
'stress' start skipped -- method not defined

Monit видит правильный процесс (соответствие pids), но видит использование 0% (стресс использует 1 процессор на 100% на вершину). Я отключил стресс вручную, когда monit говорит, что процесс не запущен (в конце, выше). Итак, monit нормально отслеживает процесс, но не видит правильного использования процессора.

Любые идеи?


person capitalistcuttle    schedule 01.11.2015    source источник


Ответы (1)


Обратите внимание, что если ваша система имеет много ядер, тот факт, что вы нагружаете только одно из них (процессор 1), не будет нагружать всю систему. В моих тестах с процессором i7 нагрузка на ЦП от 1 до 95% просто нагружала всю систему до 12,5%.

В зависимости от количества ядер вы можете использовать соответственно:

monit -c X

где X — количество ядер, которые вы хотите нагрузить.

Но это не главная ваша проблема. Ваша проблема в том, что вы не предоставляете monit инструкцию по остановке программы стресса. Посмотри на это:

check process stress
matching "stress.*"
start program = "/usr/bin/stress -c 1" with timeout 10 seconds
stop program = "/usr/bin/pkill stress"
if cpu > 5% for 2 cycles then stop

Вам не хватает по крайней мере строки «стоп», где вы определяете команду, которая будет использоваться monit для фактической остановки процесса. Поскольку стресс не является службой, вы можете использовать команду pkill, чтобы убить процесс.

Я успешно протестировал приведенную выше конфигурацию. Вывод monit.log:

[CET Nov  5 09:03:02] info     : 'stress' start action done
[CET Nov  5 09:03:02] info     : 'Overlord' start action done
[CET Nov  5 09:03:12] info     : Awakened by User defined signal 1
[CET Nov  5 09:03:22] error    : 'stress' cpu usage of 12.5% matches resource limit [cpu usage<5.0%]
[CET Nov  5 09:03:32] error    : 'stress' cpu usage of 12.4% matches resource limit [cpu usage<5.0%]
[CET Nov  5 09:03:32] info     : 'stress' stop: /usr/bin/pkill

Итак: если вы просто хотите протестировать, поэтому загрузка ЦП не имеет значения, просто используйте конфигурацию, которую я предоставил выше. Как только вы убедитесь, что ваша конфигурация работает, настройте ограничения ресурсов для процессов, которые вы хотите отслеживать в производственной среде.

Всегда имейте под рукой: https://mmonit.com/monit/documentation/

Надеюсь, поможет.

С Уважением

person Eduardo López    schedule 05.11.2015
comment
Большое спасибо за подробный ответ. К сожалению, все еще сталкиваюсь с проблемами. Пожалуйста, смотрите правки. Если это доставляет больше хлопот, чем того стоит, я полностью понимаю. Начинать думать, что проще самому написать какую-нибудь простую утилиту, чем отлаживать monit. - person capitalistcuttle; 08.11.2015
comment
Как-то вообще не имеет смысла, что предоставленная конфигурация не работает в вашей среде ... Я предполагаю, что вы обновили конфигурацию monit, выполнив sudo monit -t && sudo service monit restart && sudo monit start all после обновления файла конфигурации? В этом случае я бы предложил переустановить monit. - person Eduardo López; 15.11.2015