[openrtm-users 01338] high CPU load when deactivate python component

20 posts / 0 new
Last post
root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01338] high CPU load when deactivate python component

OpenRTM-aist開発者の皆様

産総研の松坂です。

Python版のOpenRTM-aistに特有の問題ですが、コンポーネントがアクティブ状態にないときに
CPU負荷が上昇する現象に遭遇しています。
私の環境だけかもしれませんが、確認してみていただけますでしょうか?

以下、再現方法です。
1.適当なPythonコンポーネントを起動(私は添付のスクリプトを使用しましたがそれ以外でも再現します)
2.コンソールでtopコマンドを入力(この時点でPythonコンポーネントの負荷が10%程度に上昇しているのが確認できます)
3.RTSystemEditor上でコンポーネントをアクティベート(Pythonコンポーネントの負荷が数%に低下)
4.RTSystemEditor上でコンポーネントをデアクティベート(Pythonコンポーネントの負荷が10%程度に上昇)

私の開発環境の詳細です。
VMWare使用
ホストPC:MacOS X (snow leopard)
ゲストPC:Ubuntu 10.4
OpenRTM:1.00-release (debパッケージ)

もし何かわかりましたら教えてください。

Undefined
root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01339] high CPU load when deactivate python comp

松坂様

お世話になっております。
栗原です。

ご連絡、有難うございます。
こちらで確認しましたところ、ご指摘頂きましたように、INACTIVE状態ではACTIVE状態に
比べCPU負荷が高くなっておりました。

これは、RTCの実行コンテキスト(PeriodicExecutionContext)がwhileループを回してい
るためでして、whileループ内ではデフォルトで 0.001 秒の sleep が入りますが、0.001
秒の sleepでは cpu負荷が少々高くなるようです。
sleep時間を0.01秒にする事で負荷は約半分に軽減される事を確認しました。
# sleepが無い場合は、CPUは90%近くなります。

1msecでコンポーネントを実行する必要が無い場合は、お手数ですが、rtc.confファイル
に以下の一行を追記して、ご確認頂けますでしょうか。

exec_cxt.periodic.rate: 10 # 10Hzです。

以上、宜しくお願い致します。

On Tue, 6 Jul 2010 11:22:05 +0900
Yosuke Matsusaka wrote:

> OpenRTM-aist開発者の皆様
>
> 産総研の松坂です。
>
> Python版のOpenRTM-aistに特有の問題ですが、コンポーネントがアクティブ状態にないときに
> CPU負荷が上昇する現象に遭遇しています。
> 私の環境だけかもしれませんが、確認してみていただけますでしょうか?
>
> 以下、再現方法です。
> 1.適当なPythonコンポーネントを起動(私は添付のスクリプトを使用しましたがそれ以外でも再現します)
> 2.コンソールでtopコマンドを入力(この時点でPythonコンポーネントの負荷が10%程度に上昇しているのが確認できます)
> 3.RTSystemEditor上でコンポーネントをアクティベート(Pythonコンポーネントの負荷が数%に低下)
> 4.RTSystemEditor上でコンポーネントをデアクティベート(Pythonコンポーネントの負荷が10%程度に上昇)
>
> 私の開発環境の詳細です。
> VMWare使用
> ホストPC:MacOS X (snow leopard)
> ゲストPC:Ubuntu 10.4
> OpenRTM:1.00-release (debパッケージ)
>
> もし何かわかりましたら教えてください。
>

root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01340] high CPU load when deactivate python com

栗原さん

松坂です。いつもお世話になっています。

2010/7/6 kurihara shinji :
> 1msecでコンポーネントを実行する必要が無い場合は、お手数ですが、rtc.confファイル
> に以下の一行を追記して、ご確認頂けますでしょうか。
>
> exec_cxt.periodic.rate: 10 # 10Hzです。

上記の変更でかなり負荷が軽減されることを確認しました。

> これは、RTCの実行コンテキスト(PeriodicExecutionContext)がwhileループを回してい
> るためでして、whileループ内ではデフォルトで 0.001 秒の sleep が入りますが、0.001
> 秒の sleepでは cpu負荷が少々高くなるようです。
> sleep時間を0.01秒にする事で負荷は約半分に軽減される事を確認しました。
> # sleepが無い場合は、CPUは90%近くなります。

この部分に関して、非アクティブ状態ではそもそもループを回さない方が良いと思うのですが、
このような実装になっているのは何か理由があるのでしょうか?
#私がRTMの規格を誤解していたらすみません。

root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01346] high CPU load when deactivate python com

松坂様

栗原です。

早速ご確認頂き、有難うございます。

> この部分に関して、非アクティブ状態ではそもそもループを回さない方が良いと思うのですが、
> このような実装になっているのは何か理由があるのでしょうか?
RTMでは、一つのExecutionContextで複数のRTCを駆動する事が可能となっております。
仮に、非アクティブ状態でループを回さないようにした場合、一つのECに複数のRTC
が関連付けられてる状況において、一つの RTC が非アクティブ状態の時に、他のアク
ティブ状態のRTCまでも駆動関数(on_execute)が実行されないといった事になってしまい
ます。

上記のような理由もあり、ExecutionContextのループは、RTCの状態に関わらずループ
する仕様となっております。

以上、宜しくお願い致します。

On Tue, 6 Jul 2010 14:07:05 +0900
Yosuke Matsusaka wrote:

> 栗原さん
>
> 松坂です。いつもお世話になっています。
>
> 2010/7/6 kurihara shinji :
> > 1msecでコンポーネントを実行する必要が無い場合は、お手数ですが、rtc.confファイル
> > に以下の一行を追記して、ご確認頂けますでしょうか。
> >
> > exec_cxt.periodic.rate: 10 # 10Hzです。
>
> 上記の変更でかなり負荷が軽減されることを確認しました。
>
> > これは、RTCの実行コンテキスト(PeriodicExecutionContext)がwhileループを回してい
> > るためでして、whileループ内ではデフォルトで 0.001 秒の sleep が入りますが、0.001
> > 秒の sleepでは cpu負荷が少々高くなるようです。
> > sleep時間を0.01秒にする事で負荷は約半分に軽減される事を確認しました。
> > # sleepが無い場合は、CPUは90%近くなります。
>
> この部分に関して、非アクティブ状態ではそもそもループを回さない方が良いと思うのですが、
> このような実装になっているのは何か理由があるのでしょうか?
> #私がRTMの規格を誤解していたらすみません。
>

