Python 版 STARS server と導入例
○小菅 隆 A)、 Jan SzczesnyB)A)

高エネルギー加速器研究機構 物質構造科学研究所、 B)Deutsches Elektronen-Synchrotron (DESY)

1.はじめにSimple

上でユニークな Node name と呼ばれる ID を持つ事
TransmissionandRetrieval

Systemになっており、メッセージの宛先や送り主と使用さ(STARS) は比較的小規模なシステム向けの制御用れる。例えば “Term1”という Node name を持ったソフトウエアで、シンプルながら様々なシステムにSTARS client が“Dev1 xxx”のようなメッセージを柔軟に対応できる特徴を持っている。

STARS server に送ると、STARS server は “Dev1”[1]

STARS 開発以来、根幹をなす STARS server 部にはを宛先として認識し、Node name “Dev1”の STARSPerl が使用され、複数の OS 上で動作するマルチプ

client に “Term1>Dev1 xxx”のように送り主の情ラットフォームが実現されているが、新たに報を含めたメッセージを送信する。メッセージを受

Python3 を使用した Python 版 STARS server（以下け取った “Dev1”はこのメッセージを解析するこPySTARS）が新たに開発された。PySTARS ではマルチとで送り主等の情報を取得することができる。

プラットフォームの実現はもとより、マルチプロセ

STARS を使用したシステムでは、基本的に以上のッシングの機能を持たせることで、データ転送の効ようなテキストメッセージの送受を行う事で、様々率向上も目指した設計となっている。また昨今、ソな機能を実現していく事となる。

フトウエア開発の場面において Python の利用が盛んとなっており、PySTARS の開発は、今後の STARS システム構築を進めるうえで有利となる事が予想される。PySTARS はベンチマークテストなどが行われ、現在様々なシステムへの導入が進んでいる。
2.STARS の概要
STARS は高エネルギー加速器研究機構 物質構造科学研究所 放射光実験施設のビームライン制御やビームラインインターロックシステム[2]をはじめ、様々なシステムに導入されている。
STARS では一つの STARS server に対して複数のSTARS client が TCP/IP socket で接続し、それぞれが STARS server との間でテキストベースのメッセージを送受する(図 1)。単体で動作する一般的な制図 1 STARS の概要(STARS tutorial http://stars.kek.jp/STARS_Tutorial.pdf より)

御アプリケーションが、様々な機能を実現するため

なお、STARS にはこのほかにも STARS client が接に Function library などを利用するのに対し、続する際にホスト名のチェック、キーワードによるSTARS ではこれらの STARS client 毎に機能を持たせチェックなどの機能がある。また、STARS Bridge とる。なお、前述のように接続は TCP/IP socket を使呼ばれる STARS client を利用する事で、他の STARS用したプロセス間通信であるので、各 STARS clientシステムと接続する事も可能である。

及び STARS server を同一 PC 上で動作させる事も、STARS 関連のソフトウエアは STARS のウェブサイネットワークで接続された複数の PC 上に分散させト[3]を通じ、ダウンロードし無料で利用する事が出ることも可能であり、柔軟なシステム構成を行う事来る。

が出来る。また、STARS client の接続、切断に関し

3.PySTARSてはシステム全体を停止する必要がないので、シス

STARS を使用したシステムに於いて STARS server

テムの運転を続けたまま機能の追加、削除を行う事は根幹をなすもので、各 STARS client とメッセージが出来る。の送受を行う。Perl 版の STARS server はシングル

全ての STARS client は、一つの STARS システムスレッドであり、更に STARS client からのメッセー

ジは select 関数によりシーケンシャルに扱っている。そのため STARS server が、ある STARS clientにデータを送受している間、他の STARS client からのデータはバッファリングされるのみで、目的のPython PyStars.py (Windows anaconda3 等)
あるいはPython3 PyStars.py (Linux 等)と入力する。

STARS client へのデータ送出は STARS server が処

図 2 はシングルスレッドモードで PySTARS が起動理を終えるまで待たされる事となる。短いコマンドした際の(WSL Ubuntu 20.04.4 LTS)のスクリーンシなどのメッセージ送受の場合、これは特に問題となョットである。

らないが、大量データの送受に対してはこの部分がボトルネックとなる可能性大きい。
PySTARS ではシングルスレッドでの動作自体の高速化も図られているが、マルチプロセッシングにより大量データ転送の場合でも他の STARS client が待たされる事を防ぐ機能が実装された。

3.1 Python のマルチスレッディング
Python ではマルチスレッディングの機能が容易に利用可能で、プログラミングの際には大きなアド

図 2 PySTARS をシングルスレッドモードで起動
また、以下は telnet client を使用、複数の STARS
client として PySTARS に接続した際の各プロセスの様子(ps コマンド出力)である。

バンテージとなる。当初、PySTARS 開発においてもマルチスレッディング機能利用の検討を行った。しかし Python に備わっているグローバルインターブリタロック(GIL)に関連する制約から単純にマルチ

458 tty1
462 tty2
463 tty4
464 tty5

SSS
S

0:00 python3 PyStars.py
0:00 telnet localhost 6057
0:00 telnet localhost 6057
0:00 telnet localhost 6057

スレッド化するだけでは STARS server の高速化はシングルスレッドモードの場合は、複数の telnet難しい事が分かった。このためマルチプロセッシン

client に対して PySTARS プロセスが 1 つだけ実行さグを基盤とする開発へと進むこととなった。

れていることが分かる。

3.2 設定ファイルと実際の実行
PySTARS は設定ファイルの編集を行う事でシング
ルスレッドモード、マルチプロセッシングモードの切り替え等が可能である。以下に PySTARS の設定ファイルである PyStars.cfg の内容を示す。
[param]starsport= 6057starslib= takaserv-lib# if empty use starslib directorystarskey=# if true use Multiprocessing verionstarsmulti= no以上のうち starsport、starslib、starskey については、デフォルトの状態で STARS server の一般的な値となっているので特に変更する必要はない。
PySTARS はデフォルト設定ではシングルスレッドモードで動作するようになっているが starsmulti の項目を “yes”とする事でマルチプロセッシングモードでの動作となる。
PySTARS を実行するためにはあらかじめ Python3がインストールされている必要がある。Windows ではコマンド プロンプトあるいは PowerShell、Linuxではコマンドラインなどから、

図 3 PySTRS をマルチプロセッシングモードで起動
一方マルチプロセッシングモードで実行した場合(図 3)は、以下の通り 3 つの telnet client 毎にPySTARS のサブプロセスが実行される事が確認できている。
468 tty1 Sl 0:00 python3 PyStars.py
469 tty1 S 0:00 /usr/bin/python3 -c from multiproces
sing.resource_tracker import main;main(5)474 tty2 S 0:00 telnet localhost 6057
475 tty1 Sl 0:00 /usr/bin/python3 -c from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=6, pipe_handle=12) --multiprocessing-fork
478 tty4 S 0:00 telnet localhost 6057
479 tty1 Sl 0:00 /usr/bin/python3 -c from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=6, pipe_handle=16) --multiprocessing-fork
482 tty5 S 0:00 telnet localhost 6057
483 tty1 Sl 0:00 /usr/bin/python3 -c from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=6, pipe_handle=20) --multiprocessing-fork

