質問: swappinessがデフォルトで60に設定されているのはなぜですか? linuxでのスワップについていくつか読んだだけです。デフォルトが60に設定されている理由がわかりません。私によると、スワップを減らすために、このパラメーターは10に設定する必要があります。スワップは私のハードドライブにあるので、私のメモリよりもはるかに遅いです。なぜ彼らはそのようにカーネルを構成したのですか?
回答: カーネル2.6.28以降、linuxは split least recently used (lru)ページ置換戦略を使用しています。プログラムテキストや共有ライブラリなどのファイルシステムソースを含むページは、ファイルキャッシュに属します。ファイルシステムバッキングのないページは匿名ページと呼ばれ、アプリケーション用に予約されたスタックスペースなどの実行時データで構成されます。通常、ファイルキャッシュに属するページは、メモリから削除する方が安価です(必要なときにディスクから簡単に読み戻すことができるため)。 。匿名ページにはファイルシステムのバッキングがないため、それらを格納するためのスワップ領域がない限り、プログラムが必要とする限り、ページはメモリに残っている必要があります。 スワップパーティション が何らかの理由でシステムの速度を低下させることはよくある誤解です。スワップパーティションがないことは、カーネルがメモリからページを削除しないことを意味するのではなく、削除するページに関してカーネルが選択できる選択肢が少ないことを意味します。利用可能なスワップの量は、それが使用される量に影響を与えません。デフォルトでは、カーネルメモリアカウンティングポリシーは overcommit memory であるため、linuxはスワップスペースの欠如に対処できます。欠点は、物理メモリが使い果たされ、カーネルが匿名ページをディスクにスワップできない場合、 out-of-memory-killer (oom-killer)メカニズムがメモリを浪費する「悪党」を殺し始めることです"他のプロセスのためにメモリを解放するプロセス。 vm.swappiness オプションは、匿名ページを優先してファイルキャッシュページをスワップアウトする間のバランスを変更する修飾子です。ファイルキャッシュには200の任意の優先度値が与えられ、そこからvm.swappiness修飾子が差し引かれます(file_prio=200-vm.swappiness)。匿名ページは、デフォルトでは60(anon_prio=vm.swappiness)で始まります。つまり、デフォルトでは、優先順位の重みは、匿名ページ(anon_prio=60、file_prio=200-60=140)を優先して適度に高くなります。この動作は、カーネルソースツリーのmm/vmscan.cで定義されています。vm.swappinessが100の場合、優先度は(file_prio=200-100=100、anon_prio=100)になります。これは、ファイルキャッシュからのページが匿名ページを優先して追い出されることが望まれない場合、i/o負荷の高いシステムにとって意味があります。逆にvm.swappinessを0に設定すると、カーネルが匿名ページを追い出し、ファイルキャッシュのページを優先します。これは、一部のデータベースの場合のように、プログラムがキャッシュの大部分を自分で行う場合に役立ちます。デスクトップシステムでは、これにより対話性が向上する可能性がありますが、i/oパフォーマンスが低下する可能性があるという欠点があります。デフォルト値は、これら2つの極端な値の間の近似的な中間値として選択されている可能性が高いです。他のパフォーマンスパラメータと同様に、vm.swappinessの調整は、単なる直感ではなく、実際のワークロードに匹敵するベンチマークデータに基づいている必要があります。