プロジェクト

全般

プロフィール

調査 #935

実行周期の設定値

匿名ユーザー が14年以上前に追加. 約14年前に更新.

ステータス:
終了
優先度:
低め
担当者:
対象バージョン:
-
開始日:
2009/09/18
期日:
進捗率:

100%

予定工数:

説明

実行周期(exec_cxt.periodic.rate)に0.00045Hz以下(0Hzなど)の値を
設定するとコンポーネントのCPU使用率が跳ね上がる。

以下の3パターンを試した結果、[A][B]に比べ[C][D]のCPU使用率が
かなり大きくなりました。
[A] - onExecute:使用  実行周期:1000Hz
[B] - onExecute:未使用 実行周期:1000Hz
[C] - onExecute:使用  実行周期:0Hz
[D] - onExecute:未使用 実行周期:0Hz
*CPU使用率は"pidstat"コマンドにより測定しました。

環境は以下の通りです。
RTM-aist-0.4.2(c++)
ubuntu-8.04

履歴

#1 n-ando約14年前に更新

  • ステータス新規 から 終了 に変更
  • 担当者n-ando にセット
  • 進捗率0 から 100 に変更

C++版PeriodicExecutionContextの周期計算において、与えられた周波数からその逆数として計算される実行周期を秒以下であるとの仮定に基づいて計算していたため。
実際の計算では、マイクロ秒単位の実行周期をint型で保持しており、周期の計算では、

周期: period = 1000000/hz

として計算を行っていた。指摘の条件 hz = 0.00045 の場合、
周期: 1000000/0.00045 = 2222222222.2222222222222222222222

となり、int型の最大値2147483647を超えていた。
この場合、最終的に周期は0となり正確な周期で実行できないだけでなくCPU時間を無駄に消費することとなる。

PeriodicExecutionContext が保持する実行周期[s]をcoil::TimeValue型で保持し、coil::sleep()にもcoil::TimeValue型で直接与えることで、この問題はなくなる。
ただし、TimeValueは内部的に、int型でsecとusecを保持しており、かつset_rate()関数では周波数をdouble型の引数で渡すことができるので、これらの変数をあふれさせるさらに小さすぎる周波数を与えることにより同様の現象がおこる可能セがある。

#2 匿名ユーザー が約14年前に更新

他の形式にエクスポート: Atom PDF