root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01348] high CPU load when deactivate python com

栗原さん

松坂です。

2010/7/6 kurihara shinji :
> RTMでは、一つのExecutionContextで複数のRTCを駆動する事が可能となっております。
> 仮に、非アクティブ状態でループを回さないようにした場合、一つのECに複数のRTC
> が関連付けられてる状況において、一つの RTC が非アクティブ状態の時に、他のアク
> ティブ状態のRTCまでも駆動関数(on_execute)が実行されないといった事になってしまい
> ます。
>
> 上記のような理由もあり、ExecutionContextのループは、RTCの状態に関わらずループ
> する仕様となっております。

なるほど、理解しました。
金広さん、清水さんの議論を読んで、何となく私の理解がずれている予感がしていたのですが、
これでクリアになりました。

・ExecutionContextは直列リストの構造をしている。
・ただし、あくまで分散コンポーネントモデルなので中央でコンテキストを管理している
 サービスがあるわけではなく、各コンポーネント同士がバケツリレーのような形で
 実行タイミングを通知しあっている。

というわけですね。
改良しようとしてもなかなか難しいところですね、、、。

root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01349] high CPU load when deactivate python com

松坂様

栗原です。

以下は、一つのExecutionContextに対して複数のRTCが登録された場合についてです。

> ・ExecutionContextは直列リストの構造をしている。
ExecutionContextは、add_component(rtobj)にて登録されたRTCをリストで管理してお
り、whileループの中では、リストに登録されているRTCのアクティビティ処理を呼び出し
ます。(正確には、StateMachineから呼ばれます。)

> ・ただし、あくまで分散コンポーネントモデルなので中央でコンテキストを管理している
>  サービスがあるわけではなく、各コンポーネント同士がバケツリレーのような形で
>  実行タイミングを通知しあっている。
RTCのリストに登録してある順番でRTCのon_execute()などを呼びますので、たとえば、
3つのRTC(A,B,C)が登録されていて、3つのRTCがACTIVE状態であれば、Aのon_execute
()が戻ってきて、Bのon_execute(),Cのon_execute()のようになります。
よって、各コンポーネント同士が実行タイミングを通知しあっているのではなく、
あるRTCのアクティビティ処理が終了次第、次のRTCのアクティビティ処理の実行をECが
行うといった仕様になっております。

以上、宜しくお願い致します。

On Tue, 6 Jul 2010 17:44:54 +0900
Yosuke Matsusaka wrote:

> 栗原さん
>
> 松坂です。
>
> 2010/7/6 kurihara shinji :
> > RTMでは、一つのExecutionContextで複数のRTCを駆動する事が可能となっております。
> > 仮に、非アクティブ状態でループを回さないようにした場合、一つのECに複数のRTC
> > が関連付けられてる状況において、一つの RTC が非アクティブ状態の時に、他のアク
> > ティブ状態のRTCまでも駆動関数(on_execute)が実行されないといった事になってしまい
> > ます。
> >
> > 上記のような理由もあり、ExecutionContextのループは、RTCの状態に関わらずループ
> > する仕様となっております。
>
> なるほど、理解しました。
> 金広さん、清水さんの議論を読んで、何となく私の理解がずれている予感がしていたのですが、
> これでクリアになりました。
>
> ・ExecutionContextは直列リストの構造をしている。
> ・ただし、あくまで分散コンポーネントモデルなので中央でコンテキストを管理している
>  サービスがあるわけではなく、各コンポーネント同士がバケツリレーのような形で
>  実行タイミングを通知しあっている。
>
> というわけですね。
> 改良しようとしてもなかなか難しいところですね、、、。
>

root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01350] high CPU load when deactivate python com

栗原さん

松坂です。

2010/7/6 kurihara shinji :
> 以下は、一つのExecutionContextに対して複数のRTCが登録された場合についてです。

この部分から誤解していたように思うので確認ですが、ExecutionContext (ECManager?)自体が
RTObjectとは独立したCORBA objectになっているという理解で良いでしょうか?

> RTCのリストに登録してある順番でRTCのon_execute()などを呼びますので、たとえば、
> 3つのRTC(A,B,C)が登録されていて、3つのRTCがACTIVE状態であれば、Aのon_execute
> ()が戻ってきて、Bのon_execute(),Cのon_execute()のようになります。
> よって、各コンポーネント同士が実行タイミングを通知しあっているのではなく、
> あるRTCのアクティビティ処理が終了次第、次のRTCのアクティビティ処理の実行をECが
> 行うといった仕様になっております。

上記のようになっているとすると、例えばECManagerが各RTCのステートマシンの最新の状態を把握
(各コンポーネントのonStateChangeイベントにサブスクライブ)しておき、そのコンポーネントが非アクティブ時には
on_execute()の呼び出しをスキップするなどの実装も可能と思うのですがどうでしょうか?

ステートマシンとECの関係の定義(RTMの仕様)次第ではありますが、、、。

root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01351] high CPU load when deactivate python com

みなさま

安藤です

ほぼ栗原さんからの返答で言い尽くされていると思いますが少し補足を。

ECとRTCの関係ですが、PeriodicExecutionContext::svc() がまさに
その部分になるかと思います。

do
{
m_worker.mutex_.unlock();
while (!m_worker.running_)
{
m_worker.cond_.wait(); // stopped状態のときここで待つ
}
if (m_worker.running_)
{
std::for_each(m_comps.begin(), m_comps.end(),
invoke_worker()); // すべてのRTCのアクションを実行
}
m_worker.mutex_.unlock();
if (!m_nowait) { coil::sleep(m_period); }
} while (m_svc);

