UbuntuベースのWebサーバー(Apache、MySQL)を512MB VPSで実行しています。これは、実行中のWebサイト(小さなフォーラム)には十分すぎるほどです。
ウイルスに対する保護を追加したかったので、ClamAVをインストールし、それを使用してアップロード処理スクリプト(PHP)の一部としてアップロードされたファイルをスキャンしました。
Clamav-daemonサービスを実行しているので、ファイルをスキャンするたびに定義をロードする必要はありません。この方法の欠点の1つは、clamav-daemonサービスが使用する「巨大な」メモリ量(> 200 MB)であるようです。これにより、サービスは強制的に停止され、アップロードは拒否されました。
VPSのメモリを1024MBにアップグレードするだけですが、ClamAVのメモリ使用量を削減する方法があるかどうか知りたいです。不要な定義を読み込まない。
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
編集:私は誰かが常駐セットサイズを設定することを提案するのを見ます。これが成功した場合、常駐セットのサイズがワーキングセットのサイズよりも小さくなると、プロセスがスワップとの間でスラッシングすることになります。これにより、システム全体のパフォーマンスが大幅に低下します。いずれにせよ、Linuxのsetrlimit(RLIMIT_RSS、...)のマニュアルページには、常駐セットサイズの設定はサポートされなくなったため、madvise(MADV_WILLNEED、...)を呼び出さないことを選択したプロセスには影響を与えなかったと記載されています。
小さな家でclamdを実行する同様の問題に遭遇しましたNAS 512MBのボックス。ネット全体の質問の調査から、メモリ使用量を削減する方法はないようです厄介なもののデータベースはどんどん大きくなっています。
「clamav-daemon」ではなく「clamav」をインストールすることにより、非デーモンモードで実行するようにclamavを構成できます。これにより、ほとんどの場合、より多くのメモリを確保できます。アップロードをスキャンするときは、常に大量のRAMが必要になります。