4.ベンチマークテスト
PySTARS についてこれまでの Perl 版 STARS serverとの比較のために、いくつかの条件について負荷テストを実施した。

4.1 テストの概要
今回の動作テストのために、Load tester というSTARS client を作成した。この Load tester はあらかじめ送り先(他の Load tester)と data の長さを他の STARS client からのコマンドによりセットし、_Trigger イベントを送信する事でFrom>To Test Data........のようにセットされた長さの文字列を含むテスト用を通して(100Mbps)通信を行った場合(Remote)について、次のような条件でテストを行った。
 Load tester (Python) 1 対 1 での送信テスト
 Load tester (Python) 4 対 2 での送信テスト
 Load tester (Python) 5 対 5 での送信テスト
 Load tester (Perl) 1 対 1 での送信テスト
 Load tester (Perl) 4 対 2 での送信テスト
 Load tester (Perl) 5 対 5 での送信テスト
なお stars.py については長いメッセージを扱う事が出来ないというバグの修正と速度を改善するための改造が行われている。今回テストに使用した PCのスペックは次の通りである。の Test コマンドメッセージを送出する。 また、

STARS server 及び Local Load tester が動作する

Load tester はこのコマンドメッセージを受け取る

PCと、

From>To @Test DataLengthのように、受け取ったデータ長を返信するようになっているので、複数の Load tester を立ち上げると、それぞれの間でのデータ送受が任意に行える。更にLoad tester は、 _Trigger イベントの受信した時間を 0 として、Test コマンドを送信開始までの時
間、コマンド送信完了までの時間、@Test リプライ
メッセージの内容及び受けとるまでの時間をそれぞれ System にイベントとして送る。 観測を行う
Client ではあらかじめ Test コマンドを送信する
Client に flgon しておくことで、これらの時間の記録を行う事が出来る(図 4)。Load tester としてはPython 版のもの及びまったく同じ動作をする Perl