invoke_worker() の中身ですが、コンポーネントの現在の状態の
アクション (on_何とか) を実行するものだと思ってください。
なお、Inactive 状態は、on_何とかに相当する関数がないので
ダミーの空の関数が実行されていると思ってください。

do-while の for_each の部分を書き下すと、コンポーネントがそれぞれ以下の状態にある場合

RTC0: inactive
RTC1: active
RTC2: active
RTC3: error

do-while の for_each 内
RTC0. dummy();
RTC1: on_execute();
RTC2: on_execute'(;
RTC3: on_error();

ということになります。したがって、RTC0がinactive状態ですが、
ループを止めるわけにはいきません。

清水さんがおっしゃるように、すべてのRTCがinactiveの場合は
ループを止めてもいいのですが、そうなると、
#以下適当なコードですが、

do
{
m_worker.mutex_.lock();
while (!m_worker.running_)
{
m_worker.cond_.wait(); // ECのstopped状態のときにここで止まってる
}
if (m_worker.running_) // ECがrunning状態のとき
{
m_inactivewait.mutex_.lock();
inactivecomps = for_each(m_comps.begin(), m_comps.end(),
Inactivecomps()); // (1) Inactiveかどうか調べる
while (inactivecomps.num() == m_comps.size()) {
m_inactivewait.cond_.wait(); } // (2) 全部inactiveならwait
std::for_each(m_comps.begin(), m_comps.end(),
invoke_worker()); // (3) 各RTCのアクションを実行
m_inactivewait.mutex_.unlock();
}
m_worker.mutex_.unlock();
if (!m_nowait) { coil::sleep(m_period); }
} while (m_svc);

という感じで、毎周期すべてのコンポーネントを調べる必要があります。
#別の実装としては、ECのactivate_component() などの呼び出しから、
#現在アタッチされているRTCの状態がInactiveかどうかをEC自体が常に補足
#するという方法もありますかね?

この部分は、リアルタイム実行される可能性もあるので、これを
取り込むかどうかは (1) の for_each がどのくらいの時間がかかるかにもよると思います。
あと、ロックが追加されている部分と、ECのもうひとつの状態遷移(stopped<->running)
との兼ね合いについてもよく考える必要があります。(デッドロックが起こらないかどうかなど)

というわけですので、今後の検討課題とさせてください。

2010年7月6日19:15 kurihara shinji :
> 松坂様
>
> 栗原です。
>
> 以下は、一つのExecutionContextに対して複数のRTCが登録された場合についてです。
>
>> ・ExecutionContextは直列リストの構造をしている。
> ExecutionContextは、add_component(rtobj)にて登録されたRTCをリストで管理してお
> り、whileループの中では、リストに登録されているRTCのアクティビティ処理を呼び出し
> ます。(正確には、StateMachineから呼ばれます。)
>
>> ・ただし、あくまで分散コンポーネントモデルなので中央でコンテキストを管理している
>> サービスがあるわけではなく、各コンポーネント同士がバケツリレーのような形で
>> 実行タイミングを通知しあっている。
> RTCのリストに登録してある順番でRTCのon_execute()などを呼びますので、たとえば、
> 3つのRTC(A,B,C)が登録されていて、3つのRTCがACTIVE状態であれば、Aのon_execute
> ()が戻ってきて、Bのon_execute(),Cのon_execute()のようになります。
> よって、各コンポーネント同士が実行タイミングを通知しあっているのではなく、
> あるRTCのアクティビティ処理が終了次第、次のRTCのアクティビティ処理の実行をECが
> 行うといった仕様になっております。
>
>
> 以上、宜しくお願い致します。
>
>
> On Tue, 6 Jul 2010 17:44:54 +0900
> Yosuke Matsusaka wrote:
>
>> 栗原さん
>>
>> 松坂です。
>>
>> 2010/7/6 kurihara shinji :
>> > RTMでは、一つのExecutionContextで複数のRTCを駆動する事が可能となっております。
>> > 仮に、非アクティブ状態でループを回さないようにした場合、一つのECに複数のRTC
>> > が関連付けられてる状況において、一つの RTC が非アクティブ状態の時に、他のアク
>> > ティブ状態のRTCまでも駆動関数(on_execute)が実行されないといった事になってしまい
>> > ます。
>> >
>> > 上記のような理由もあり、ExecutionContextのループは、RTCの状態に関わらずループ
>> > する仕様となっております。
>>
>> なるほど、理解しました。
>> 金広さん、清水さんの議論を読んで、何となく私の理解がずれている予感がしていたのですが、
>> これでクリアになりました。
>>
>> ・ExecutionContextは直列リストの構造をしている。
>> ・ただし、あくまで分散コンポーネントモデルなので中央でコンテキストを管理している
>> サービスがあるわけではなく、各コンポーネント同士がバケツリレーのような形で
>> 実行タイミングを通知しあっている。
>>
>> というわけですね。
>> 改良しようとしてもなかなか難しいところですね、、、。
>>

root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01357] high CPU load when deactivate python com

安藤様

清水です。

> #別の実装としては、ECのactivate_component()
> などの呼び出しから、
> #現在アタッチされているRTCの状態がInactiveかどうかをEC
自体が常に補足
> #するという方法もありますかね?

私が考えていたのは、こちらの方法で、
毎周期RTCの状態を調べる必要はありません。

RTCの状態遷移図によると、
以下のようになっています。

・INACTIVE -> ACTIVEの状態遷移は、
activate_component()をトリガーとして発生する。

・ACTIVE -> INACTIVEの状態遷移は、
deactivate_component()をトリガーとして発生する。

・ERROR -> INACTIVEの状態遷移は、
reset_component()をトリガーとして発生する。

これより、ECをstart/stopするタイミングは、
上記のメソッドが呼ばれた時だけになると思います。
したがって、上記メソッドの内部で
RTCの状態をチェックしECをstart/stopすれば、
最小限の負荷で、RTCの状態とECのstart/stopを
連動させることができると考えたわけです。

また、少々手間ですが、RTCの状態とECのstart/stopを
連動させるかどうかをconfで指定できると
ベストかと思います。

