SPADI-A Wiki/SPADI-A DAQ マニュアル/イントロダクション/パッケージの各要素/NestDAQ


NestDAQ

(執筆完了時削除 --> 執筆責任者: 洲波泥 太郎, 執筆締め切り: 2024/xx/xx)

ここでは、DAQシステムを動かす上で最低限理解しておきたい NestDAQ の概要を説明する。さらに、NestDAQ関連情報へのリンクを示す。詳しい情報は各リンクを参照のこと。

NestDAQ について

NestDAQ は連続読み出し FEE のために開発された DAQ ソフトウェアフレームワークである。高いスケーラビリティを持つことを目標に設計されており、データ処理のプロセスをネットワーク上のコンピュータに分散可能な、いわゆるネットワーク分散型の DAQ ソフトウェアである。小規模実験から中規模実験の加速器物理実験における連続読み出し型 DAQ システムを念頭に設計されているが、汎用のフレームワークであるため、連続読み出しを行いたい計測機器やトリガー型 DAQ にも対応可能であると考えられる。

NestDAQ は GSI FAIR で開発されている DAQ フレームワーク FairMQ をベースにしている。DAQ プロセス間の接続トポロジーの管理には、in-memory key-value データベースである Redis を用いる。さらに、NestDAQ では DAQ のスタータス情報、メトリックス情報といった情報を取得するための各種プラグインが用意されている。非常に単純化した場合、"NestDAQ = FairMQ + Redis + 各種プラグイン"と言うことができる。ここで、FairMQ は ZeroMQ と呼ばれるライブラリを用いて作られており、FAIR + ZeroMQ = FairMQ ということでこの名前になったと予想される。

DAQのコントロールの概要

NestDAQ はネットワーク分散型の DAQ であり、1 つまたは複数の計算機において DAQ プログラムのプロセスを走らせ、Redis データベース経由で各プロセスの制御を行う。 NestDAQ では、各プロセスのことを FairMQ デバイスと呼ぶ。また、Redisデータベースでは DAQ の状態 (Runが走っているか、または止まっているかなどの状態) の情報も保持している。この情報をもとに NestDAQ は DAQ の状態管理を行っている。各 FairMQ デバイスは Redis と通信を行うことが可能であり (?) 、Redis に対してコマンドが発行されると、そのコマンドは各 FairMQ デバイスに転送される。例えば Run をスタートさせる場合、Redis に対して Run スタートのコマンドを発行 (Publish) すると、Redis が各プロセスに Run スタートの情報を伝達し、すべての DAQ プロセスが Run 状態に遷移して、データ収集が開始する。ランストップといった他のコントロールも同様にして行われる。通常、DAQ のコントロールは、Web ブラウザ上の DAQ コントローラと呼ばれるユーザーインターフェースから行う。Web コントローラでは、グラフィカルにスタートボタンやストップボタンといったボタンをクリックすることで、簡単に DAQ のコントロールが可能となっている。ただ、必ずしもこのコントローラを使用する必要はなく、Linux のコマンドライン上から redis-cli というコマンドを用いて直接 Publish コマンドを Redis に対して発行することで DAQ のコントロールが可能である。つまり、最低限 FairMQ デバイスと Redis データベースが立ち上がっていればデータ収集が可能であり、言い換えると DAQ ソフトウェアの最小構成は FairMQ デバイスと Redis データベースであると言える。場合によっては Web コントローラを用いず、DAQ の ランスタート、ランストップのシェルスクリプトを用いて DAQ の制御を行うこともある。FairMQ デバイスと Redis、もしくは Redis と Web コントローラはそれぞれ弱く結合するように設計されており、これによってシステムの堅牢性を確保している。(一般に、強く結合したシステムは一箇所に不具合が起きただけで全体に影響がおよぶため、堅牢性が低下し、脆弱なシステムとなる。)

トポロジー

各 FairMQ デバイスはデータを前段の FairMQ デバイス (Sampler の場合は FEE) からデータを受け取り、なんらかの処理を行なって後段のFiarMQ デバイス (Sink の場合はストレージ) に送る。ここで、どのデバイスがどのデバイスにデータを送るかという送信元と送信先の接続情報を、すべてのデバイスに対して決めたものをトポロジーと呼ぶ。一般に、トポロジーとは要素間の接続のされ方を端的に表現したものであり、例えば、スター型接続、デイジーチェーン(数珠つなぎ)接続、網目状(蜘蛛の巣状)接続といった幾何学的な接続の様式を一言で表したものである。NestDAQでは、各FairMQデバイス間の接続が 1 対 1 であったり、n 対 m であったりするが、すべてのデバイスをどのように接続するかを決めたものをトポロジーと呼んでいる。具体的にトポロジーを設定するには、設定スクリプトを書き、それを走らせることで、トポロジーの設定を行う。実際のスクリプトの書き方については、チュートリアルを参照のこと。

