На основе вопросов @Gilles спрошенный в комментариях к моему исходному вопросу я понял что kill -2
команда, которую я отправлял, предназначалась для pid сценария обертки, который запустил приложение вместо процесса, который обрабатывает сам сигнал.
Используя pids от моего вопроса, kill -s 13405
правильно не сигнализировал о приложении, но вызове kill -s 13509
работы как ожидалось.
Теперь мой вопрос состоит в том, как я могу обновить свой сценарий обертки для распространения SIGINT к его дочерним процессам, но я создам отдельный вопрос для этого.
ClamAV поддерживает строки поиска, используя классические алгоритмы строк (Бойер Мур) и регулярных выражений (Ахо Корасик). Будучи алгоритмами 1970-х годов, они чрезвычайно эффективны в памяти.
Проблема заключается в огромном количестве сигнатур вирусов. Это приводит к тому, что структуры данных алгоритмов становятся довольно большими.
Вы не можете отправить эти структуры данных на замену, так как нет частей структур данных алгоритмов, доступных реже, чем к другим частям. Если вы заставите страницы с ними поменять диски, то через несколько минут на них будут ссылаться и просто переключать обратно. (Технически мы говорим: «Произвольный доступ к структуре данных заставляет всю структуру данных находиться в рабочем наборе памяти процесса».)
Структуры данных необходимы, если вы сканируете из командной строки или сканируете с демона.
Вы не можете использовать только часть сигнатур вирусов, так как вы не можете выбрать, какие вирусы вам будут отправлены, и, следовательно, не можете сказать, какие сигнатуры вам понадобятся.
Вот память, используемая на 32-разрядной машине под управлением Debian Wheezy, и она зажмо.
# ps_mem.py
Private + Shared = RAM used Program
281.7 MiB + 422.5 KiB = 282.1 MiB clamd
Правка: Я вижу, что кто-то предлагает установить размер резидентного набора. Если это удастся, то наличие размера резидентного набора, меньшего размера рабочего набора, приведет к тому, что процесс будет метаться в своп и из него. Это существенно снизит производительность всей системы. В любом случае на странице руководства Linux для setrlimit(RLIMIT_RSS, ...) говорится, что установка размера резидентного множества больше не поддерживается и никогда не влияла на процессы, которые решили не вызывать madvise(MADV_WILLNEED, ...).
Этот ответ не проверяется, и он не мог бы работать. Это также не отвечает, как уменьшить использование памяти, но как ограничить использование памяти, которое несколько отличается.
/etc/init.d/
добавить команду ulimit -m amountofram
.