Как уменьшить использование памяти ClamAV?

26

Я использую веб-сервер на основе Ubuntu (Apache, MySQL) на VPS 512 МБ. Этого более чем достаточно для сайта, на котором он работает (небольшой форум).

Поскольку я хотел добавить некоторую защиту от вирусов, я установил ClamAV и использовал его для сканирования загруженных файлов как часть сценария обработки загрузки (PHP).

Я запускаю службу clamav-daemon, поэтому определения не нужно загружать каждый раз при сканировании файла. Одним из недостатков этой практики является «огромный» объем памяти, используемый службой clamav-daemon:> 200 МБ. Это уже привело к тому, что служба была вынуждена остановиться и загрузка была отклонена.

Я могу просто обновить память VPS до 1024 МБ, но я хочу знать, есть ли способ уменьшить использование памяти ClamAV, например, не загружая ненужные определения.

Нильс Р.
источник

Ответы:

15

ClamAV содержит строки поиска с использованием алгоритмов классических строк (Бойера Мура) и регулярных выражений (Aho Corasick). Будучи алгоритмами 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, ...).

vk5tu
источник
1

Я столкнулся с подобной проблемой при запуске clamd на небольшом домашнем сетевом хранилище объемом всего 512 МБ. Из опроса вопросов в сети кажется, что нет никакого способа уменьшить использование памяти. База неприятных вещей становится все больше и больше.

Возможно настроить clamav для работы в не-демоническом режиме, установив «clamav» вместо «clamav-daemon». Это может позволить вам иметь больше памяти большую часть времени. Когда вы сканируете закачки, всегда требуется большой кусок оперативной памяти.

davefiddes
источник
1
Основным недостатком этого подхода является то, что сканирование займет больше времени. Каждый раз, когда файл загружается, база данных должна быть загружена, прежде чем можно будет выполнить сканирование. Загрузка БД занимает много ценных минут, если вы хотите получить быстрый ответ для пользователя. Кроме того, при одновременной обработке нескольких загрузок у вас будет несколько потоков, загружающих базу данных, что приведет к еще большему использованию ОЗУ. Отсюда и использование демона. Мое решение состояло в том, чтобы обновить мой сервис VPS и заплатить дополнительные 5 долларов США в месяц за дополнительную оперативную память. Я могу жить с этим увеличением стоимости :)
Нильс Р.
1

Этот ответ не подтвержден и может не работать. Также не объясняется, как уменьшить использование памяти, но как ограничить использование памяти, что немного отличается.


Вы можете отредактировать скрипт инициализации ClamAV (int, /etc/init.d/чтобы добавить команду ulimit -m amountofram.
Это ограничит возможности ClamAV, и вы, вероятно, поменяетесь, что, вероятно, замедлит всю вашу систему.

Kiwy
источник