FairMQデバイスに与えるパラメータ

各 FairMQ デバイスに対して、しばしば何らかの値、すなわちパラメータを渡したいことがある。このパラメータも Redis データベースによって管理されており、ランのスタート、もしくはストップの前後のタイミングで Redis データベースからパラメータの値を読み込んで利用する。例えば、FEEの IPアドレスなどの設定もパラメータを用いて設定している。一方、Redis経由でパラメータを設定する他に、FairMQ 起動時にパラメータを設定することも可能である。具体的にパラメータを設定するには、設定スクリプトを書き、それを走らせることで、パラメータの設定を行う。実際のスクリプトの書き方についてはチュートリアルを参照のこと。FairMQデバイスにおいてどのようなパラメータが存在するかは、FairMQ デバイスを実行する際に、--help オプションをつけて実行するとパラメータの一覧とその役割が確認できる。ただ、網羅されていない場合もあり、--help オプションで見つけられないパラメータはソースコードを読んでパラメータの役割を理解し、値を設定する。

各FairMQ デバイスについて

NestDAQ では Front End Electronics (FEE) から止めどなく (Stream のように) 流れてくるデータを、Sampler プロセッサ (FairMQ デバイス) が受けとり、処理を行なって、次の FairMQ デバイスに流して処理を行っていく。(このように、データを処理するプロセッサを直列につなぎ、あるプロセッサの出力があるプロセッサの入力になるように処理することをパイプライン処理と呼ぶ(あってる?)。)ここでは、 FairMQで用いられているそれぞれの FairMQ デバイスの役割を説明する。

Sampler は AMANEQ、CIRASAME といった FEE に TCP/IP プロトコルで接続し、TDC データ、及びデリミタデータを TCP 通信で読み出すための FairMQ デバイスである。https://github.com/spadi-alliance/nestdaq-user-impl のソースコードでは、AmQStrTdcSampler というデバイス名になっている。CIRASAME の出力データ構造は AMANEQ と同一であるため、CIRASAME のデータは AmQStrTdcSampler を用いて読み出すことが可能である。Sampler は各 FEE ボードと 1 対 1で通信を行うため、FEE ボード 1 台につき 1 つの Sampler を立ち上げる必要がある。AmQStrTdcSampler に与えるパラメータは Front End Electronics の IP アドレスと FEM type と呼ばれる番号である。FEM type は現状で以下のようにするのが慣例である。(ユーザーが定義することもできるが、混乱を招かないように、新しい番号を利用する場合は SPADI Alliance でまず提案することが望ましい。)

実行環境

NestDAQ は RedHat 系の Linux 上での運用を想定しており、現時点 (2024年9月) における推奨実行環境は AlmaLinux 最新版の AlmaLinux 9.4 である。CentOS 7, AlmaLinux 8, AlmaLinux 9 などの RedHat Enterprise Linux (RHEL) のクローンにおいて稼働実績があり、最近の RedHat 系 Linux ではだいたい運用可能であると考えられる。また、Ubuntu 22.04.3 LTS といった Ubuntu/Debian 系の Linux でもコンパイル実績はあるが、本番実験で使用された例はない。また、ソースコードの軽微な修正を行うことで MacOS (Intel CPU) でも clang を用いてコンパイルが通ることがわかっているが、詳しく動作確認された例はない。最近では Windows において Windows Subsystem for Linux (WSL) を用いることで Linux が利用可能になっており、おそらく NestDAQ も動くと考えられるが、検証された例はない。

NestDAQ は ZeroMQ、Boost といったライブラリが必要であり、NestDAQ をインストールする際は事前に各種ライブラリをインストールしておく必要がある。詳細はインストールのインストラクションを参照のこと。C++ のコンパイラとして比較的新しい GCC の g++ が必要である。clang によるコンパイルはあまり実績がないため、g++ によるコンパイルが望ましい。

また、KEK INPS の千代氏が Apptainer 用のコンテナを用意しており、これを用いることでOS非依存にインストールを行わずに NestDAQ を利用可能である。

本稿執筆者

2024/xx/xx 洲波泥 太郎 (SPADI大学), 脱九 花子 (SPADI大学)
2024/xx/xx 脱九 花子 (SPADI大学)