時折発生するCPUカーネルの占有を見つける


11

2.6.35 PREEMPTカーネルを中速のARMv7プロセッサで実行しています。約100〜125秒ごとに1回、アンダーランを回避するのに十分な速度でカーネルが一部のオーディオ関連ドライバーを処理できなくなります。ホールドアップは通常15〜30ミリ秒の範囲ですが、非常に長くなることがあります。ホールドアップが完全にカーネル内にあるのか、リアルタイムの優先順位(SCHED_RR、2)で実行されているユーザープロセスのスケジューリングに関連しているのかは明らかではありません。

私の推測では、プリエンプトでうまく機能していない(少なくとも1つの)ドライバーが存在します。

ユーザープロセスからの一部のstrace出力は、正常な動作と異常な動作の両方のいくつかの側面を示していますが、さまざまな時間レポートの解釈方法はわかりませんか?

通常の場合:

     0.000518 poll([{fd = 10、events = POLLIN | POLLERR | POLLNVAL、revents = POLLIN}]、1、3415)= 1 
     0.010202 poll([{fd = 10、events = POLLIN | POLLERR | POLLNVAL}、{fd = 6、events = POLLOUT | POLLERR | POLLNVAL、revents = POLLOUT}]、2、3404)= 1 
     0.000585 poll([{fd = 10、events = POLLIN | POLLERR | POLLNVAL}、{fd = 6、events = POLLOUT | POLLERR | POLLNVAL、revents = POLLOUT}]、2、3404)= 1 
     0.000302 poll([{fd = 10、events = POLLIN | POLLERR | POLLNVAL、revents = POLLIN}]、1、3404)= 1 
     0.010706 poll([{fd = 10、events = POLLIN | POLLERR | POLLNVAL}、{fd = 6、events = POLLOUT | POLLERR | POLLNVAL、revents = POLLOUT}]、2、3393)= 1 
     0.000480 poll([{fd = 10、events = POLLIN | POLLERR | POLLNVAL}、{fd = 6、events = POLLOUT | POLLERR | POLLNVAL、revents = POLLOUT}]、2、3392)= 1 

fd6での出力のポーリングではブロッキングは発生せず、fd10のみが入力でポーリングされると、約10msのブロックが発生します。これは、システムコールの期間とシステムコールの間隔のレポートに反映されます(これらは一貫しています)。

失敗例(極端な例):

     0.000305 poll([{fd = 10、events = POLLIN | POLLERR | POLLNVAL、revents = POLLIN}]、1、3543)= 1 
     0.010730 poll([{fd = 10、events = POLLIN | POLLERR | POLLNVAL}、{fd = 6、events = POLLOUT | POLLERR | POLLNVAL、revents = POLLOUT}]、2、3533)= 1 
     0.000475 poll([{fd = 10、events = POLLIN | POLLERR | POLLNVAL}、{fd = 6、events = POLLOUT | POLLERR | POLLNVAL、revents = POLLOUT}]、2、3532)= 1 
     0.000329 poll([{fd = 10、events = POLLIN | POLLERR | POLLNVAL、revents = POLLIN}]、1、3532)= 1 
     0.953349 poll([{fd = 10、events = POLLIN | POLLERR | POLLNVAL}、{fd = 6、events = POLLOUT | POLLERR | POLLNVAL、revents = POLLOUT | POLLERR}]、2、2578)= 1 

この場合、最後から2番目の呼び出しは10ミリ秒(通常)かかっていると記録されていますが、最後の呼び出しの前は953ミリ秒であることに注意してください。

犯人を追跡するためにどのようなツールを使用できますか?


2
興味深い質問に対するボーナスポイント。どのように答えるかはわかりませんが、CPU使用率まで追跡する方法について質問があります(たとえば、iowaitのスパイクとは対照的ですか)。
Bratchley 2013

1
最初に推測することは、特に記録する場合に、大規模なNANDフラッシュ上でJFFS2またはYAFFSを実行しているかどうかです。フラッシュへの書き込みを無効にし、それが役立つかどうかを確認します。プロセステーブルはどのようなものですか?カーネルを構築するためのツールチェーンがある場合は、最後の手段としてftraceを使用できます。
ジョナサンベンアブラハム、2013年

SARは-buはそれを行う可能性があります。.. linux.die.net/man/1/sar
Grizly

フラッシュが使用されています。ext4ファイルシステムがマウントされたSDカード。そして、そこへの書き込みは確かにこれらの問題の原因となる可能性があります(しかし、正確にはなぜでしょうか)。
awy 2013

回答:


1

perfあなたのために役立つかもしれません。これはLinuxカーネルユーティリティの一部です。

例えば:

perf record -R -a -g fp -e cycles -e syscalls:sys_enter_poll -e syscalls:sys_exit_poll
#Just ctrl+c if you are done, and view ith
perf script 

すべてのsyscall開始/終了時間とパラメーター(straceなど)を表示し、syscallを呼び出すバイナリーの名前を提供し、ある頻度(カーネルシンボルを含む)で各CPUのコールスタックをサンプリングします。したがって、syscall中に実行されたコードを実際に確認できます。マルチプロセッサシステムでは、CPU ID(例:[001])に注意を払う必要があります。


プラットフォーム用にperfを構築する方法を検討します-ヒントに感謝します。
awy 2013

0

多分atopあなたの問題にいくつかの光を当てることができます。

すでに終了したプロセスを表示したり、CPUメモリディスクネットワークの使用率を表示したりできます。

インタラクティブに実行したり、テキストファイルに書き込んだりsar、定義済みの間隔で実行したりして、後で実行できるバイナリ履歴ファイルを作成できます。

私はそれを使って、見つけるのが難しいあらゆる種類の豚を見つけるのに使います:-)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.