web-dev-qa-db-ja.com

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

私は良いメモリリソースを備えたかなり良いウェブ(専用)サーバーを持っています:

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)   

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

これは正常ですか、それとも構成やコーディングに問題がありますか?

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

36
user1179459

これは完全に正常です。

システムの起動時に、いくつかのサービスが開始されます。これらのサービスは、サービス自体の初期化、構成ファイルの読み取り、データ構造の作成などを行います。彼らはいくつかのメモリを使用します。これらのサービスの多くは、使用していないため、システムが稼働している間は二度と実行されません。それらのいくつかは、数時間、数日、または数週間で実行される場合があります。しかし、このデータはすべて物理メモリにあります。

もちろん、システムはこのデータを破棄することはできません。文字通り決してアクセスされないことを証明することはできません。たとえば、これらのサービスの1つは、ボックスへのリモートアクセスを提供するサービスです。あなたは一週間でそれを使用しなかったかもしれませんが、それを使用する場合、それはより良い仕事をしました。

しかし、システムは、その物理メモリをディスクキャッシュのようなものに使用したり、パフォーマンスを向上させる他の方法で使用したりすることを知っています。つまり、日和見スワッピングを行います。何もすることがない場合は、非常に長い間使用されていないデータをスワップ領域を使用してディスクに書き込みます。ただし、ページは物理メモリに保持されます。そのため、スワップインせずにアクセスできます。

さて、システムが後で何かのためにその物理メモリを必要とする場合、すでにスワップするようにページを書き込んでいるので、それらのページを単に捨てることができます。これは、システムに両方の世界の最高のものを与えます。データは引き続きメモリに保持されるため、ディスクから読み取ることなくアクセスできます。しかし、システムが別の目的でそのメモリを必要とする場合、最初にそれを書き出す必要はありません。すべてで大勝利。

62
David Schwartz

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

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

Mysqlプロセスについては、これはすべて、実行するクエリのタイプによって異なります。理論的には、ユーザー数に関係なく、2つの非常に複雑なクエリでこのような負荷を十分に満たすことができます。スロークエリログを有効にして、どのクエリが負荷集中であるかについてより深い洞察を得ることができます。

6
brain99

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

MySQLについては、少なくとも tuning-primer.sh スクリプトを使用してベースライン構成テストを実行しましたか?

3
Daemon of Chaos

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

要するに(完全な詳細については上のリンクを読むべきです)、これは何が起こるかです:

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

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

1
jfg956