From: Sergey Matveev Date: Mon, 17 May 2021 17:33:20 +0000 (+0300) Subject: Ограничения процесса по памяти и процессору X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=17efdb3c97a8de4227c447bd8dc67cbbd7ae873b;p=stargrave-blog.git Ограничения процесса по памяти и процессору 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 никоим образом не отрабатывает (или я делаю что-то не так). ---