はじめに
ClamAV を低スペックのEC2インスタンスにインストールして利用しようとした際に問題が発生したため、メモとしてまとめておきます。
今回の対象サーバーのスペックは以下の通りです。
- OS: Amazon Linux 2023
- インスタンスタイプ: t3a.small
- ボリューム: 10GB(gp3)
- スワップ: なし
問題
単純に clamscan を実行すると、サーバーがビジー状態になり(ほとんど)反応しなくなります。
CloudWatch で調査したところ、ビジー状態のディスクのアイドル時間が 0% になっていることが分かりました。
top コマンドで実行中の状況を確認したところ、空きメモリが大きく減少し、kswapd0 がプロセス一覧の上位に上がってきていることを確認しました。 これはメモリ不足の症状です。
こうなると、メモリ上のページキャッシュが強制的に破棄されることになります。 すると、バックグラウンドのプロセスが頻繁にディスクアクセスするようになり、I/O がビジー状態になります。
その結果、サーバー全体がほぼ稼働できないような状態のループに入ってしまい、反応が極端に遅くなります。
ClamAV が必要とするメモリ量
調べたところ、ClamAV はスキャンの際に 約 1.5GB のメモリを必要とすることが分かりました。
実際に top を確認した際の値は以下の通りで、VIRT(仮想メモリ総量)が約 1.6GB、RES(実際に使用している物理メモリ)が約 1.2GB となっており、小規模インスタンスにとっては非常に重い処理であることがわかります。
top - 00:19:34 up 26 min, 3 users, load average: 1.05, 0.89, 0.53
Tasks: 122 total, 2 running, 120 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.5 us, 2.0 sy, 40.2 ni, 49.1 id, 2.5 wa, 0.0 hi, 0.0 si, 5.7 st
MiB Mem : 1907.3 total, 99.8 free, 1579.8 used, 227.7 buff/cache
MiB Swap: 2048.0 total, 1809.7 free, 238.2 used. 175.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4726 root 39 19 1672444 1.2g 4596 R 84.7 66.2 7:17.22 clamscan
- 補足: I/O ビジーによるフリーズを繰り返したため、この clamscan の実行時にはプロセスの優先度を下げて実行しています。 しかし、メモリが足りない状態だと優先度を下げても挙動は変わりませんでした
解決方法
この問題を根本的に解決するには、利用可能なメモリを増やす必要があります。具体的な対策としては以下のいずれかになります。
それぞれ一長一短があるので、自分のケースにあった方法を選択してください。
1. インスタンスタイプを一時的に変更する
スキャン実行時だけ t3a.small(2GB)→ t3a.medium(4GB)に変更し、スキャン後に戻します。
以下のメリットがありますが、一時的なサーバーダウンと定期実行のための自動化が別途必要です。
- メモリ不足を確実に解消
- ディスク I/O の逼迫がほぼ解消
- 数時間だけ medium の料金が加算されるだけで、追加コストは最小
2. swap を追加する
Amazon Linux 2023 はデフォルトで swap が無いため、自分で作成する必要があります。
具体的な手順は以下の記事を参照下さい。
今回は t3a.small(メモリ2GB)に 2GB の swap を追加したところ、I/O ビジーが収まり、clamscan が正常に動作するようになりました。
ただし、swap は物理メモリに比べて低速なため、スキャン時間は長くなります。
参考