ご検討の程、よろしくお願いいたします。

清水

root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01359] high CPU load when deactivate python com

安藤です

> 安藤様
>
> 清水です。
>
>> #別の実装としては、ECのactivate_component()
>> などの呼び出しから、
>> #現在アタッチされているRTCの状態がInactiveかどうかをEC
> 自体が常に補足
>> #するという方法もありますかね?
>
> 私が考えていたのは、こちらの方法で、
> 毎周期RTCの状態を調べる必要はありません。

そうなんですが、こちらは同じ状態を2か所で持つのでいやだなと。。。

> RTCの状態遷移図によると、
> 以下のようになっています。
>
> ・INACTIVE -> ACTIVEの状態遷移は、
> activate_component()をトリガーとして発生する。
>
> ・ACTIVE -> INACTIVEの状態遷移は、
> deactivate_component()をトリガーとして発生する。
>
> ・ERROR -> INACTIVEの状態遷移は、
> reset_component()をトリガーとして発生する。
>
> これより、ECをstart/stopするタイミングは、
> 上記のメソッドが呼ばれた時だけになると思います。
> したがって、上記メソッドの内部で
> RTCの状態をチェックしECをstart/stopすれば、
> 最小限の負荷で、RTCの状態とECのstart/stopを
> 連動させることができると考えたわけです。

> また、少々手間ですが、RTCの状態とECのstart/stopを
> 連動させるかどうかをconfで指定できると
> ベストかと思います。

これは全部のRTCがInactiveになったらECが自動でstopped
状態になるということですか?ECのstopped/runningはInactive/Active/Error
状態とは独立なので、RTCの仕様的にもちょっと混乱を招きそうです。

とりあえず、こちらの案も含めて検討してみます。

> ご検討の程、よろしくお願いいたします。
>
> 清水
>

root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01341] high CPU load when deactivate python com

栗原様,

金広@産総研です.

参考までになぜINACTIVE状態の方がACTIVE状態よりもCPU負荷が高くなるのか教えて
いただけないでしょうか.
ExecutionContextはRTC内のステートマシンの状態によらず動作しているため,RTCが
INACTIVEでもCPUを食うのはわかるのですが,ACTIVE状態のほうがonExecute()を
実行する分だけ負荷が高くなるように思えるのですが.

2010/7/6 kurihara shinji :
> 松坂様
>
> お世話になっております。
> 栗原です。
>
> ご連絡、有難うございます。
> こちらで確認しましたところ、ご指摘頂きましたように、INACTIVE状態ではACTIVE状態に
> 比べCPU負荷が高くなっておりました。
>
> これは、RTCの実行コンテキスト(PeriodicExecutionContext)がwhileループを回してい
> るためでして、whileループ内ではデフォルトで 0.001 秒の sleep が入りますが、0.001
> 秒の sleepでは cpu負荷が少々高くなるようです。
> sleep時間を0.01秒にする事で負荷は約半分に軽減される事を確認しました。
> # sleepが無い場合は、CPUは90%近くなります。
>
> 1msecでコンポーネントを実行する必要が無い場合は、お手数ですが、rtc.confファイル
> に以下の一行を追記して、ご確認頂けますでしょうか。
>
> exec_cxt.periodic.rate: 10 # 10Hzです。
>
>
> 以上、宜しくお願い致します。
>
>
> On Tue, 6 Jul 2010 11:22:05 +0900
> Yosuke Matsusaka wrote:
>
>> OpenRTM-aist開発者の皆様
>>
>> 産総研の松坂です。
>>
>> Python版のOpenRTM-aistに特有の問題ですが、コンポーネントがアクティブ状態にないときに
>> CPU負荷が上昇する現象に遭遇しています。
>> 私の環境だけかもしれませんが、確認してみていただけますでしょうか?
>>
>> 以下、再現方法です。
>> 1.適当なPythonコンポーネントを起動(私は添付のスクリプトを使用しましたがそれ以外でも再現します)
>> 2.コンソールでtopコマンドを入力(この時点でPythonコンポーネントの負荷が10%程度に上昇しているのが確認できます)
>> 3.RTSystemEditor上でコンポーネントをアクティベート(Pythonコンポーネントの負荷が数%に低下)
>> 4.RTSystemEditor上でコンポーネントをデアクティベート(Pythonコンポーネントの負荷が10%程度に上昇)
>>
>> 私の開発環境の詳細です。
>> VMWare使用
>> ホストPC:MacOS X (snow leopard)
>> ゲストPC:Ubuntu 10.4
>> OpenRTM:1.00-release (debパッケージ)
>>
>> もし何かわかりましたら教えてください。
>>

root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01342] high CPU load when deactivate python com

金広さん

松坂です。

2010/7/6 Fumio Kanehiro :
> 参考までになぜINACTIVE状態の方がACTIVE状態よりもCPU負荷が高くなるのか教えて
> いただけないでしょうか.
> ExecutionContextはRTC内のステートマシンの状態によらず動作しているため,RTCが
> INACTIVEでもCPUを食うのはわかるのですが,ACTIVE状態のほうがonExecute()を
> 実行する分だけ負荷が高くなるように思えるのですが.

上記の件、スクリプトの実装次第だと思います。
私のスクリプト(&おそらく多くのスクリプト)は、onExecuteの中で長いsleep命令を
出しているので、ループの周りが遅くなり、負荷が軽くなっている理屈です。

root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01343] high CPU load when deactivate python com

金広様

お世話になっております。
栗原です。

先程の「INACTIVE状態ではACTIVE状態に比べCPU負荷が高くなっておりました」
という内容には補足が抜けておりました。
こちらで確認しましたコンポーネントは、ConsoleIn.pyでして、ACTIVE状態で
は標準入力からの入力待ちとなるため、INACTIVE状態ではACTIVE状態よりもCPU
負荷が高いと表現致しました。
誤解を招く表現をしてしまい、申し訳ございません。

ご指摘の通り、実際は、onExecute()にて何らかの処理を実装している場合、
INACTIVE状態よりもACTIVE状態の方が負荷は高くなります。

