電子書籍の厳選無料作品が豊富!

1ms周期のハードウェアの割り込みを受けて、
ブロックしているユーザ空間プロセスを起床させてある処理を行っています。
起床するユーザ空間プロセスの周期を計測(GPIOにて出力)すると概ね、
1.015~1.020ms前後に収まっています。
しかし4秒に1回程度1.2msぐらいに周期が遅延することがあり、
その原因が分からず困っています。

【実施したこと】
・以下3つを変更してカーネルをリビルド
1.CONFIG_PREEMPTを有効
2.CONFIG_PMを無効(パワーマネジメント)
3.CONFIG_HZ_250をCONFIG_HZ_1000に変更

・該当プロセスの優先度を最大のRTに変更 (chrt --fifo 99)
・サービスの停止(動作しているプロセスは該当プロセスとカーネルスレッド以外なし)
・RFSをread onlyでremount
・ハードウェアの割り込み周期は問題ないことは確認済み
・SpeedStepをBIOSで無効


【環境】
・ディストリビューション:debian lenny(カーネル2.6.26)
・CPU:Intel AtomZ530

以上なにか情報をお持ちでしたらご教示いただけますでしょうか。
よろしくお願いいたします。

A 回答 (1件)

同じくZ530、Debianでreal time処理を色々試みている者です。



標準で配布されているLinux Kernelはプロセスがkernel空間に入っている間、割り込み応答を禁止している場合があり、たまたま何かのプロセスがKernel Callを行っていると、抜けるまで割り込みが待たされる場合があります。これは、システム全体の平均的なスループットを上げることを、割り込み応答よりも優先しているからです。サーバー系などではこの設定の方が有利だそうです。しかし、その結果として割り込み応答が遅くなる事があります。

で、これを改善するには下記のURLからご自分のKernelにあったパッチを当てて、CONFIG_PREEMPT_RTを有効にします(パッチを当てると、Processor type and featuresのセクションにPreemption modeという項目が現れるので、その中の一番下の項目だったと思います)。これはKernel内でのPreemptionを有効にして、Real time応答性を向上させるパッチですが、Preemption modeを設定しておかないと、割り込み応答は良くなりません。
もしかしたら対応するパッチがないかもしれませんが、そのときはkernelごと入れ替えてしまうのが良いでしょう。私の所ではDebian/Squeezeを入れた上で、linux-2.6.33.7に-rt29パッチを当てたものを使っています。応答時間のばらつきは標準偏差で0.01ms以下になっています。私の所では最大値は少し大きいのですが、あるプロセスが別のプロセスを経由して、特定のプロセスにメッセージを送って、そのプロセスがsleep後もとのプロセスにメッセージを返すという3つのプロセスが絡む時間測定をしているので、シングルプロセスの割り込み待ちはもっと良い結果が出ると思います。シングルプロセスの割り込み待ちも使っているのですが、正確な時間測定はしていないので。すみません。

このパッチが当たっているとsched_otherで動いているプロセスの影響はあまり受けないようです。

なおDebianには無いのですが、ディストリビューションによってはrealtime patchが当たったカーネルを配布している物もあります。

ご参考まで。

参考URL:http://www.kernel.org/pub/linux/kernel/projects/ …
    • good
    • 0
この回答へのお礼

返信遅れまして大変申し訳ありません。
u-kidさんの試された結果、非常に参考になりました。
一度パッチの適応を検討してみたいと思います。
また、その後ftrace にて調査をしたところ遅延が発生する場合
必ずeventsというカーネルスレッドが走っている事が分かりました。
それも併せて調査をしていきたいと思います。
ご回答ありがとうございました。

お礼日時:2010/12/14 07:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!