スワップのないコンピューターでkswapd0が実行されているのはなぜですか?


21

〜14GのRAMを搭載したスワップなしのクラウドサーバーがあります。ただし、を実行すると、kswapd0がCPUを占有することがありますtop。管理するためのスワップスペースがない場合、kswapd0が実行されているのはなぜですか?

回答:


8

スワップがあるかどうかを確認するプロセスがまだあります。それを減らすには、スワップ性を設定する必要があります-

ルートとして「/etc/sysctl.conf」を編集し、変更(または追加)します

vm.swappiness = 0

3
わかりましたが、CPUの1%を使用しているのはなぜですか?
portforwardpodcast

2
場合はkswapd0任意のCPUを取っているし、あなたはスワップを持っていない、システムがほぼRAMの外にあると(実際には)実行ファイルからページをスワップすることにより、状況に対処しようとしています。正しい修正方法は、ワークロードの削減、スワップの追加、または(できれば)RAMの追加インストールです。スワップを追加すると、カーネルがディスクに何をスワップするかについてのオプションが増えるため、パフォーマンスが向上します。スワップを使用しない場合、カーネルは実際にアプリケーションコードのスワップを強制されます。
ミッコランタライネン

スワップを有効にしkswapd0ていて、CPUを使用していて、それが望ましくない場合は、swappiness設定を下げます。ただし、スワップが書き​​込み(たとえば、ウェアレベリングアルゴリズムの不良)に苦しんでいるSSDに支えられていない限り、これを下げるとswappinessシステム全体のパフォーマンスが低下します。より多くのRAMが必要な場合に備えて、RAMのコピーをスワップに保持するという考え方です。その場合、RAMを使用する前にスワップを開始する代わりに、RAMのコピーがすぐに破棄されます。この楽観的なスワッピングは、システムが十分にアイドル状態のときにのみ実行されるため、システムの速度が低下することはありません。
ミッコランタライネン

26

スワップ領域は、他のファイルにバッキングされていないデータにのみ使用されます。ディスク上の他のファイル(実行可能プログラムなど)からマップされたデータは、スワップデバイスがない場合でも、それぞれのファイルにスワップされます。


9
たとえば、スワップがゼロで、システムのRAMがほぼ不足している場合を考えます。カーネルは、たとえばFirefoxからメモリを取得します(Firefoxはディスクからロードされた実行可能コードを実行しているため、これを行うことができます-コードは必要に応じてディスクから再度ロードできます)。FirefoxがそのRAMにN秒後に再びアクセスする必要がある場合、CPUはLinuxにRAMを解放する(たとえば、別のプロセスからRAMを取得する)「ハードフォールト」を生成し、ディスクから欠落しているデータを読み込み、Firefoxがいつも。これは通常のスワッピングとかなり似ており、kswapd0がそれを行います。
ミッコランタライネン

4

Linuxがメモリを使い果たすと、本来行うべきことをする代わりにスワップループに入り、RAMを解放するためにプロセスを強制終了することがよく知られている問題です。これを行うOOM(メモリ不足)キラーがありますが、これはスワップとRAMがいっぱいの場合のみです。

ただし、これは実際には問題になりません。FirefoxやChromeなど、メモリを使用しているタブとタブを使用しているメモリなどの問題のあるプロセスが多数ある場合、これらのプロセスはスワップのリードバックを引き起こします。次にLinuxは、同じメモリがメモリとハードドライブの間で前後に移動されるループに入ります。これにより、優先度の逆転が発生し、いくつかのプロセスを前後にスワップするとシステムが応答しなくなります。

スワップを無効にすると、kswapd0には実行可能ファイルなどのマップされたメモリをスワップアウトするオプションがないため、この問題が悪化します。実行可能ファイルをスワップアウトすると、かなり早く再びスワップインされる可能性が高くなります。

私はテストのためにNetBSDでこの動作をトリガーしようとしましたが、そこで起こったことは、OS自体が非常に敏感であったのに、問題のプロセスが非常に遅くなったことです。スワッピング問題は発生しますが、優先順位の逆転はありません。ただし、NetBSDにはAMDGPUドライバーがないため、当面はLinuxにこだわります。おそらくNetBSDは実行可能ファイルをメモリマップしないので、スワップループに入らないのはなぜでしょうか。

Facebookにもこの問題があり、Out Of Memory DaemonであるOOMDを作成しました。これは、kswapd0アクティビティを検出し、プロセスの強制終了を開始するデーモンです。Facebookによると、これによりLinuxサーバーが応答しなくなるという問題はほぼ完全に解消されました。しかし、私はそれをテストしておらず、他のサーバーやデスクトップ/ラップトップでどれだけうまく機能するかわかりません。魅力的なことに、OOMDには、システムプロセスとサーバーシステムの一部を保存するために最初にどのプロセスを強制終了するかを決定するロジックがあります。

