]> Sergey Matveev's repositories - stargrave-blog.git/commit
Ограничения процесса по памяти и процессору
authorSergey Matveev <stargrave@stargrave.org>
Mon, 17 May 2021 17:33:20 +0000 (20:33 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Mon, 17 May 2021 17:38:05 +0000 (20:38 +0300)
commit17efdb3c97a8de4227c447bd8dc67cbbd7ae873b
tree4b825dc642cb6eb9a060e54bf8d69288fbee4904
parent30e66d0241bba320a871b8570c40d34c2002f978
Ограничения процесса по памяти и процессору

https://unix.stackexchange.com/questions/44985/limit-memory-usage-for-a-single-linux-process
http://coldattic.info/post/40/
ulimit-ом я пользовался прежде только для подкручивания кол-ва файловых
дескрипторов. Регулярно во многих задачах в них утыкался. Недавно в
goredo, в котором я много открытых файлов без надобности имел. Но вот по
памяти никогда не приходилось ограничивать. И я так и не понял как с
этим работать и почему оно не работает. Говорю маленький "ulimit -m", но
что Go, что Си программы упорно спокойно могут аллоцировать гигабайты.
Судя по stackexchange, оно или у кого-то работает, или предлагают
совершенно другие решения. Вот и я пока совершенно не знаю как оно всё
устроено и почему не работает.

Но, как всегда, на помощь пришёл софт от DJB! Помню что в daemontools
была утилита по ограничению ресурсов. "softlimit -m" отлично
срабатывает, возвращая ошибку нехватки памяти. И для Go софта
отрабатывает без проблем.

Обратил внимание на то, что можно ограничить CPU время через этот
softlimit. Проверил -- действительно это не время жизни процесса, а
именно съеденное время. Посетила идея что надо бы lighttpd обернуть в
эту штуку -- раз в несколько месяцев, но замечаю что иногда lighttpd
отжирает 100% CPU, вроде даже ни на что и не реагируя (но не помню
точно). Поставил перезапуск по cron. Как раз softlimit по процессору
вроде бы должен помочь: при штатной работе он не много ест CPU и его
наверное неделями можно было бы не перезапускать, а если он уйдёт в
бесконечный цикл, то быстро иссякнет лимит и его грохнут, автоматически
перезапустив.

А вообще тут возился с одной программой, которая жутко течёт. Сейчас
выбросил её, но вот не понравилось мне то, что при росте памяти оно
начнёт отъедать swap и, соответственно, делать систему
неработоспособной. А если OOM killer и сработает, то запросто грохнет
какой-нибудь SSH. Знаю что это вечная проблема и придумана тьмища
способов решения или, хотя бы, выбора кого надо грохнуть. Но сейчас вот
вижу что можно просто бы обернуть в softlimit недоверенный (или известно
что текучий) софт и не париться.

Где-то я вроде у DJB в его скудной документации видел совет по
оборачиванию в softlimit -- теперь дошло насколько это полезно. Unix
познаётся мною только сейчас...

А ещё в статье на coldattic.info упоминается что soft limit-ы пошлют
сигнал SIGCPU, который можно перехватить и как-то среагировать. Знал что
есть soft и hard, но даже примерно не представлял чем они на практике бы
отличались. Впрочем у меня всё равно ulimit никоим образом не
отрабатывает (или я делаю что-то не так).