ConsoleIn.pyのonExecute()にて、すぐに"return RTC.RTC_OK"にて何も処理を
行わないように変更し確認しましたところ、INACTIVE状態とACTIVE状態とでは
負荷はほぼ同じでした。

以上、宜しくお願い致します。

On Tue, 6 Jul 2010 14:18:51 +0900
Fumio Kanehiro wrote:

> 栗原様,
>
> 金広@産総研です.
>
> 参考までになぜINACTIVE状態の方がACTIVE状態よりもCPU負荷が高くなるのか教えて
> いただけないでしょうか.
> ExecutionContextはRTC内のステートマシンの状態によらず動作しているため,RTCが
> INACTIVEでもCPUを食うのはわかるのですが,ACTIVE状態のほうがonExecute()を
> 実行する分だけ負荷が高くなるように思えるのですが.
>
> 2010/7/6 kurihara shinji :
> > 松坂様
> >
> > お世話になっております。
> > 栗原です。
> >
> > ご連絡、有難うございます。
> > こちらで確認しましたところ、ご指摘頂きましたように、INACTIVE状態ではACTIVE状態に
> > 比べCPU負荷が高くなっておりました。
> >
> > これは、RTCの実行コンテキスト(PeriodicExecutionContext)がwhileループを回してい
> > るためでして、whileループ内ではデフォルトで 0.001 秒の sleep が入りますが、0.001
> > 秒の sleepでは cpu負荷が少々高くなるようです。
> > sleep時間を0.01秒にする事で負荷は約半分に軽減される事を確認しました。
> > # sleepが無い場合は、CPUは90%近くなります。
> >
> > 1msecでコンポーネントを実行する必要が無い場合は、お手数ですが、rtc.confファイル
> > に以下の一行を追記して、ご確認頂けますでしょうか。
> >
> > exec_cxt.periodic.rate: 10 # 10Hzです。
> >
> >
> > 以上、宜しくお願い致します。
> >
> >
> > On Tue, 6 Jul 2010 11:22:05 +0900
> > Yosuke Matsusaka wrote:
> >
> >> OpenRTM-aist開発者の皆様
> >>
> >> 産総研の松坂です。
> >>
> >> Python版のOpenRTM-aistに特有の問題ですが、コンポーネントがアクティブ状態にないときに
> >> CPU負荷が上昇する現象に遭遇しています。
> >> 私の環境だけかもしれませんが、確認してみていただけますでしょうか?
> >>
> >> 以下、再現方法です。
> >> 1.適当なPythonコンポーネントを起動(私は添付のスクリプトを使用しましたがそれ以外でも再現します)
> >> 2.コンソールでtopコマンドを入力(この時点でPythonコンポーネントの負荷が10%程度に上昇しているのが確認できます)
> >> 3.RTSystemEditor上でコンポーネントをアクティベート(Pythonコンポーネントの負荷が数%に低下)
> >> 4.RTSystemEditor上でコンポーネントをデアクティベート(Pythonコンポーネントの負荷が10%程度に上昇)
> >>
> >> 私の開発環境の詳細です。
> >> VMWare使用
> >> ホストPC:MacOS X (snow leopard)
> >> ゲストPC:Ubuntu 10.4
> >> OpenRTM:1.00-release (debパッケージ)
> >>
> >> もし何かわかりましたら教えてください。
> >>

root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01344] high CPU load when deactivate python com

松坂様,栗原様,

回答ありがとうございました.
ConsoleIn.pyの中身を見ていなかったので勘違いしたようです.

松坂さんの要望に関連するのですが,ExecutionContext無しのRTCというのは
作れないものでしょうか?というのは時々サービスポートだけを持っていて,
onExecute()では何もしない,単なるCORBAサーバのようなRTCを作りたい時が
あるのです.この場合ExecutionContextは何もせずに回っているだけで無駄に思えます.
(ただし1.0.0-RELEASEからRTCがACTIVE状態でないとサービスポートは
有効でないようですので,EC無しにではサービスポートも使えなくなって
しまいますが)
何かいい方法は有りますでしょうか?

