調査 #935
完了
匿名ユーザー さんが15年以上前に追加.
ほぼ15年前に更新.
説明
実行周期(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
- ステータス を 新規 から 終了 に変更
- 担当者 を 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型の引数で渡すことができるので、これらの変数をあふれさせるさらに小さすぎる周波数を与えることにより同様の現象がおこる可能セがある。
他の形式にエクスポート: Atom
PDF