From 17efdb3c97a8de4227c447bd8dc67cbbd7ae873b Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Mon, 17 May 2021 20:33:20 +0300 Subject: [PATCH] =?utf8?q?=D0=9E=D0=B3=D1=80=D0=B0=D0=BD=D0=B8=D1=87=D0=B5?= =?utf8?q?=D0=BD=D0=B8=D1=8F=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81?= =?utf8?q?=D0=B0=20=D0=BF=D0=BE=20=D0=BF=D0=B0=D0=BC=D1=8F=D1=82=D0=B8=20?= =?utf8?q?=D0=B8=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81=D0=BE=D1=80?= =?utf8?q?=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 никоим образом не отрабатывает (или я делаю что-то не так). -- 2.48.1