2010/7/6 kurihara shinji :
> 金広様
>
> お世話になっております。
> 栗原です。
>
> 先程の「INACTIVE状態ではACTIVE状態に比べCPU負荷が高くなっておりました」
> という内容には補足が抜けておりました。
> こちらで確認しましたコンポーネントは、ConsoleIn.pyでして、ACTIVE状態で
> は標準入力からの入力待ちとなるため、INACTIVE状態ではACTIVE状態よりもCPU
> 負荷が高いと表現致しました。
> 誤解を招く表現をしてしまい、申し訳ございません。
>
> ご指摘の通り、実際は、onExecute()にて何らかの処理を実装している場合、
> INACTIVE状態よりもACTIVE状態の方が負荷は高くなります。
>
> ConsoleIn.pyのonExecute()にて、すぐに"return RTC.RTC_OK"にて何も処理を
> 行わないように変更し確認しましたところ、INACTIVE状態とACTIVE状態とでは
> 負荷はほぼ同じでした。
>
>
> 以上、宜しくお願い致します。
>
>
> On Tue, 6 Jul 2010 14:18:51 +0900
> Fumio Kanehiro wrote:
>
>> 栗原様,
>>
>> 金広@産総研です.
>>
>> 参考までになぜINACTIVE状態の方がACTIVE状態よりもCPU負荷が高くなるのか教えて
>> いただけないでしょうか.
>> ExecutionContextはRTC内のステートマシンの状態によらず動作しているため,RTCが
>> INACTIVEでもCPUを食うのはわかるのですが,ACTIVE状態のほうがonExecute()を
>> 実行する分だけ負荷が高くなるように思えるのですが.
>>
>> 2010/7/6 kurihara shinji :
>> > 松坂様
>> >
>> > お世話になっております。
>> > 栗原です。
>> >
>> > ご連絡、有難うございます。
>> > こちらで確認しましたところ、ご指摘頂きましたように、INACTIVE状態ではACTIVE状態に
>> > 比べCPU負荷が高くなっておりました。
>> >
>> > これは、RTCの実行コンテキスト(PeriodicExecutionContext)がwhileループを回してい
>> > るためでして、whileループ内ではデフォルトで 0.001 秒の sleep が入りますが、0.001
>> > 秒の sleepでは cpu負荷が少々高くなるようです。
>> > sleep時間を0.01秒にする事で負荷は約半分に軽減される事を確認しました。
>> > # sleepが無い場合は、CPUは90%近くなります。
>> >
>> > 1msecでコンポーネントを実行する必要が無い場合は、お手数ですが、rtc.confファイル
>> > に以下の一行を追記して、ご確認頂けますでしょうか。
>> >
>> > exec_cxt.periodic.rate: 10 # 10Hzです。
>> >
>> >
>> > 以上、宜しくお願い致します。
>> >
>> >
>> > On Tue, 6 Jul 2010 11:22:05 +0900
>> > Yosuke Matsusaka wrote:
>> >
>> >> OpenRTM-aist開発者の皆様
>> >>
>> >> 産総研の松坂です。
>> >>
>> >> Python版のOpenRTM-aistに特有の問題ですが、コンポーネントがアクティブ状態にないときに
>> >> CPU負荷が上昇する現象に遭遇しています。
>> >> 私の環境だけかもしれませんが、確認してみていただけますでしょうか?
>> >>
>> >> 以下、再現方法です。
>> >> 1.適当なPythonコンポーネントを起動(私は添付のスクリプトを使用しましたがそれ以外でも再現します)
>> >> 2.コンソールでtopコマンドを入力(この時点でPythonコンポーネントの負荷が10%程度に上昇しているのが確認できます)
>> >> 3.RTSystemEditor上でコンポーネントをアクティベート(Pythonコンポーネントの負荷が数%に低下)
>> >> 4.RTSystemEditor上でコンポーネントをデアクティベート(Pythonコンポーネントの負荷が10%程度に上昇)
>> >>
>> >> 私の開発環境の詳細です。
>> >> VMWare使用
>> >> ホストPC:MacOS X (snow leopard)
>> >> ゲストPC:Ubuntu 10.4
>> >> OpenRTM:1.00-release (debパッケージ)
>> >>
>> >> もし何かわかりましたら教えてください。
>> >>

root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01347] high CPU load when deactivate python com

金広様

栗原です。

Python版では、RTCが非アクティブ状態であってもサービスポートを有効にする事は可能
です。
ただし、OpenRTM-aist-0.4の頃に、「RTCが非アクティブの時はサービスポートも無効に
した方がよい。」という要望があり、1.0.0からはRTCが非アクティブの時はサービスポー
トも無効とするような変更が行われた経緯がございますので、今回紹介させて頂く方法が
良いのかは保証できません。

サービスポートを有効にする方法としましては、CorbaPort::activateInterfaces()を
呼ぶ事で有効になります。
ただし、このメソッドは、C++ではprotectedで宣言されてますので、RTCからは呼ぶ事
ができません。
Pythonでは可能です。

OpenRTMのサンプルに含まれますMyServiceProvider.pyを変更し、RTCが非アクティブ状態
でもサービスポートを使用できる事を確認致しましたので、添付させて頂きます。

添付のRTCでは、ECの停止と、サービスポートの有効化を行っております。

以上、宜しくお願い致します。

On Tue, 6 Jul 2010 14:41:17 +0900
Fumio Kanehiro wrote:

> 松坂様,栗原様,
>
> 回答ありがとうございました.
> ConsoleIn.pyの中身を見ていなかったので勘違いしたようです.
>
> 松坂さんの要望に関連するのですが,ExecutionContext無しのRTCというのは
> 作れないものでしょうか?というのは時々サービスポートだけを持っていて,
> onExecute()では何もしない,単なるCORBAサーバのようなRTCを作りたい時が
> あるのです.この場合ExecutionContextは何もせずに回っているだけで無駄に思えます.
> (ただし1.0.0-RELEASEからRTCがACTIVE状態でないとサービスポートは
> 有効でないようですので,EC無しにではサービスポートも使えなくなって
> しまいますが)
> 何かいい方法は有りますでしょうか?
>
>
> 2010/7/6 kurihara shinji :
> > 金広様
> >
> > お世話になっております。
> > 栗原です。
> >
> > 先程の「INACTIVE状態ではACTIVE状態に比べCPU負荷が高くなっておりました」
> > という内容には補足が抜けておりました。
> > こちらで確認しましたコンポーネントは、ConsoleIn.pyでして、ACTIVE状態で
> > は標準入力からの入力待ちとなるため、INACTIVE状態ではACTIVE状態よりもCPU
> > 負荷が高いと表現致しました。
> > 誤解を招く表現をしてしまい、申し訳ございません。
> >
> > ご指摘の通り、実際は、onExecute()にて何らかの処理を実装している場合、
> > INACTIVE状態よりもACTIVE状態の方が負荷は高くなります。
> >
> > ConsoleIn.pyのonExecute()にて、すぐに"return RTC.RTC_OK"にて何も処理を
> > 行わないように変更し確認しましたところ、INACTIVE状態とACTIVE状態とでは
> > 負荷はほぼ同じでした。
> >
> >
> > 以上、宜しくお願い致します。
> >
> >
> > On Tue, 6 Jul 2010 14:18:51 +0900
> > Fumio Kanehiro wrote:
> >
> >> 栗原様,
> >>
> >> 金広@産総研です.
> >>
> >> 参考までになぜINACTIVE状態の方がACTIVE状態よりもCPU負荷が高くなるのか教えて
> >> いただけないでしょうか.
> >> ExecutionContextはRTC内のステートマシンの状態によらず動作しているため,RTCが
> >> INACTIVEでもCPUを食うのはわかるのですが,ACTIVE状態のほうがonExecute()を
> >> 実行する分だけ負荷が高くなるように思えるのですが.
> >>
> >> 2010/7/6 kurihara shinji :
> >> > 松坂様
> >> >
> >> > お世話になっております。
> >> > 栗原です。
> >> >
> >> > ご連絡、有難うございます。
> >> > こちらで確認しましたところ、ご指摘頂きましたように、INACTIVE状態ではACTIVE状態に
> >> > 比べCPU負荷が高くなっておりました。
> >> >
> >> > これは、RTCの実行コンテキスト(PeriodicExecutionContext)がwhileループを回してい
> >> > るためでして、whileループ内ではデフォルトで 0.001 秒の sleep が入りますが、0.001
> >> > 秒の sleepでは cpu負荷が少々高くなるようです。
> >> > sleep時間を0.01秒にする事で負荷は約半分に軽減される事を確認しました。
> >> > # sleepが無い場合は、CPUは90%近くなります。
> >> >
> >> > 1msecでコンポーネントを実行する必要が無い場合は、お手数ですが、rtc.confファイル
> >> > に以下の一行を追記して、ご確認頂けますでしょうか。
> >> >
> >> > exec_cxt.periodic.rate: 10 # 10Hzです。
> >> >
> >> >
> >> > 以上、宜しくお願い致します。
> >> >
> >> >
> >> > On Tue, 6 Jul 2010 11:22:05 +0900
> >> > Yosuke Matsusaka wrote:
> >> >
> >> >> OpenRTM-aist開発者の皆様
> >> >>
> >> >> 産総研の松坂です。
> >> >>
> >> >> Python版のOpenRTM-aistに特有の問題ですが、コンポーネントがアクティブ状態にないときに
> >> >> CPU負荷が上昇する現象に遭遇しています。
> >> >> 私の環境だけかもしれませんが、確認してみていただけますでしょうか?
> >> >>
> >> >> 以下、再現方法です。
> >> >> 1.適当なPythonコンポーネントを起動(私は添付のスクリプトを使用しましたがそれ以外でも再現します)
> >> >> 2.コンソールでtopコマンドを入力(この時点でPythonコンポーネントの負荷が10%程度に上昇しているのが確認できます)
> >> >> 3.RTSystemEditor上でコンポーネントをアクティベート(Pythonコンポーネントの負荷が数%に低下)
> >> >> 4.RTSystemEditor上でコンポーネントをデアクティベート(Pythonコンポーネントの負荷が10%程度に上昇)
> >> >>
> >> >> 私の開発環境の詳細です。
> >> >> VMWare使用
> >> >> ホストPC:MacOS X (snow leopard)
> >> >> ゲストPC:Ubuntu 10.4
> >> >> OpenRTM:1.00-release (debパッケージ)
> >> >>
> >> >> もし何かわかりましたら教えてください。
> >> >>