ただし、これは解決方法ではありません。OOMDはいハックです。実際の解決策は、スワップループが引き起こす優先順位の逆転を修正するとともに、メモリを解放するプロセスを強制終了するカーネルOOM Killerをより積極的にすることです。修正はカーネルに属します。これは問題が時間内に検出され、プロセスが適切に強制終了されていることを確認できる唯一の場所だからです。

swappiness = 0の設定は、システムが空きRAMを使い果たすと、何があってもスワップを開始するため、解決策ではありません。システムがスワッピングを開始しないことを保証するオプションはありません。

また、問題のあるアプリケーションを修正することも修正ではありません。ユーザーが意図的にOSを応答不能にするためにこのバグを悪用したい場合は特にそうではありません。応答することはカーネルの責任です。Firefoxが応答しない場合、修正はアプリケーションにあります。ただし、それ自体が応答しなくなるだけでなく、OS全体が非常に遅くなり、応答しなくなります。SSHにログインするのに30分かかるレベルまで。SSHは何の関係もありません。SSHが実行されない場合は、システムの他の部分ではなく、カーネルのバグです。そして、それはバグではなく、2つのバグです。バグの1つは優先順位の反転で、レール交換サイクルが問題のプロセス以外のプロセスと干渉することが許可されており、それ自体が悪いです。もう1つのバグは、tスワップループ内にあり、HDD / SSDまたはスワップをバッキングしているストレージで異常な摩耗が発生していることを検出します。実行可能ファイルをスワップするとき、ディスクに書き戻されない読み取り専用メモリマップですが、kswapd0はメモリから削除しているものを読み取りながらロックされます。

ああ、3番目のバグがあります。メモリを大量に消費するアプリケーションが使用可能なメモリをすべて飲み込んだときに、ディスクCACHEが食べられないように保護する方法がないという事実。これは、kswapd0がシステムを応答不能にする理由の1つです。最もホットなメモリマッピングデータは通常ディスクキャッシュに格納されますが、Firefoxがそのキャッシュを使い果たすと、明らかにディスクの読み取りが発生することを意味します。

問題の原因は必ずしもFirefoxではありませんが、Chromeではなくデフォルトのブラウザです。そして、両方とも、Linuxで「使用可能なメモリ」としてカウントされるキャッシュメモリやスワップメモリ​​など、使用可能なメモリを無駄なものとして扱うため、この問題を引き起こすことが広く知られています。そのため、「使用可能なメモリ」を無駄にしないために、キャッシングなどに使用します。明らかに、DISK CACHEにSWAPを使用するのは非常に悪い考えですが、FirefoxとChromeの両方の仲間は「空きメモリはメモリを浪費します」とそれに応えます。

したがって、ここにあるのは、カーネルチームがバグを考慮していないように見える3つのカーネルバグです。また、Firefox、Chrome、およびバグと見なされないすべての派生物のバグ。この問題を調査し、おそらくパッチを当てるために、FedoraラップトップでFirefoxをビルドしてみました。何だと思う。4GB RAMを搭載した4コアCPUでGCCを使用してFirefoxを構築すると、優先度反転を含むスワップループがトリガーされます。したがって、書き換える必要があるアプリケーションの1つはGCCです。NetBSDでは、GCCの4つの実行中のインスタンスが1つのインスタンスの実行よりも遅くなりますが、システムがフリーズすることはありません。

ええ、これはちょっとした暴言ですが、Linuxメモリサブシステムとそれを引き起こすアプリケーションの現在の問題を明らかにすることを願っています。


1

スワップがなくkswapd0実行中の場合、システムは実際にその時点でほぼすべてのRAMを使用しています。メモリ使用量(またはシステム内の空き/使用可能メモリ)を監視するためのより良いツールを入手する時が来ました。

実際の修正は、メモリ使用量を減らす(メモリリークの少ないプロセスを実行する、実行するプロセスを減らす、一部のプロセスの実行をスキップする、一部のサーバーソフトウェアの子/ワーカープロセスの数を制限する)か、RAMを増やすことです。RAMの必要性がメモリリークに起因する場合、代わりにスワップを使用することを選択できます。Linuxは、十分な時間を与えられて、リークされた部品を交換するためにかなり賢くなければなりません。スワップを持つことは何もしないよりはましですが、それは十分な量のRAMを持っていることの本当の代替ではありません。


こことコメントには良い情報がありますが、スワップを有効にすることは、利用可能なメモリ(RAM +スワップ)がすべて満たされるという制限の解決策ではありません。すべてのメモリが最終的にいっぱいになることは避けられないため、メモリリークの場合には特に悪い解決策です。swap + ramがいっぱいの場合の結果は、ramがいっぱいでスワップが無効の場合と同じです。
コードブリン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.