Linuxのメモリ「スワップネス」と「キャッシュ動作」のチューニングに関するベストプラクティス
Linuxシステムはメモリを動的に管理し、利用可能なRAMをアプリケーション、ファイルシステムキャッシュ、およびカーネル操作に活用します。この柔軟性は利点である一方で、メモリパラメータの設定が不適切な場合、パフォーマンスのボトルネックにつながる可能性があり、特に不要なスワッピングや非効率なキャッシングによる過剰なディスクI/Oが問題となります。
このガイドでは、Linuxがメモリ負荷をどのように処理するかを決定する2つの重要なカーネルパラメータ、vm.swappinessとvfs_cache_pressureについて掘り下げます。これらの設定を理解し、チューニングすることは、アプリケーションの応答性を最大化し、ディスクアクセスによる遅延を最小限に抑え、安定したサーバーパフォーマンスを確保しようとするシステム管理者にとって不可欠です。
Linuxのメモリ管理パラメータを理解する
Linuxはヒューリスティック(経験則)を使用して、システムがより多くの空きRAMを必要とするときに、どのメモリページを解放するかを決定します。カーネルパラメータによって制御される主要な2つの領域は、スワッピング(非アクティブなメモリページをディスクに移動すること)とキャッシング(ファイルシステムメタデータとデータをRAMに保持すること)です。
1. vm.swappiness
vm.swappinessは、カーネルがプロセスを物理メモリからディスク上のスワップ領域に移動させる傾向を決定します。これは0から100までの値です。
- 高い値(例:60、多くのディストリビューションでのデフォルト):カーネルは非アクティブなページを積極的にスワップアウトします。たとえ十分な空きメモリがある場合でも。これにより、ページキャッシュを大きく保つことが優先されますが、アプリケーションが突然そのメモリを必要とした場合、頻繁な、遅延を引き起こすスワップが発生する可能性があります。
- 低い値(例:10以下):カーネルはプロセスをスワップアウトし始める前に、ページキャッシュからメモリを再利用することを優先します。これにより、実行中のアプリケーションがRAMに長く留まり、応答性が向上しますが、システムが常にキャッシュページを破棄する必要がある場合、ディスクI/Oパフォーマンスが低下する可能性があります。
- 値が0の場合:現代のカーネル(2.6.32以降)では、
swappinessを0に設定すると、絶対に必要な場合(つまり、メモリ不足の状態)になるまでスワッピングを完全に回避しようとします。システムはまずページキャッシュからメモリを再利用することに依存するようになります。
vm.swappinessの実践的な適用
最適な設定はワークロードに大きく依存します。
| ワークロードの種類 | 推奨されるswappiness範囲 |
理由/根拠 |
|---|---|---|
| データベースサーバー、ハイパフォーマンスコンピューティング(HPC) | 1 - 10 | ディスク遅延を避けるため、アクティブなデータベースワーキングセットを物理メモリに常駐させます。 |
| 汎用サーバー、デスクトップ | 30 - 60(デフォルト) | 応答性とディスクキャッシュのニーズのバランスをとります。 |
| 大容量ファイルキャッシュに大きく依存するサーバー(例:ディスクトラフィックの多いWebサーバー) | 60 - 80 | 後続のリクエストをRAMから迅速に提供するために、ディスクキャッシュを大きく保つことを優先します。 |
現在の値を確認する方法:
cat /proc/sys/vm/swappiness
値を一時的に変更する方法(再起動まで):
swappinessを10に設定するには:
sudo sysctl vm.swappiness=10
値を永続的に変更する方法:
/etc/sysctl.confファイルを編集し、次の行を追加または変更します。
# /etc/sysctl.conf
vm.swappiness = 10
保存後、再起動せずに次のコマンドで変更を適用します。
sudo sysctl -p
ベストプラクティスのヒント: データベースなどのメモリ集約型アプリケーションをホストする現代のサーバーでは、
vm.swappinessを1から10の間に設定することが、スワッピングによるパフォーマンス低下を防ぐために通常、最適な出発点です。
2. vfs_cache_pressure
vfs_cache_pressureは、カーネルがディレクトリおよびinodeメタデータ(VFSキャッシュ)に使用されるメモリをどれだけ積極的に再利用するかを制御します。
- この値は0から1000までです。
- デフォルト値は通常100です。
値が100の場合、カーネルはVFSキャッシュメモリの再利用とページキャッシュ(ディスクデータ)が使用するメモリの再利用のバランスをとります。値が100ということは、メモリ負荷があるときに、カーネルはページキャッシュメモリの1部分ごとに、inode/dentryキャッシュメモリの1部分を再利用しようとすることを意味します。
vfs_cache_pressureの調整
- 値を増やす場合(例:100より大きい):カーネルがVFSキャッシュメモリの再利用により積極的になります。これによりRAMはより速く解放されますが、メタデータがディスクから再度読み込まれる必要があるため、その後のファイルシステムルックアップが遅くなる可能性があります。
- 値を減らす場合(例:100より小さい):カーネルがVFSキャッシュの再利用に対してより控えめになります。これにより、ディレクトリおよびinode情報がメモリにより長く保持され、繰り返しのファイルシステム操作が高速化されます。
vfs_cache_pressureを減らすべきとき:
システムが頻繁に同じ大規模なディレクトリ構造にアクセスする場合(複雑なアプリケーション、コンテナオーケストレーション、または特定のネットワーク設定で一般的)、この値を低く設定する(例:50)ことで、メタデータをRAMに常時利用可能に保つことによりパフォーマンスが向上する可能性があります。
vfs_cache_pressureを増やすべきとき:
システムが一般的なメモリ負荷に苦しんでおり、カーネルにあらゆる未使用メモリを迅速に再利用させたい場合、この値を上げることがあります。しかし、これは値を下げるよりも一般的ではありません。
現在の値を確認する方法:
cat /proc/sys/vm/vfs_cache_pressure
値を永続的に変更する方法:
/etc/sysctl.confを編集します。
# /etc/sysctl.conf
vfs_cache_pressure = 50
sudo sysctl -pで変更を適用します。
警告:
vfs_cache_pressureを0に設定すると、カーネルがVFSキャッシュメモリを再利用するのを実質的に無効にします。これはスワッピングに対してvm.swappiness=0を設定するのと同様です。これは、潤沢なRAMがあり、絶対的な最大ファイルシステムパフォーマンスを必要とするシステムでのみ行うべきです。
包括的なチューニングシナリオ
これらのパラメータの適切な組み合わせを選択することで、アプリケーションの安定性とファイルシステムキャッシング間のトレードオフが最適化されます。
シナリオ1:データベースサーバー(メモリ優先)
目標:アプリケーションのメモリ常駐性を最大化し、いかなる犠牲を払ってもスワッピングを最小化する。
vm.swappiness = 5vfs_cache_pressure = 50(ディレクトリデータをある程度キャッシュに保持しつつ、RAMが逼迫した場合は、VFSメタデータよりもアプリケーションメモリを優先する。)
シナリオ2:高ディスクI/Oサーバー(キャッシング優先)
目標:ディスクパフォーマンスを最大化するために、頻繁にアクセスされるファイルデータをページキャッシュに保持する。
vm.swappiness = 80(ディスクキャッシュ拡張のためにRAMを解放するために、より早くスワッピングを発生させることを許可する。)vfs_cache_pressure = 100(inodeとページキャッシュ間の標準的なバランス。)
シナリオ3:仮想化ホストまたは汎用システム
目標:複数のワークロードにわたる安定したパフォーマンス。
vm.swappiness = 30(適度な設定で、デフォルトの60よりもアクティブなVM/プロセスをRAMにわずかに長く保持することを優先しますが、依然として制御されたスワッピングを許可します。)vfs_cache_pressure = 100(デフォルトで十分な場合が多い。)
監視と検証
変更を適用した後、影響を検証するために継続的な監視が不可欠です。free、vmstat、システムパフォーマンス監視ダッシュボードなどのツールを使用します。
vmstatの使用:
si(スワップイン)とso(スワップアウト)の列を監視します。swappinessが低い正常なシステムは、通常負荷下でsiとsoの値が低いかゼロを示すはずです。
vmstat 5 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----\ r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 123456 102400 5123456 0 0 0 5 40 70 1 1 98 0 0
swappinessを減らしてもsoの値が高いままである場合、それは物理RAMがワークロードに対して真に不足していることを示しており、RAMの増設が唯一の永続的な解決策です。
結論
vm.swappinessとvfs_cache_pressureのチューニングは、Linuxのパフォーマンス最適化における基本的なテクニックです。メモリに敏感なアプリケーションに対してswappinessを控えめに減らす(例:10に)ことで、重要なプロセスが物理RAMに常駐することを保証します。同時に、vfs_cache_pressureを細かく調整することで、管理者はカーネルがファイルシステムメタデータをメモリに保存するか、アプリケーションデータを保存するかの優先順位を決定できます。望ましいパフォーマンス向上を確認するために、常に現実的な負荷条件下で変更をテストしてください。