2013年9月16日月曜日

ART-Linuxの実験 プロセス周期動作の精度

以前、ART-Linuxのプロセス起動に関してリアルタイム性を簡単なプログラムで見てみました。その結果、1ms周期とか10ms周期で動かすと少し設定より早めに処理が動く結果を得ました。(「プロセス起動」というよりは、正確にはプロセスは起動しっぱなしなので、その中での処理の周期動作の制御(タイマ割り込み)ですね)

このときは1台のPCで結果を調べてたので、周期動作の制御が悪いのか、時間計測の精度が悪いのかはっきりしないところがあったので、外部に信号を出してみることにしました。具体的には以下の様な形態で実験してみました。
PC1:10ms(or 5ms)で周期的にPC2に対しICMPパケット(Request)を送る。
PC2:WireSharkを起動しておき、PC1からくるICMP(Reqest)に対し、ICMP(Reply)を何時返信したか時間を記録する。

要は、PC1から周期的にPC2に対しPingを送って、その時間を計測するわけです。これならPC1のタイマ制御がおかしいならPC2の記録からわかります。
ところでWindows7ってPingに対してどれくらいで返信するのが通常なんでしょうか?この実験をする前に、別途手動で確認してみると数十usで返信していました。確か、今はある程度簡単な処理はCPUの処理なしでEthernetコントローラの方でHW的に行ってしまうという話を以前聞いていたのですが、どうもそのようです。しかもそれがWireSharkでログもできているので、実験環境としては問題ないでしょう。(あれ?でもその動作時間までログができているということは、どこかにCPUの処理が入っているはず。現状はどこまでHWでやっていて、どこをCPUで処理してるんだろ?)

20130928追記:
snappyの実験をしてて、100KBのデータの解凍をPC2が約70usで処理してしまいました。そうなると上記Pingの処理時間ではCPU処理の可能性もでてきました。PC2の処理負荷が高い状態で、PC1にてWireSharkによりログとってみないとよくわかりません。

結論からいうとPC1での測定結果と、PC2での測定結果はほぼ同じでした。つまり、PC2のログを見てもPC1からくるICMP(Request)は少し早くなってました。(ただ詳細に見ると、個々の周期間隔は数十us早かったり、遅かったりもしていました。傾向的に早い場合が多いという感じです。) 10ms(or 5ms)を10,000回行い、WireSharkのログをExcelでグラフを描いてみると、何か階段状に処理周期が早くなってました。ただそれが10,000回で20回の段差があるかないかなので、個々のデータを見ても何が起きているのかわかりません。何の周期処理とぶつかっているのかわかりませんが、定期的にタイマ割り込みが設定より早く発生することが続く(?)という感じです。

10msを10,000回実行:最終的に15ms早く終了
5msを10,000回実行:最終的に7.5ms早く終了

単純にタイマ割り込みの精度計算すると、どちらも0.15%の精度ということです。用途によっては十分な気もしますが、自分で周期を作り出す制御をする用途に使う場合はちょっと微妙なところです。ただ外部からより正確な周期で信号が送られてきて、それに対して反応するには周期の周波数にもよりますが、十分な気もします。まあとりあえず、実験例という程度の参考データが一応とれました。

0 件のコメント:

コメントを投稿