そのうち、私はこの問題を自分で解決することができたので、少なくとも後世のために自分でフォローアップすることができます。
残念ながら、カーネルのアップグレードで元の問題を失いましたが、代わりに新しい問題を取得しました。パフォーマンスはさらに悪化し、追跡するのも同様に困難でした。私が見つけたテクニックは次のとおりです。
まず、blktrace
/ blkparse
は非常に役立つツールです。個々のI / O要求の進行状況を、要求を送信したプロセスなど、多くの役立つ詳細とともに追跡できます。出力をon tmpfs
にすると、トレースのストレージの処理が自動的にトレースを開始しないようになります。
ただし、これはこれまでのところ役立ちました。そのため、より多くのデバッグ機能を備えたカーネルをコンパイルしました。特に、ftrace
カーネルスペース内のパフォーマンスの低いプロセスをトレースして、それが何をしたのか、どこでブロックされたのかを確認できるので、非常に役立ちました。デバッグカーネルをコンパイルすると、作業WCHAN
出力も提供さps
れます。これは、少なくとも単純なケースでは、プロセスがカーネル内で何を行っているかを確認する簡単な方法として機能します。
LatencyTopが役立つことを望んでいましたが、非常にバグが多く、残念ながら「高レベル」すぎて本当に役に立たないレイテンシーの理由しか表示されないこともわかりました。
また、次のように、非常に近い間隔でiostat
コンテンツを表示するよりも便利です/sys/block/$DEVICE/stat
。
while :; do cat /sys/block/sda/stat; sleep .1; done
ファイルのDocumentation/iostats.txt
形式については、カーネルソースツリーを参照してくださいstat
。近い間隔で表示すると、I / Oバーストなどの正確なタイミングとサイズを確認できました。
最終的に、カーネルアップグレード後に発生した問題は、Linux 3.0で導入された機能である安定したページが原因であることがわかりました。この場合、私の場合、Berkeley DBはmmapされたページをダーティにすると長時間停止します地域ファイル。この機能を修正することは可能だと思われますが、Linux 3.9でそれが引き起こす問題は修正されるかもしれませんが、Berkeley DBに修正を加えて地域ファイルを別のディレクトリに配置できるようにすることで、今までの最悪の問題を解決しました(私の場合は/dev/shm
)、問題を完全に回避できるようにします。