空きメモリが十分残っているのに、なぜスワップが使用されるのでしょうか?

空きメモリが十分残っているのに、なぜスワップが使用されるのでしょうか?

十分なメモリ リソースを備えた、かなり優れた Web (専用) サーバーを所有しています。

System information
Server load     2.19 (8 CPUs)   
Memory Used     29.53% (4,804,144 of 16,267,652)    
Swap Used   10.52% (220,612 of 2,097,136)   

ご覧のとおり、十分な空きメモリがあるときにサーバーはスワップを使用しています。

これは正常なのでしょうか、それとも設定またはコーディングに何か問題があるのでしょうか?

注意:
何らかの理由で、MySQL プロセスが CPU パワーの 160% 以上を使用しています。理由はわかりませんが、同時ユーザー数は 70 人を超えていません...

答え1

これは全く正常なことです。

システムの起動時に、いくつかのサービスが起動します。これらのサービスは、初期化、構成ファイルの読み込み、データ構造の作成などを行います。これらのサービスはメモリを使用します。これらのサービスの多くは、使用されていないため、システムの起動中は再び実行されることはありません。一部のサービスは、数時間、数日、または数週間実行される場合があります。しかし、このデータはすべて物理メモリ内にあります。

もちろん、システムはこのデータを捨てることはできません。文字通りアクセスされないことを証明することはできません。たとえば、これらのサービスのうちの 1 つは、ボックスへのリモート アクセスを提供するサービスである可能性があります。1 週間使用していないかもしれませんが、使用する場合は正常に機能している必要があります。

しかし、システムは、その物理メモリをディスク キャッシュなど、パフォーマンスを向上させる他の用途に使用する必要があることを認識しています。そのため、システムは便宜的スワッピングを実行します。他にやることがない場合、スワップ領域を使用して、長い間使用されていないデータをディスクに書き込みます。ただし、ページは物理メモリ内に保持されます。そのため、スワップインしなくても、ページにアクセスすることができます。

これで、システムが後でその物理メモリを他の用途に必要とする場合、それらのページはすでにスワップに書き込まれているため、単に破棄できます。これにより、システムは両方の利点を享受できます。データはメモリ内に保持されたままなので、ディスクから読み取らなくてもアクセスできます。しかし、システムが別の用途にそのメモリを必要とする場合、最初に書き出す必要はありません。これは、すべての面で大きなメリットです。

答え2

これは、過去のある時点で、マシンの物理 RAM よりも多くのメモリが必要になった場合に発生する可能性があります。その時点で、一部のデータがスワップ領域に書き込まれます。

後でメモリが解放されても、スワップのデータは自動的に RAM に読み戻されません。これは、スワップのデータが実際に何らかのプロセスで必要な場合にのみ発生します。これは完全に正常な動作です。

MySQL プロセスについては、実行するクエリの種類によって異なります。理論上は、ユーザー数に関係なく、非常に複雑なクエリ 2 つでこのような負荷が発生する可能性があります。低速クエリ ログを有効にすると、負荷が集中するクエリについてより詳しく把握できます。

答え3

この動作は によって変更することもできますsysctl -w vm.swappiness=10。これにより、実際に必要になるまで swap の使用が大幅に削減されます。

MySQLに関しては、少なくともベースライン構成テストを実行しましたか?チューニングプライマー.sh脚本?

答え4

これはおそらく、Davidが説明したように、Linuxカーネルの通常の動作ですが、MySQL の「スワップ狂気」問題あなたの場合 (CPU 8 個、合計 16 GB RAM、使用容量 5 GB)、これを実現するには、コンピューターが 4 つのノード (ソケット) とノードあたり 4 GB の RAM、および 4 GB の MySQL InnoDB バッファー プールを備えた NUMA システムである必要があります。

簡単に言うと(詳細については上記のリンクを読んでください)、次のようなことが起こります。

  1. システムが起動すると、プロセスはメモリの一部を使用してすべての NUMA ノードに分散されます。
  2. MySQL が起動すると、InnoDB バッファ プールに 4 GB が割り当てられ、NUMA ノードの RAM がいっぱいになり、他のノードの RAM も一部使用されます。
  3. 次に、割り当てられた RAM を 1 つの NUMA ノードから別の NUMA ノードに移動できない Linux カーネルは、不足しているノードからページをスワップアウトするのがよいアイデアであると考えます (または、ページをスワップインする必要があったため、ページをスワップアウトする必要があります)。

これを回避するには、MySQL のメモリ割り当てを変更して、すべてのコアに RAM を割り当てます (詳細については上記のリンクを参照してください)。

関連情報