Linuxサーバー運用中にメモリのキャッシュ領域が過度に消費され、サービスに影響を及ぼす場合があります。ここでは、メモリ状況の確認方法と、各種キャッシュを解放する具体的な手順について解説します。
メモリ使用状況の確認
現在のメモリの使用状況を確認するには、freeコマンドを使用します。-hオプションを付けると、人間が読みやすい単位(GiB、MiBなど)で表示されます。
$ free -h
total used free shared buff/cache available
Mem: 15Gi 4.0Gi 10Gi 2.0Mi 414Mi 10Gi
Swap: 0B 0B 0B
出力項目のbuff/cacheは、バッファとページキャッシュの合計を示しており、この値が大きい場合、キャッシュが多くのメモリを占有していることを意味します。
ディスクキャッシュの解放
キャッシュを解放する操作はroot権限が必要です。実行前に、データ損失を防ぐためsyncコマンドを実行し、ファイルシステムバッファの内容をディスクに書き込んでください。
sync
その後、/proc/sys/vm/drop_cachesへ値を書き込むことでキャッシュをクリアします。値によって解放する対象が異なります。
- ページキャッシュの解放: 値として
1を指定します。 - スラブオブジェクト(dentries、inodes)の解放: 値として
2を指定します。 - 全てのキャッシュを解放: 値として
3を指定します(ページキャッシュとスラブオブジェクトの両方)。
以下は、全てのキャッシュを解放するコマンド例です。
# echo 3 > /proc/sys/vm/drop_caches
# または sysctl -w vm.drop_caches=3
スワップ領域のクリア
スワップ領域に退避されたデータをメモリに戻し、スワップをクリアするには、スワップ機能を一度無効化してから再度有効化します。
sudo swapoff -a
sudo swapon -a
DNSキャッシュのクリア
DNSキャッシュのクリア方法は、システムで使用しているDNSリゾルバやサービスによって異なります。
- systemd-resolvedを使用している場合:
以下のコマンドでキャッシュをフラッシュできます。sudo systemd-resolve --flush-caches - dnsmasqを使用している場合:
サービスを再起動することでキャッシュがクリアされます。sudo systemctl restart dnsmasq
なお、キャッシュの解放は一時的にパフォーマンスを低下させる可能性があるため、トラブルシューティング等の必要な場合にのみ実行することを推奨します。
キャッシュ解放の自動化
定期的にキャッシュを解放したい場合は、cronジョブを利用して自動化できます。以下の設定は、毎日深夜2時にページキャッシュを解放する例です。
0 2 * * * root /usr/bin/sync && echo 1 > /proc/sys/vm/drop_caches