daqmw-core.2013-03-18 - Redmine for OpenRTM-aist

DAQ-Middleware
Core Meeting
千代浩司
大学共同利用機関法人
高エネルギー加速器研究機構
2013-03-18
1
もくじ
• 報告
– 産総研 KEK 共同研究 延長
– BBTとの共同研究(継続)
– J-PARC hadron E16 (High Pt)
– 2012(平成24)年度活動予定と結果(2012-12-14
に報告済み、再掲)
– 2013年度計画
– タイムアウトにまつわるバグフィックス
redmine: https://daqmw.kek.jp/redmine/issues/130
2013-03-18
2
産総研 KEK 共同研究 延長
2.研究題目
次世代高エネルギー加速器データ収集・制御システムに関する研究
3.研究目的
複数の先端計測・制御機器をネットワーク接続して運用する、データ収集のため
の計測・制御系の共通の枠組みを提供することで、実験系のニーズに応じたシス
テム化が容易になるとともに、データ収集やデータ解析の効率化を図る。
4.内容及び目標
産総研が研究・開発をおこなっているロボット用ミドルウエア技術(OpenRTM-aist)
やFPGAハードウエア技術を活用して、次世代高エネルギー加速器実験を効率的
に実施出来る先端計測・制御システムのフレームワークを構築する。
産総研
神徳 徹雄、安藤 慶昭、関山
KEK
内田、田中、千代
2013-03-18
守、谷川 民生、小島 一浩、鈴木 良一、大島 永康、原 功
3
BBTとの共同研究(継続)
研究題目
DAQミドルウェアによる多チャンネル高速データ読出システムの研究開発
25年度は、エラー発生時の動作安定化や原因特定のための機能を強化しつつ、
実験に係る周辺デバイスの監視・制御について調査、検討する予定である。
BBT: 和田正樹、間中祐介、渡辺利行
KEK: 千代
2013-03-18
4
J-PARC hadron E16
• 2年後に実験開始
• 読み出しシステムの検討
• 読み出しソフト 今週の予定
– SiTCP VMEを使って、読み出しテストを行う。
– SiTCP VME MasterモジュールはJ-PARC MLF中性
子 BL 03 (iBIX, 茨城県生物)の方からお借りした。
– SiTCP VME Masterモジュールを読むコードの使用
許可もいただいた。
2013-03-18
5
2012-03-15
DAQ-Middleware
Core Meeting
(赤文字は今回追加し
たもの)
来年度の予定 (1)
• (株)BBTとの共同研究は研究代表者が千代
にかわり2012年度も行うことになりました(あ
りがとうございます)。和田さんの他に間中さ
ん、渡辺さんが参加されます。
• トレーニングコース
KEK以外での開催 (RCNPで開催できた)
• DAQセミナー (京都大学で開催され、1日ソフ
ト関連の日で講義を行った)
2012-3-15
6
2012-03-15
DAQ-Middleware
Core Meeting
(赤文字は今回追加し
たもの)
来年度の予定 (2)
• Scientific Linux 6.2への対応
– すでに判明している改修しなければならない点
SL 6.2に入っているもので
• mod_python → mod_wsgi の変更 (パッケージ名として
mod_pythonも使えるが中身はmod_wsgi)
• xerces-c 3.0が含まれるようになった(SL 5.x用DAQMiddlewareでは xerces-c 2.7を使っていた)。2.7 → 3.0でAPI
が変わったのでコードを変更する必要がある。
• mod_python, xerces-c 2.7のままでよいということであれば
動くがデプロイ上問題があるか? (毎日実行されている
yum updateでxerces-c 2.7 → 3.0 にいつのまにかアップデー
トされるなど)
DAQ-Middleware 1.2.0で xerces-3.x対応済。各種linux distribution対応用枠組み
を入れた。
2012-3-15
7
2012-03-15
DAQ-Middleware
Core Meeting
(赤文字は今回追加し
たもの)
•
来年度の予定 (3)
Debian, Ubuntu系への対応
– debパッケージの作成とネットワーク経由セットアップスクリプトの作成 (井上さんの作業。報
告)
•
GUI
– WebUI以外のパネル (安さん作のものができた。一部問題あり。回避案あり。)
– config.xml作成GUI (仲吉さん作成のものをベースに拡張する)
(配布物にまだ入れていない。仲吉さん作のもので問題はない)
•
DAQ-Middleware自体のテストシステム
– 昨年DaqOpeartorのメモリーリーク等があったのでリリース前にリグレッションが無いかテスト
することができれば便利かと思う。
(手つかず)
•
ホームページ改装
– 日本語と英語
(ホームページは未対応。「開発マニュアル」英訳は会社に発注した。2013年1月末に納品。
品質はかなりよい模様。
http://daqmw.kek.jp/docs/daqmw-eng.doc
に置いてある)
2012-3-15
8
2013(平成25)年度行事予定
• トレーニングコース
– 2013年9月上旬 広島工業大学
• 広工大で講演会(1日)+トレーニングコース1(DAQMiddleware、2日) + トレーニングコース2(FPGA、2日)
2013 08
の予定
Su Mo Tu We Th
1
4 5 6 7 8
11 12 13 14 15
18 19 20 21 22
25 26 27 28 29
Fr
2
9
16
23
30
Sa
3
10
17
24
31
– KEK停電 2013/08/05(月)~07(水)
8/19の週あたり
2013 09
– 阪大?
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
2013-03-18
9
2013(平成25)年度活動予定
• GUI (config.xml作成、操作パネル)をソースツ
リーへ
• その他まだソースに反映されていない修正な
ど(redmineを見よ)
• エラー発生時の動作安定化や原因特定のた
めの機能を強化
• 制御系準備
2013-03-18
10
タイムアウトのバグフィックス(1)
• コンポーネントのデータバッファ
– 現在InPortのみリングバッファを使っている
• バッファの有無はRTのしくみでコンポーネント接続時に指定
– タイムアウト付きブロックリード
• 読むデータがなくタイムアウトしたあとは通常どおり一度
daq_run()を終了して、またdaq_run()を始める
– タイムアウトの指定はDaqOperatorがコンポーネント
接続時に指定
– 現在は100msでハードコーディング
– 100ms !! (といえば) (次のスライド)
2013-03-18
11
DAQ-Middleware
Core Meeting
2012-03-15
(1年前)
転送速度が突如変動する問題
Source
256kB送る場合
16384
Sink
:
:
28
GIOP Fragment 16
ackのみ
GIOP reply
28
A
B
GIOP request 60
16384
16384
2013-03-18
12
DAQ-Middleware
Core Meeting
2012-03-15
(1年前)
この断層は今回は
とりあげません(未
解決)(2013-03)
ズームすると1秒おき1
00ミリ秒だけはやく
なっている。
100ミリ秒といえばスケ
ジューラ?
(2013-03追記)
違いました。
タイムアウトを200msに
すると左図で小さくなっ
ている時間が
100ms→200msに連動
した
2013-03-18
13
タイムアウト調査 (1)
Source
Sink
• Sourceから300ms置きにデータを送ってSink
側でInPortのread()にかかる時間を測定
• 100msのタイムアウトなので連続してread()に
100msかかるはず
2013-03-18
14
タイムアウト調査 (2)
2013-03-18
15
タイムアウト調査 (3)
2013-03-18
16
タイムアウト調査 (4)
• 絶対時刻で最初の整数秒からの読み取りの
み正常に100msかかっている。よく見ると:
0.04+0.06で100ms
2013-03-18
17
タイムアウト調査 (5)
• InPort read()のタイムアウト設定コードは
OpenRTM-aistの
src/lib/coil/posix/coil/Condition.h 。
1秒以下のタイムアウトはうまく設定されない
bool wait(long second, long nano_second = 0)
{
timespec abstime;
abstime.tv_sec = std::time(0) + second;
abstime.tv_nsec = nano_second;
return 0 == ::pthread_cond_timedwait(&m_cond, &m_mutex.mutex_, &abstime);
}
2013-03-18
18
タイムアウト調査 (6)
• pthread_cond_timedwait()はタイムアウトを絶
対時刻で指定する:
int pthread_cond_timedwait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex,
const struct timespec *restrict abstime);
2013-03-18
19
pthread_cond_timedwait()
RATIONALE
man 3p pthread_cond_timedwait
Timed Wait Semantics
An absolute time measure was chosen for specifying the timeout parameter for two reasons. First, a relative time measure can be easily
implemented on top of a function that specifies absolute time, but
there is a race condition associated with specifying an absolute timeout on top of a function that specifies relative timeouts. For example, assume that clock_gettime() returns the current time and cond_relative_timed_wait() uses relative timeouts:
clock_gettime(CLOCK_REALTIME, &now)
reltime = sleep_til_this_absolute_time -now;
cond_relative_timed_wait(c, m, &reltime);
If the thread is preempted between the first statement and the last
statement, the thread blocks for too long. Blocking, however, is irrelevant if an absolute timeout is used. An absolute timeout also need not
be recomputed if it is used multiple times in a loop, such as that
enclosing a condition wait.
For cases when the system clock is advanced discontinuously by an operator, it is expected that implementations process any timed wait expiring at an intervening time as if that time had actually occurred.
2013-03-18
20
タイムアウト調査 (7)
• ミリ秒程度のタイムアウトを許す修正案
bool wait(long second, long nano_second = 0)
{
struct timeval tv;
timespec abstime;
::gettimeofday(&tv, NULL);
abstime.tv_sec = tv.tv_sec + second;
abstime.tv_nsec = tv.tv_usec*1000 + nano_second;
if (abstime.tv_nsec >= 1000000000) {
abstime.tv_nsec -= 1000000000;
abstime.tv_sec ++;
}
return 0 == ::pthread_cond_timedwait(&m_cond, &m_mutex.mutex_, &abstime);
}
2013-03-18
21
タイムアウト調査 (8)
Source
Sink
• Sourceから350ms間隔でデータを送る
– +50msはスリープから解除されるのを確認するため
2013-03-18
22
タイムアウト調査 (9)
修正案で修正後の
テスト。
3回100msでタイム
アウトし、次は50ms
まってデータがきた
ので読んでいる。
2013-03-18
23
DAQ-Middleware
Core Meeting
2012-03-15
(1年前)
転送速度が突如変動する問題
Source
256kB送る場合
16384
Sink
:
:
28
GIOP Fragment 16
ackのみ
GIOP reply
28
A
B
GIOP request 60
16384
16384
2013-03-18
24
修正前後のリプライ時間差 (1)
• 修正前の確認(計算機がかわったので)。前のスライドでAの時間
– ぴょんぴょんはねているのは50ms間隔(あとで説明)
タイムアウト
修正前
2013-03-18
Source - Sink
taskset -c 1 Source
taskset -c 2,3 Sink
Sourceは一度に256kB送
る
100us付近の拡大図は次
のスライド
25
修正前後のリプライ時間差 (2)
タイムアウト
修正前
2013-03-18
前ページの図、縦軸
100us付近の拡大図。
Source - Sink
taskset -c 1 Source
taskset -c 2,3 Sink
Sourceは一度に256kB送
る
26
修正前後のリプライ時間差 (3)
タイムアウト
修正後
2013-03-18
Source - Sink
taskset -c 1 Source
taskset -c 2,3 Sink
Sourceは一度に256kB送
る
100us付近の拡大図は次
のスライド
27
修正前後のリプライ時間差 (4)
タイムアウト
修正後
2013-03-18
前のスライドの100us
付近のズーム。
1秒間隔で、100msだ
け小さくなることはなく
なった(あるいは
900msだけ大きくなる
ことはなくなった)。
大きさはタイムアウト
パッチを当てるまえの
100msだけの小さい
ほうのレベル(80us)
にあっている。
28
50ms間隔とはなにか
• とても正確に50ms間隔なので、適当に大きく
なっているわけではなさそう。
• omniORBの設定ファイルのサンプルを見る。
############################################################################
# connectionWatchPeriod
#
# For each endpoint, the ORB allocates a thread to watch for new
# connections and to monitor existing connections for calls that
# should be handed by the thread pool. The thread blocks in select()
# or similar for a period, after which it re-scans the lists of
# connections it should watch. This parameter is specified in
# microseconds.
#
# Valid values = (n >= 0 in microseconds)
#
connectionWatchPeriod = 50000
2013-03-18
29
connectionWatchPeriod = 200ms
/etc/omniORB.cfg
InitRef = NameService=corbaname::127.0.0.1:2809
supportBootstrapAgent = 1
connectionWatchPeriod = 200000 # 200 ms
200ms間隔になったので
これであろう。
2013-03-18
30
taskset -c 2,3 for SinkComp
• taskset: そのプロセス(あるいはそこから発生するス
レッド)が動作するCPUコアを指定するコマンド。
• いままのでテストでは
– CPU #1にSourceComp
– CPU #2, #3にSinkComp
– (註)DAQ-Middleware配布物にはこのようにセットしている
ところはない。
• ラン中にCPUコアが移動し、L2キャッシュの効き具合が
かわるのを防ぐためにtasksetして計測していた
• SinkCompはメインスレッドとInPortスレッドでCPUを1個
以上消費することがあるので2個指定している。
2013-03-18
31
taskset -c 2,3,4 for SinkComp
taskset -c 2,3,4 SinkComp
/etc/omniORB.cfg
InitRef = NameService=corbaname::127.0.0.1:2809
supportBootstrapAgent = 1
connectionWatchPeriod = 200000 # 200 ms
2013-03-18
32
tasksetせず
tasksetで走るCPUコア
を指定しないで走ら
せた場合。
/etc/omniORB.cfg
InitRef = NameService=corbaname::127.0.0.1:2809
supportBootstrapAgent = 1
connectionWatchPeriod = 200000 # 200 ms
2013-03-18
33
タイムアウトまとめ
• src/lib/coil/posix/coil/Condition.hの修正案で
十分かどうか確認
• connectionWatchPeriodの値を大きくするか検
討。
2013-03-18
34