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ミリ秒であることに注意してください。
犯人を追跡するためにどのようなツールを使用できますか?