root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01345] high CPU load when deactivate python com

栗原様
皆様

静岡大の清水です。

議論になっているECの件ですが、以前から気になってました。

一つお聞きしたいのですが、EC内の全てのRTCが
INACTIVEであれば、ECをstopしてしまうという実装は
RTC仕様の違反に当たるのでしょうか。

もし仕様違反でなければ、次のような実装はどうでしょうか。

- RTCのdeactivate時に、そのRTCに関連付けられている
各ECに含まれる全てのRTCの状態をチェックし、
もし全てのRTCがINACTIVEならそのECをstopしてしまう。

- RTCのactivate時に、そのRTCに関連付けられている
ECの状態をチェック(is_running)し、
もしstop状態であればstartさせる。

# 要は、ECをポーリングタイプではなく、
イベントドリブンタイプにしてしまうということです。

上記の実装はユーザRTCの中でもできますが、
OpenRTM-aistの標準実装としてしまえばよいのではと思います
。この実装で不都合な状況はありますでしょうか。

よろしくご検討ください。

清水

root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01366] high CPU load when deactivate python com

栗原さん

度々すいません。松坂です。

2010/7/6 kurihara shinji :
> 1msecでコンポーネントを実行する必要が無い場合は、お手数ですが、rtc.confファイル
> に以下の一行を追記して、ご確認頂けますでしょうか。
>
> exec_cxt.periodic.rate: 10 # 10Hzです。

上記の件、コンポーネントのソースの中に書いてしまおうと思ったのですが、
上手くいっていません(rtc.confに書いた場合上手くいきます)。
下記のように書くのではダメなのでしょうか?

consolein_spec = ["implementation_id", "ConsoleIn",
"type_name", "ConsoleIn",
"description", "Console input component",
"version", "1.0",
"vendor", "Shinji Kurihara",
"category", "example",
"activity_type", "DataFlowComponent",
"max_instance", "10",
"language", "Python",
"lang_type", "script",
"exec_cxt.periodic.rate", "0.2",
""]

ソース全体を添付しておきます。

root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01367] high CPU load when deactivate python com

松坂様

お世話になっております。
栗原です。

以下の8つにつきましては、rtc.conf(もしくは、DefaultConfiguration.py)
、もしくは、createComponent()の引数で指定する事になっております。

"exec_cxt.periodic.type",
"exec_cxt.periodic.rate",
"exec_cxt.evdriven.type",
"logger.enable",
"logger.log_level",
"naming.enable",
"naming.type",
"naming.formats"

これらの値は、以下の優先順位で決定される事になっておりまして、
"exec_cxt.periodic.rate"はDefaultConfiguration.pyにて"1000"に設定
されてますので、結果としてソースにてrateを指定しても、その値が使用
されません。

createComponent()の引数で指定された値 > component.conf >
rtc.conf(または、DefaultConfiguration.py) > ソースで指定

あと、追加情報ですが、以前のRTCBuilderでは、生成されたソース
に"exec_cxt.periodic.rate" が書かれておりましたが、最新版のRTCBuilder
では、rateを指定した場合、ソースではなく[コンポーネント名].confファイル
に出力されるようになりました。

もし、ソースに埋め込みたい場合は、以下のようにcreateComponent()の引数
にて指定する事は可能です。

# Create a component
comp = manager.createComponent("ConfigSample?exec_cxt.periodic.rate=1")

ConfigSample.pyを添付させて頂きます。

以上、宜しくお願い致します。

