Перезагружать процесс, если тот насилует процессор?
Пытаюсь с помощью Monit'а ограничить аппетиты процесса. Если вдруг жрет CPU, то он бы перезагружался, но почему-то Monit его игнорирует и не перезапускает процесс.
Пробовал такие условия:
if totalcpu > 60% for 2 cycles then restart
…
if cpu usage > 60% for 2 cycles then restart
…
if cpu > 60% for 2 cycles then restart
и ни одна из конструкций не сработала.
ЧЯДНТ?
Может еще какие есть средства кроме монита или есть идеи?
Конструкции вида «if cpu > 60% for 2 cycles then restart» вполне себе рабочие и грешить на monit мне не стоило. Дело оказалось в том, что значение CPU внутри контейнера monit берет от общего и они совсем не похожи на то, что мы видим в top/htop.
Решение — поймать момент нестабильного поведения процесса и снять показания с помощью команды monit status.
1. По хорошему надо отпрофилировать процесс, чтобы понять где затык и убрать САМУ причину таких граблей.
2. Настроить квоты на процесс и/или виртуалку, чтобы ему (процессу/виртуалке) не отдавалось 100% процессора/памяти/iops/iowait'а
Т.е. ловить процесс по повышении CPU, даже долгом пике, бесполезно совсем?
1. Понимаю, сделал бы также, но есть нюансы, как обычно.
2. Квоты не решат задачу — он только ограничит потребление, а хотелось бы чтобы процесс работал постоянно.
Так разберитесь в какой момент он начинает жрать все ресурсы, ну а дальше переписывать демон. главное пункт первый, остальное это припарка чтобы не уложить машину полностью
дада, впилите как описано тут mmonit.com/wiki/Monit/FAQ (часть Q: I'm having trouble getting monit to execute any «start» or «stop» or «exec» program commands.)
Пока появилась идея посмотреть monit status в момент проблем, чтобы понять как это выглядит глазами монита… но этот момент нужно еще поймать :) Что-то не додумался до этого до написания вопроса.