Linux

如何減少 ClamAV 記憶體使用量?

  • November 20, 2019

我在 512MB VPS 上執行基於 Ubuntu 的 Web 伺服器(Apache、MySQL)。這對於它正在執行的網站(小型論壇)來說已經綽綽有餘了。

因為我想添加一些針對病毒的保護,所以我安裝了 ClamAV 並使用它來掃描上傳的文件,作為上傳處理腳本 (PHP) 的一部分。

我正在執行 clamav-daemon 服務,因此不必在每次掃描文件時都載入定義。這種做法的一個缺點似乎是 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

編輯:我看到有人建議設置駐留集大小。如果此操作成功,則駐留集大小小於工作集大小將導致程序往返交換。這將大大降低整個系統的性能。在任何情況下,setrlimit(RLIMIT_RSS, …) 的 Linux 手冊頁都說不再支持設置駐留集大小,並且對選擇不呼叫 madvise(MADV_WILLNEED, …) 的程序沒有任何影響。

引用自:https://unix.stackexchange.com/questions/114709