Reduce Memory and CPU consumption of ClamAV

CGroup による ClamAV の CPU とメモリの抑制を試してみた。

サーバー環境

CentOS Linux release 7.9
Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
CPU(s):2
コアあたりのスレッド数:1
ソケットあたりのコア数:2
MemTotal:3.8GB

改善前は、他のサービスと合わせてほぼCPUもメモリも稼働率100%の状況でした。

調査したところ ClamAV 稼働負荷で他のサービスが影響を受けているので改善を図ることにした。

CGroup 編

コントロールグループ (CGroup) は、CPU 時間、システムメモリー、ネットワーク帯域幅などのリソースを管理できる。

CGroup のインストール

# yum -y install libcgroup libcgroup-tools

CGroup の設定(CPU 60% のグループ作成)

コントロールグループの作成

構文:
cgcreate -t uid:gid -a uid:gid -g subsystems:path

-t は、オプションです。ユーザーIDとグループIDを指定して tasks 疑似ファイルを所有する場合です。
-a は、オプションです。ユーザーIDとグループIDを指定して tasks 以外の全疑似ファイルを所有する場合です。

今回は、サブシステムと階層(/limit_cpu_mem_clamd)を作成します。

# cgcreate -g cpu,memory:/limit_cpu_mem_clamd

注意事項:
CGroup は、コマンドで管理する方法、設定ファイルで管理する方法など用途に応じて使い分ける。
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/resource_management_guide/ch01

cgconfig サービス

cgconfig.conf は、cgconfig サービスを使用する場合の設定ファイルです。

# vi /etc/cgconfig.conf

# 以下を追記
group limit_cpu_mem_clamd {
    cpu {
        cpu.cfs_quota_us = 600000;
        cpu.cfs_period_us = 1000000;
    }
    memory {
        memory.limit_in_bytes = 512M;
        memory.memsw.limit_in_bytes = 1G;
    }
}

clamg 先に作成したグループ名(グループ名は、なんでもよい)。

cpu.cfs_period_us は、マイクロ秒なので 1000000 の値を設定する。

cpu.cfs_quota_us は、割り当てられる値なので 60% 以内(2コアの場合、30%となる)にする場合、600000 の値を設定する。

cpu.cfs_quota_us は、個々の環境によって調整する。

memory.limit_in_bytes = 512M; は、RAM の上限値

memory.memsw.limit_in_bytes = 1G; は、SWAP の上限値

cgconfig サービスの起動

# systemctl enable cgconfig

# systemctl start cgconfig

実装例

引用:「CentOSで自宅サーバー構築」さんのアンチウイルスソフト導入(Clam AntiVirus)を参考(感謝)に実装してみる。

ウイルススキャン日次実行スクリプトを変更してみる。

/bin/cgexec -g cpu:limit_cpu_mem_clamd を追記する。

# vi /etc/cron.daily/clamdscan

-clamdscan -c ${CONFIG} --move=${QUARANTINEDIR} / > ${CLAMSCANLOG} 2>&1
+/bin/cgexec -g cpu:limit_cpu_mem_clamd clamdscan -c ${CONFIG} --move=${QUARANTINEDIR} / > ${CLAMSCANLOG} 2>&1

# systemctl restart clamd@scan

ウイルススキャンコマンドでも

# /bin/cgexec -g cpu:limit_cpu_mem_clamd clamdscan -c /etc/clamd.d/scan.conf --remove
/root: OK

----------- SCAN SUMMARY -----------
Infected files: 0
Time: 78.313 sec (1 m 18 s)
Start Date: 2021:05:30 16:18:27
End Date:   2021:05:30 16:19:45

通常より時間は、かかるが正常に動作する。

引数 –sticky に PID(プロセスID)を渡して実行することも可能です。
cgexec -g cpu:limit_cpu_mem_clamd –sticky PID

プロセスを設定する。
cgclassify -g cpu:limit_cpu_mem_clamd PID

cgred サービス

vi /etc/cgrules.conf

clamscan          cpu,memory       /limit_cpu_mem_clamd

systemctl enable cgred
systemctl start cgred

実行後、CPU、メモリの使用率を確認する。

Was this helpful?

1 / 0

コメントを残す 0

Your email address will not be published.