CPU: Intel(R) Core(TM) i7-7700 CPU @ 3.60GHzOS: Ubuntu 18.04.4 LTS
Python version: 3.6.9
Perl version: 5.26.1
Remote Load tester 用 PC
CPU: Intel(R) Core(TM) i5-7500T CPU @ 2.70GHz
OS: Windows 10 Pro + WSL + Ubuntu 18.04.4 LTS
Python version: 3.6.9
Perl version: 5.26.1

4.2 STARS client 1 to 1 の負荷テスト
まずはじめに 1 対の Load tester による負荷テストを行った(図 5)。このテストでは Server と Clientの組み合わせを変えるとともに一度に送信するメッセージ(データ)の大きさを変えて、それぞれの転送速度を計測している。

版のものを作成した。

図 5 STARS client 1 to 1 負荷テストの概要
図 6 は結果をプロットしたグラフである。横軸は一度に送るデータ長、縦軸は転送にかかった時間及び送信データの長さより計算した転送速度である（以下示すグラフも同様）。データ長が 100kB を超え
図 4 ベンチマークテストの概要
今回はこれまでの Perl 版 STARS server (PerlServer)、PySTARS シングルスレッドモード(グラフ中では Python Single Server と記述) 及び PySTARS
マルチプロセッシングモード(グラフ中では Python
Multi Server と記述)について、STARS server 及びLoad tester を同一の PC で動作させた場合(Local)と、Load tester を別の PC で動作させネットワーク

ると、PySTARS 及び、Python 版の Load tester を組み合わせた場合の測度が大きく向上している。なお、
Perl 版では時間がかかりすぎるため、10MB までのテストとしている。 シングルスレッドモードの
PySTARS が最速ではあるが、マルチプロセッシングモードの PySTARS が転送速度を維持しているのに対し、シングルスレッドモードの STARS server には速度の低下がみられる。

図 6 STARS client 1 to 1 負荷テストの結果

4.3 STARS client 4 to 2 の負荷テスト
次に 4 つの Load tester から 2 つの Load tester

図 9 STARS client 5 to 5 負荷テストの概要に送信した場合のテスト(4 to 2: 2 つの Loadtester から 1 つの Load tester に同時送信、それを2 組)を行った(図 7)。

図 10 は本テストに於いてすべての STARS clientを 1 台の PC 上で動作させた場合の結果である。転送データ長が長くなった場合、若干の速度低下が認められるが、PySTARS のマルチプロセッシングモードが最速となっている。

図 7 STARS client 4 to 2 負荷テストの概要
図 10 STARS client 5 to 5 負荷テスト(Local)
図 8 は 4 to 2 でのテスト結果である。PySTARS マ
ルチプロセッシングモードが他のものに比べると圧倒的に高速である事が分かる。100MB に於いて若干の測度低下が認められるが、やはり PySTARS マルチプロセッシングモードが最速となっている。

図 11 は STARS server が動作する PC と別の PC 上
で Load tester を動作させ、5 to 5 のテストをネットワーク(100Mbps)を通して行った結果である。1MBから 10MB までは PySTARS シングルスレッドモードが若干早くなっているが、100MB では PySTARS マルチプロセッシングモードが最速となった。

図 8 STARS client 4 to 2 負荷テストの結果

4.4 STARS client 5 to 5 の負荷テスト

図 11 STARS client 5 to 5 負荷テスト(Remote)

更に高負荷を想定して、図 9 に示すように 5 つのLoad tester からそれに対応する 5 つの Load tester
へ送信試験を行った。

5.システムへの導入と安定性の確認
今回 PySTARS を Alarm 通報システム構築に際して採用、安定性等の確認を行った。Alarm 通報システ
ムは PF のビームラインインターロックシステムにSTARS Bridge を使用して接続され、ビームラインインターロックシステムの状況をモニターする。もしビームラインに何らかの異常が発生した場合は、Arduino UNO を通じてマルチ通報機(株式会社タカコ

ム製 ADS-100)により担当者への電話連絡がされるとともに、関係者にメールによる通知が行われる(図12)。

6.まとめ
以上の通り、新たに開発された Python 版 STARS
server PySTARS の速度確認を行った結果は非常に良好であり、状況によってはこれまでの Perl 版 STARSserver に比べて 10 倍以上の速度向上を確認できた。
PySTARS については実際のシステムへの導入を更に進行させる予定である。
参考文献[1] T. Kosuge and Y. Nagatani, “STARS: Current
Development Status,” in Proc. PCaPAC’14, Karlsruhe,Germany, Oct. 2014, paper WPO019, p. 75.

図 12 Alarm 通報システム
これまで、Alarm 通報システムの運用を通してPySTARS の有効性と安定運転が確認されている。

[2] 小菅隆、仁谷浩明 新しいビームラインインターロックシステムと導入の効率化 高エネルギー加速器研究機構 技術研究会 2016 報告集 (2016)[3] http://stars.kek.jp/