Linuxにおけるスワップ使用量の管理方法

システムの遅延、重いスワップ使用、またはメモリの不足の問題をLinuxシステムで経験したことがあるかもしれません。一般的なアドバイスは「スワップニess値を減少させること」であり、スワップ使用量を減らすことです。しかし、スワップニessとは何でしょうか?それを調整することは本当に良いことでしょうか?

注意: スワップパーティションについて詳細に説明することはありません。Linuxのスワップパーティションについて知っておくべきことに関する記事を読んでください。

スワップニess

UNIX系システムには、メモリ内のページがどのように処理されるかを決定するスワップニessという値があります。ほとんどのシステムでのデフォルト値は「60」で、0から100の範囲で設定できます。メモリが不足すると、カーネルはいくつかのファイルキャッシュを追い出してプロセス用により多くの空きRAMを確保するか、RAMからディスクにいくつかのプロセスページをスワップします。

デフォルトの60は、スワップが少なく使用され、I/OキャッシュがRAMの再割り当てのために解放される可能性が高いことを意味します。キャッシュを追い出すことは「安価」(リソース集約度が低い)と見なされますが、ページをスワップアウトすることはディスクの読み取りと書き込みを含み、それらを「高価」にします。スワップニessが60の値では、スワップ使用量はキャッシュの再利用よりわずかに低くなります。スワップニessの値が100に増加すると、スワップとファイルキャッシュの追い出しは等しい重みで使用されます。これは、デフォルトよりも多くのスワップと高速なI/Oを意味します。「10」のような低い値は、スワップがはるかに少なく使用され、I/Oキャッシュがプロセスに優先して解放される可能性があります。これにより、インタラクティブ性が向上するかもしれませんが、I/O速度に悪影響を与える可能性があります。

スワップニessの減少

ウェブサイトやフォーラムで「スワップニessを約10に減少させる」ようにというアドバイスが見られることがよくあります。これは、スワップを減らして、より多くのプロセスを物理的RAMに保持することで、全体的な速度を向上させることを目的としています。この論理はやや単純すぎるかもしれず、「すべてに適合する解決策」ではないかもしれません。

スワップニessの値を減少させることが良いシナリオ:

  • データベースシステムの場合、またはデータベース集約的なアプリケーションを多く使用する場合:データベースは一般的にOSよりもファイルキャッシングをうまく処理します。スワップニessを減少させると、OSのファイルキャッシングを制限し、データベースにそのキャッシュを処理させる機会を与えます。
  • インタラクティブ性の場合:マルチタスクを頻繁に行うが、ファイルを処理することは少なかったり、大きなドキュメントを開かない場合、これによりシステムのスムーズさが改善される可能性があります。ディスクに書き出されるプロセスが少なく、RAMアクセスがはるかに速いため、コンピュータがより速く感じられるかもしれません。ただし、これはI/O性能を低下させる可能性があることにも注意する必要があります。遅いディスクを持っている場合やI/O集約的な作業を行っている場合は、パフォーマンスが悪化する可能性すらあります。
  • プラセボ効果の場合:スワップニessが低いとシステムが速くなると信じている人が多いです。真剣に、あなたがシステムが速いと思えば、それが実際に速く感じる効果があるかもしれません。

スワップニessを減乗することが、システムがメモリを解放するためにランダムにクラッシュやプロセスの殺害を引き起こす可能性があることに注意してください。スワップニessを減少させるのは、システムをスムーズに運用するために十分なRAMがある場合に最適です。しかし、「10」以上の値を維持する必要があります。なぜなら、スワップ使用はある程度良いからです。

スワップニessの増加

スワップニessの増加は、一般的にI/Oの速度を向上させる利点があります。あまり推奨されませんが、スワップニessを増加させると便利な場合があります:

  • I/O集約的な操作を行い、古い遅いHDDを持つ場合。例えば:バックアップを取ったり、画像を一括編集することはI/O集約的な作業です(特に例外として、データベースはそれ自体がI/O集約的ですが、上記のように低いスワップニess値が役立つことがあります。)。
  • メモリが少ないが、比較的速いディスクを持つ場合。この非現実的なシナリオでは、スワップニessの高い値がメモリをより効率的に処理するのに役立つかもしれません(ただし、設定を高すぎるとパフォーマンスに悪影響を及ぼす可能性があります)。

スワップニessの管理方法

まず、実際にこの値を変更する必要があるかどうかを考えましょう。パフォーマンスの問題を経験していますか?そして、より重要なことに、他のシステム調整を試みましたか?もしまだ試していないなら、まず他の方法を探ってみるのが最善です。しかし、特定のシナリオを考えている場合は、続ける価値があります。

次に、スワップ使用量はどのくらい重いのでしょうか?お好みのパフォーマンスモニタリングツールやfreeコマンドを使用して調べることができます。free -mは、メモリ使用量のスナップショットをメガバイトで表示します。連続監視を行う場合はwatchを使用すると良いでしょう。

watch -n 1 free -m

これにより、free -mコマンドが毎秒実行され、出力が「Ctrl + C」を押すまで印刷されます。

スワップニess-free-m

上記のように、この記事が記述されているシステムでは非常に少ないスワップが使用されています。

スワップが発生している場合、どれくらいのスワップがアクティブであるかも興味があるかもしれません。vmstatコマンドは、システムの仮想メモリ使用量(スワップと物理RAMを合わせた)に関するすべての情報を提供します。

vmstat 1

スワップニess-vmstat

swap列を確認する必要があります。ここでsiは「スワップイン」を意味し、soは「スワップアウト」を意味します。数字が高い場合、それは多くのスワップ活動を表し、メモリ不足の兆候です。freeによるスワップ使用が見られるが、アクティブなスワップが少なければ、スワップニessの調整が必要かもしれません。

また、ディスクI/O、負荷平均などの他のパフォーマンスベンチマークを設定するのも良いアイデアです。新しいスワップニess値をテストするときに比較するための何かがあります。

異なるスワップニess値をテストするには、sysctlコマンドを使用して一時的に設定できます。再起動する必要はなく、効果は即座に現れます。実際、再起動するとデフォルト値が復元されるので、実験は比較的安全です:

sudo sysctl vm.swappiness=10

もちろん、「10」の代わりに任意の値(「0」と「100」の間)を指定できます。

好みの値が見つかったら、「/etc/sysctl.conf」のシステム設定を恒久的に変更できます。

sudo nano /etc/sysctl.conf

そして、このファイルの最後に以下の行を追加します。

# スワップニess値を設定  
vm.swappiness=10

もちろん、お好みの値に再度設定してください。

結論

スワップニessを「10」に下げることは、しばしばすべてに適合する解決策として推奨されますが、実際のこの技術の使用は、その点で少し複雑かもしれません。ベンチマークを設定し、システムを理解し、どのように使用するか、何が必要かを知ることで、スワップ使用量を微調整し、パフォーマンス(インタラクティブ性またはI/O)を向上させることができます。