2009-04-20 15 views
31

VirtualBoxプロセスがハングアップしていましたが、kill(-KILL/-ABORT)を試みましたが、成功しませんでした。親PIDは1(init)です。Linuxで 'uninterruptible'プロセスを停止するには?

topは、プロセスをDとして示しており、「中断されないスリープ」と記載されています。

straceは表示されません。

どうすればこの問題を解決できますか?それは私が新しいものをロードするためにvboxカーネルドライバをアンロードできないようにします。

+0

おそらくServerFaultの方が良いでしょうか? – dmckee

+0

私はまだオンラインではありません。とにかくチップのおかげで 。 –

答えて

36

かんたん回答:できません。

長い回答:中断されないスリープとは、プロセスが信号によって起動されないことを意味します。それは待っているものによってのみ目が覚めることができます。私がそのような状況を得るとき、例えば。 CD-ROMで、私は通常、ディスクへのサスペンドと再開を使用してコンピュータをリセットします。

15

D状態は、基本的に、プロセスがディスクI/O、または中断できない他のブロックI/Oを待っていることを意味します。これは、カーネルやデバイスが熱狂的に不良ブロック(特に光ディスクから)を読み取ろうとしていることを意味します。時にはそれは他に何かがあることを意味します。

プロセスはD状態から抜けるまで、プロセスを強制終了できません。待っているものを見つけてそれを修正してください。簡単な方法は再起動することです。問題のディスクを取り除くのが助けになりますが、それはかなり危険です。あなたが何をしているのかわからないと、修復不可能な壊滅的なハードウェアの故障です。

3

私は最近、リモートサーバ上D状態のプロセスが発生し、ハードリブートまたは電源サイクルがプロセスを除去するために必要であることを明確にしたいと思います。

他のすべてのオプションを使い果たすまで、ソフトリブートを試みないでください。たとえば、プロセスが掛かっているリソースを解放することができます。ソフトリブートを行うと、部分的にシャットダウンされ、sshに応答しなくなるが、無停止プロセスを終了しようとしているために再起動しないシステムが生じる可能性があります。

11

無停止プロセスを強制終了すると、ただちに終了します。プロセスは実際に信号を受信するまで消えません。だからシグナルを送信するだけでは、プロセスを取り除くには十分ではありません、あなたはまた、中断されない睡眠から目を覚まさなければなりません。

Tanel Poderは偉大な文字を書いていますguide to analyse D state processes。この状態は、不完全なI/Oによって引き起こされることが非常に典型的である。ネットワーク障害。 slmはネットワークI/Oを解消する方法と問題自体についてもvery useful pointers on superuserという名前で投稿しています。

個人的には、VirtualBoxでWindowsを扱ったり、ワインであったりしても、決して完了しないCDROM I/Oのためにこの問題に遭遇することがよくあります。 ATA devices can be reset、おそらくプロセスをアンジャムするでしょう。

他の人が言ったように
echo 1 > /sys/block/sr0/delete 
echo 1 > /sys/block/sr1/delete 
echo "- - -" > /sys/class/scsi_host/host7/scan 
1

は、無停電プロセスはカーネル関数でスタックしているプロセスである:例えば、私は、プロセス、彼らがブロックしているのジヤム排除、私の光学式ドライブの両方をリセットするには、次の小さなスクリプトを使用しています中断することはできません(通常はI/O操作を待っています)。詳細な説明は、this answerを参照してください。

は別に、コンピュータを再起動してから、私はflushing linux VM cachesによってD状態からいくつかのプロセスをもたらす成功を収めて:

kill -9 {process_id} 
sync 
echo 3 | sudo tee /proc/sys/vm/drop_caches 

これは、システムの安定性に影響を与えていないようでしたが、私はシステムプログラマじゃないとありませんこれが意図しない結果になる可能性があります。


編集

kernel docsによると、drop_cachesは、開発環境で合理的に安全であると思われます。これに書き込み

drop_cachesと

は、カーネルがクリーンなキャッシュをドロップするだけでなく、dentriesとiノードなどの 再利用可能なスラブのオブジェクトになります。一旦落とされると、そのメモリの は無料になります。無料ページキャッシュへ

:無料スラブオブジェクトとページキャッシュに

echo 2 > /proc/sys/vm/drop_caches 

:再利用可能なスラブオブジェクトを(dentriesおよびiノードが含まれます)解放する

echo 1 > /proc/sys/vm/drop_caches 

echo 3 > /proc/sys/vm/drop_caches 

これは、非破壊操作であり、汚れたオブジェクトを解放しません。 この操作で解放されるオブジェクトの数を増やすには、ユーザは `sync 'を実行してから、/ proc/sys/vm/drop_cachesに書き込むことができます。これにより、システム上の 個のダーティオブジェクトが最小限に抑えられ、より多くの候補が作成され、 が削除されます。

このファイルには、メモリがシステム上の他の場所に必要なときにこれらのオブジェクトは自動的に カーネルによって再利用されている様々なカーネルキャッシュ (i-ノード、ディレクトリ・エントリ、ページキャッシュ、等...)の成長を制御するための手段ではありません。

このファイルを使用すると、パフォーマンス上の問題が発生する可能性があります。キャッシュされた オブジェクトを破棄するため、特に使用頻度の高いオブジェクトの場合は、オブジェクトが削除された オブジェクトを再作成するために、大量のI/OとCPUが必要になることがあります。このため、 はテスト環境またはデバッグ環境外での使用は推奨されません。

このファイルが使用 あるときは、カーネルログに情報メッセージを表示されることがあります。

cat (1234): drop_caches: 3 

これらは情報提供のみです。彼らはあなたのシステムに間違っていることを意味しません。 これらを無効にするには、drop_cachesに4(ビット3)をエコーし​​ます。

関連する問題