On Thu, 8 Jul 2010 15:33:57 +0900
Yosuke Matsusaka wrote:

> 栗原さん
>
> 度々すいません。松坂です。
>
> 2010/7/6 kurihara shinji :
> > 1msecでコンポーネントを実行する必要が無い場合は、お手数ですが、rtc.confファイル
> > に以下の一行を追記して、ご確認頂けますでしょうか。
> >
> > exec_cxt.periodic.rate: 10 # 10Hzです。
>
> 上記の件、コンポーネントのソースの中に書いてしまおうと思ったのですが、
> 上手くいっていません(rtc.confに書いた場合上手くいきます)。
> 下記のように書くのではダメなのでしょうか?
>
> consolein_spec = ["implementation_id", "ConsoleIn",
> "type_name", "ConsoleIn",
> "description", "Console input component",
> "version", "1.0",
> "vendor", "Shinji Kurihara",
> "category", "example",
> "activity_type", "DataFlowComponent",
> "max_instance", "10",
> "language", "Python",
> "lang_type", "script",
> "exec_cxt.periodic.rate", "0.2",
> ""]
>
> ソース全体を添付しておきます。
>

root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01368] high CPU load when deactivate python com

栗原さん

松坂です。

2010/7/8 kurihara shinji :
> 以下の8つにつきましては、rtc.conf(もしくは、DefaultConfiguration.py)
> 、もしくは、createComponent()の引数で指定する事になっております。
>
> "exec_cxt.periodic.type",
> "exec_cxt.periodic.rate",
> "exec_cxt.evdriven.type",
> "logger.enable",
> "logger.log_level",
> "naming.enable",
> "naming.type",
> "naming.formats"

そうでしたか、、、少し前まではpriodic.rateはソースの中に書けていたと思うので
おかしいなと思っていました。

> あと、追加情報ですが、以前のRTCBuilderでは、生成されたソース
> に"exec_cxt.periodic.rate" が書かれておりましたが、最新版のRTCBuilder
> では、rateを指定した場合、ソースではなく[コンポーネント名].confファイル
> に出力されるようになりました。

「[コンポーネント名].confファイル」は、どのフォルダにあるものが読まれるのでしょうか?
カレントディレクトリのみであれば私の用途だと使えないですが、rtc.confと同じように/etcに
置いたものも探して読んでくれるのであれば、うまく使えるかもしれません。

> もし、ソースに埋め込みたい場合は、以下のようにcreateComponent()の引数
> にて指定する事は可能です。
>
> # Create a component
> comp = manager.createComponent("ConfigSample?exec_cxt.periodic.rate=1")

ありがとございます。とりあえずはこれで行こうと思います。

root
Offline
Last seen: 1 day 11 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 01369] high CPU load when deactivate python com

松坂様

栗原です。

> そうでしたか、、、少し前まではpriodic.rateはソースの中に書けていたと思うので
> おかしいなと思っていました。
申し訳ございません。
確かに、少し前まではperiodic.rateはソースの中に書いた値が反映されており、先程の
優先順位の通りにはなっていなかったのですが、1.0.0-RELEASEでは、先程の優先順位の
通りになるように修正が入りました。(C++版も同様です。)

> 「[コンポーネント名].confファイル」は、どのフォルダにあるものが読まれるのでしょうか?
> カレントディレクトリのみであれば私の用途だと使えないですが、rtc.confと同じように/etcに
> 置いたものも探して読んでくれるのであれば、うまく使えるかもしれません。
以下のようにフルパスで記述する事で、ファイルがどこにあっても読み込まれます。

# rtc.conf
corba.nameservers: localhost
naming.formats: %n.rtc
logger.enable: NO
example.ConfigSample.config_file: /tmp/configsample.conf

# /tmp/configsample.conf
exec_cxt.periodic.rate: 10

[コンポーネント名].confファイルにつきましては、ConfigSample,Compositeサンプルあ
たりを参考にしていただければ幸いです。

以上、宜しくお願い致します。

On Thu, 8 Jul 2010 16:46:43 +0900
Yosuke Matsusaka wrote:

> 栗原さん
>
> 松坂です。
>
> 2010/7/8 kurihara shinji :
> > 以下の8つにつきましては、rtc.conf(もしくは、DefaultConfiguration.py)
> > 、もしくは、createComponent()の引数で指定する事になっております。
> >
> > "exec_cxt.periodic.type",
> > "exec_cxt.periodic.rate",
> > "exec_cxt.evdriven.type",
> > "logger.enable",
> > "logger.log_level",
> > "naming.enable",
> > "naming.type",
> > "naming.formats"
>
> そうでしたか、、、少し前まではpriodic.rateはソースの中に書けていたと思うので
> おかしいなと思っていました。
>
>
> > あと、追加情報ですが、以前のRTCBuilderでは、生成されたソース
> > に"exec_cxt.periodic.rate" が書かれておりましたが、最新版のRTCBuilder
> > では、rateを指定した場合、ソースではなく[コンポーネント名].confファイル
> > に出力されるようになりました。
>
> 「[コンポーネント名].confファイル」は、どのフォルダにあるものが読まれるのでしょうか?
> カレントディレクトリのみであれば私の用途だと使えないですが、rtc.confと同じように/etcに
> 置いたものも探して読んでくれるのであれば、うまく使えるかもしれません。
>
>
> > もし、ソースに埋め込みたい場合は、以下のようにcreateComponent()の引数
> > にて指定する事は可能です。
> >
> > # Create a component
> > comp = manager.createComponent("ConfigSample?exec_cxt.periodic.rate=1")
>
> ありがとございます。とりあえずはこれで行こうと思います。
>

Log in or register to post comments

Download

latest Releases : 2.0.0-RELESE

2.0.0-RELESE Download page

Number of Projects

Choreonoid

Motion editor/Dynamics simulator

OpenHRP3

Dynamics simulator

OpenRTP

Integrated Development Platform

AIST RTC collection

RT-Components collection by AIST

TORK

Tokyo Opensource Robotics Association

DAQ-Middleware

Middleware for DAQ (Data Aquisition) by KEK