ClamAV は、従来の文字列 (Boyer Moore) および正規表現 (Aho Corasick) アルゴリズムを使用して検索文字列を保持します。 1970 年代のアルゴリズムであるため、メモリ効率が非常に優れています。
問題は、膨大な数のウイルス シグネチャです。これにより、アルゴリズムのデータ構造が非常に大きくなります。
これらのデータ構造をスワップに送信することはできません。アルゴリズムのデータ構造には、他の部分よりも頻繁にアクセスされる部分がないためです。それらのページに強制的にディスクをスワップさせた場合、それらはすぐに参照され、すぐにスワップインされます。 ".)
コマンドラインからスキャンする場合、またはデーモンからスキャンする場合、データ構造が必要です。
送信されるウイルスを選択できないため、ウイルス シグネチャの一部だけを使用することはできません。したがって、どのシグネチャが必要かがわからないためです。
これは、Debian Wheezy を実行している 32 ビット マシンで使用されているメモリで、clamd です。
# ps_mem.py
Private + Shared = RAM used Program
281.7 MiB + 422.5 KiB = 282.1 MiB clamd
編集:常駐セットのサイズを設定することを誰かが提案しているようです。これが成功した場合、常駐セットのサイズがワーキング セットのサイズよりも小さいと、スワップとの間でプロセスのスラッシングが発生します。これにより、システム全体のパフォーマンスが大幅に低下します。いずれにせよ、setrlimit(RLIMIT_RSS, ...) の Linux マニュアル ページには、常駐セット サイズの設定はサポートされなくなり、madvise(MADV_WILLNEED, ...) を呼び出さないことを選択したプロセスにはまったく影響がないと書かれています。
この回答は検証されておらず、機能しない可能性があります。また、メモリ使用量を減らす方法についても回答していませんが、メモリ使用量を制限する方法については少し異なります。
ClamAV init スクリプトを編集できます (int/etc/init.d/
コマンド ulimit -m amountofram
を追加するには . これは ClamAV の可能性を制限し、システム全体の速度を低下させるスワップを行う可能性があります。
わずか 512MB の小さな家庭用 NAS ボックスで clamd を実行すると、同様の問題が発生しました。ネット全体の質問の調査から、メモリ使用量を減らす方法はないようです。厄介なもののデータベースはどんどん大きくなっています.
「clamav-daemon」ではなく「clamav」をインストールすることで、clamav を非デーモン モードで実行するように設定できます。これにより、ほとんどの場合、より多くのメモリを使用できるようになります。アップロードをスキャンすると、常に大量の RAM が必要になります。