永久的にブロックされたI / Oの原因を特定する(中断されていない省電力状態のプロセス)

永久的にブロックされたI / Oの原因を特定する(中断されていない省電力状態のプロセス)

Linuxでは、中断不可能なスリープモード(状態D)でプロセスがブロックされました。この原因をどのように調査できますか?

私は特別なデバッグ機能なしで「通常の」カーネル(Debianバージョン)を実行しています。

関連ログエントリがありません。実際、プロセスが始まった時間と私がそれを見つけた時間の間には何も記録されませんでした。

strace中断のない省電力状態なので、プロセスに接続することもできません。システムコールの名前を知っていても、必ずしも役に立つわけではありません。カーネル内で何が起こっているのかを知る必要があります。

特に、syncコマンドは中断できない省電力モードに切り替わります。したがって、どこかでI / Oの問題があることは間違いありませんが、すべてのファイルシステムが正しく機能しているようです。 I / Oエラーの古いログエントリがある可能性が高いが見つかりません(マシンが長い間再起動されておらず、ログエントリが多い)。少なくともどのサブシステムがブロックされているかを知ることができますsync(たとえば、特定のPID / TIDに対応するカーネルスレッドを取得するなど)。カーネルトレース?

(再起動すると、この問題が解決したりエラーが表示されることは確信していますが、ランダムなボタンを押すのではなく、これを調べる方法を尋ねます。)

答え1

少し遅れましたが、他の人には役に立つと思います。

私がしたこと:

  1. cat /proc/PID/stack方向をつかむために。私の場合は、次のように動作します。インデックスノードおよびファイルシステム:
[<ffffffff83bbd6f1>] wait_on_page_bit+0x81/0xa0            
[<ffffffff83bced9b>] truncate_inode_pages_range+0x42b/0x750
[<ffffffff83bcf12f>] truncate_inode_pages_final+0x4f/0x60  
[<ffffffff83c6b78c>] evict+0x16c/0x180                     
[<ffffffff83c6bafc>] iput+0xfc/0x190                       
[<ffffffff83c66498>] __dentry_kill+0x158/0x1d0             
[<ffffffff83c66b35>] dput+0xb5/0x1a0                       
[<ffffffff83c4f53d>] __fput+0x18d/0x230                    
[<ffffffff83c4f6ce>] ____fput+0xe/0x10                     
[<ffffffff83ac31cb>] task_work_run+0xbb/0xe0               
[<ffffffff83a2cc65>] do_notify_resume+0xa5/0xc0            
[<ffffffff8419322f>] int_signal+0x12/0x17                  
[<ffffffffffffffff>] 0xffffffffffffffff                    
  1. cat /proc/PID/syscall現在のシステムコールを取得します。
3 0x6 0x1ae4bc6d 0x1 0x559320c 0x801df5 0x60161c4e 0x7ffccee38ae0 0x7fcf1a1547bd

代表者3名閉鎖システムコール、6はファイル記述子(システムコールの最初のパラメータ)です。電話をかけようとしていますclose(6)

  1. lsof -p PIDしかし、私の説明はありません。
  2. 運が良く、アプリケーションの起動時にファイルがどこかに開いている場合は、そのファイルの他のインスタンスを起動してファイルを確認できますlsof。これが私の状況です。

幸運を祈る

関連情報