ここではSuperKEKB向けにセットアップした際の内容が記述されているため、適宜読み換えていただきたい。 == 概要 == Channel ArchiverはSpallation Neutron Source(SNS)でC++を用いて開発された、EPICSのデータを記録するためのツールセットである。[[BR]] その中心となるArchive Engine はChannel Access(CA)を介して複数のCA Server(IOC)からデータを収集する。[[BR]] 収集したデータは定期的に独自のバイナリ形式でローカルディスクファイル(データファイル)に書き出され、インデックスファイルによって関連付けられる(インデックスはR木で実装されている)。[[BR]] これらの履歴データはXML-RPCを実装したData Serverを起動することで、ネットワーク上の他計算機からも読出すことができる。[[BR]] == ビルド方法 == 以下の環境でビルドできたことを確認済み。[[BR]] ||= OS =|| CentOS 6.7 64bit || CentOS 7 64bit || ||= GCC =|| 4.4.7 || 4.8.5 || ||= EPICS Base =|| 3.14.12.4 || 3.14.12.3 / 3.14.12.5 || 1. '''EPICS Base及びExtensions セットアップ'''[[BR]] まずは EPICS Base 及び Extensions をセットアップする。[[BR]] これについては、[wiki:epics/install EPICSをゼロからインストール]に手順が記載されているため、ここでは説明を割愛する。 2. '''ソース ダウンロード'''[[BR]] githubからクローンし、masterブランチでチェックアウトする。これよりも前?のバージョンはタグで管理されているようだ。 {{{ $ cd $EPICS_EXTENSIONS/src $ git clone https://github.com/EPICSTools/ChannelArchiver $ cd ChannelArchiver $ git checkout --track origin/master }}} 3. '''必要なライブラリの整備'''[[BR]] !ChannelArchiver/ThirdPartyディレクトリに、ビルド時に利用されるライブラリパッケージが用意されている。[[BR]] 今回インストールしたライブラリは下記の通り。[[BR]] なお、__xerces-c-devel及びperl-Frontier-RPCはソースからインストール__し、その他はyumでインストールした。[[BR]] ||= Library =||= Version =|| ||= xerces-c-devel =|| 2.8.0 || ||= xmlrpc-c-devel =|| 1.32.5-1905 || ||= perl-libwww-perl =|| 6.05-2 || ||= expat =|| 2.1.0-8 || ||= perl-XML-Simple =|| 2.20-5 || ||= perl-Frontier-RPC =|| 0.07b4 || xerces-c-develはyumだと 3.1.1 がインストールされるが、Archive Engine起動時にXMLの読込が失敗する。[[BR]] これはバージョンが原因と思われるため、以下のように別途2.8.0をダウンロードしてインストールを行った。(用意されているxerces-c-develは2.4.0である)[[BR]] {{{ $ cd $EXTENSIONS_TOP/src/ChannelArchiver/ThirdParty $ wget http://archive.apache.org/dist/xerces/c/xerces-c-src-current.tar.gz $ tar xzvf xerces-c-src-current.tar.gz $ ls xerces-c-src_2_8_0 $ cd xerces-c-src_2_8_0/src/xercesc $ export XERCESCROOT=$EXTENSIONS_TOP/src/ChannelArchiver/ThirdParty/xerces-c-src_2_8_0 $ ./runConfigure -plinux -cgcc -xg++ -minmem -nsocket -tnative -rpthread $ make $ su root # make install }}} 4. '''ビルド'''[[BR]] GCCコンパイラのバージョンの影響かは分からないが、ビルド時にエラーが発生してしまう。[[BR]] そこで、予め !ChannelArchiver/Tools/AVLTreeTest.cpp の修正を行っておく(この修正による影響はないとみている)。[[BR]] そのままビルドすると、sort_compare や toString の関数定義がないといわれる。[[BR]] これはAVLTree.h がインクルードされた後に、上記の関数定義がされていたためである。[[BR]] これを、__関数定義がされた後にインクルードするように修正__しておく。[[BR]] 修正後、makeする。[[BR]] {{{ $ cd $EPICS_EXTENSIONS/src/ChannelArchiver $ make $ ls $EPICS_EXTENSIONS/bin/linux-x86_64 ArchiveDataClient.pl ArchiveExport make_compress_script.pl ArchiveDataServerStandalone ArchiveIndexTool make_indexconfig.pl ArchiveDataTool ArchiveManager ArchiveEngine ConvertEngineConfig.pl }}} ==== CentOS 6.8 32bit環境でビルドした場合 ==== CentOS 64bit環境でArchiveEngineのweb管理画面でいくつか不具合が報告されている。[[br]] 現象としては * チャンネル一覧ページですべてのデータが表示されない。 * チャンネル一覧ページよりmainページ等へ移動するとArchiveEngineが落ちてしまう。 がありCentOS 6.8 32bitの環境で同様の問題が発生するかどうか検証した。[[br]] 検証する上で新規に環境を構築したが、ライブラリの整備においてバージョンを落としたりソースからのインストールなどをせずyumだけで環境を構築できた。[[br]] また、ChannelArchiverのソースに手を加えなくてもビルドが正常に行え不具合も発生しなかった。[[br]] 不具合は64bit環境で構築したことが原因ではないかと推測する。[[br]] 検証したVM環境 * ホスト * Windows10 Home 64bit * VMware Player 7.1.4 * ゲスト * CentOS 6.8 32bit * 2016/8/23 yum update実施 * minimal Desktopでセットアップ * EPICS * R314.12.3 * Library * expatはOSを構築した段階でインストール済み * expat以外は単純にyumでインストール * w3c-libwwwはインストール不要(libcurlがインストール済み) || xerces-c-devel || 3.0.1-20 || || xmlrpc-c-devel || 1.16.24-1210.1840 || || perl-libwww-perl || 5.833-3 || || expat || 2.0.1-11 || || perl-XML-Simple || 2.18-6 || || perl-Frontier-RPC || 0.07b4p1 || == Archive Engine 起動 == 1. '''Configuration (XML) 作成'''[[BR]] !ChannelArchiver/Engine ディレクトリ下に DTDファイル と サンプルのXMLファイルが置かれているので、これを参考に作成する。 {{{ $ ls $EPICS_EXTENSIONS/src/ChannelArchiver/Engine | grep engineconfig* engineconfig.dtd engineconfig.xml }}} 2. '''起動'''[[BR]] インデックスファイルとデータファイルを格納する任意のディレクトリを用意し、各オプションを指定して起動する。 {{{ $ mkdir $HOME/ChannelArchiver/data $ $EPICS_EXTENSIONS/bin/linux-x86_64/ArchiveEngine -port 4812 -description "Example IOC" -log engine.log engineconfig.xml $HOME/ChannelArchiver/data/index }}} == Archive Engine管理ツール(!ArchiveDaemon) セットアップ == インデックスファイルは破損してしまうことがしばしばあり、サイズが大きいと復旧にかなりの時間を要する。[[BR]] この影響を低減させる目的で、!ArchiveDaemonをセットアップする。[[BR]] !ArchiveDaemonは複数のArchive Engineを一括管理でき、自動再起動なども設定できる。[[BR]] 1. '''!ArchiveDaemon 定義ファイル(XML)作成'''[[BR]] 定義ファイルのサンプルは $EPICS_EXTENSIONS/src/ChannelArchiver/ExampleSetup ディレクトリに置かれている。[[BR]] 例えば、日毎にインデックスファイルを作成する(Archive Engineを再起動する)場合は、以下のように記述する。 {{{ 4900 BM 51130 /mnt/edata1/archiver/cssArchiver/xml_files/BM.xml 00:10 BT 51131 /mnt/edata1/archiver/cssArchiver/xml_files/BT.xml 00:20 CO 51132 /mnt/edata1/archiver/cssArchiver/xml_files/CO.xml 00:30 }}} 2. '''!ArchiveDaemon 起動'''[[BR]] i. 環境変数 設定[[BR]] {{{ $ export PATH="$EPICS_EXTENSIONS/bin/linux-x86_64:$PATH" $ export LD_LIBRARY_PATH="/usr/local/lib:$EPICS_BASE/lib/linux-x86_64" }}} ii. 起動[[BR]] {{{ $ cd /mnt/edata1/archiver/ChannelArchiver/daemon $ /usr/bin/perl $EPICS_EXTENSIONS/src/ChannelArchiver/ExampleSetup/ArchiveDaemon.pl -f ArchiveDaemon.xml Read ArchiveDaemon.xml. Check status via http://localhost:4900 You can also monitor the log file: ArchiveDaemon.log Disassociating from terminal. }}} デフォルトは4900番ポートでWeb管理画面が動作しており、http://localhost:4900 でアクセスできる。[[BR]] 3. '''master_index 作成'''[[BR]] 最新の index は current_index で参照することが出来る。[[BR]] しかし、このままでは日毎のデータしか参照できない状態であり、不便である。[[BR]] そこで、index をひとまとめにした master_index を作成する。[[BR]] i. indexconfig.xml を作成する[[BR]] make_indexconfig.pl を実行して、indexconfigを作成する。[[BR]] {{{ $ export PATH=$EPICS_EXTENSIONS/bin/linux-x86_64:$PATH $ make_indexconfig.pl -d indexconfig.dtd /path/to/index > indexconfig.xml $ less indexconfig.xml /mnt/edata1/archiver/ChannelArchiver/data/BM/2016/01_18/index /mnt/edata1/archiver/ChannelArchiver/data/BM/2016/01_19/index }}} なお、/path/to/*/index と指定すれば、/path/to 以下全ての index を探してくれる。[[BR]] ii. master_index を作成する {{{ $ ArchiveIndexTool -v 1 indexconfig.xml master_index }}} なお、今回のバージョンよりも前のものでは、!ArchiveDaemon が自動的に master_index を作成している。[[BR]] 少し調べてみると、どうやら !ArchiveDaemon.pl の仕様が変更されている模様。[[BR]] PF-ARのは 2.3.0 、こちらは 3.0.0 とメジャーバージョンが異なっている。[[BR]] 2.3.0 では、master_index を作成していると思われるファンクションや変数があるが、3.0.0 には無くなっている。[[BR]] 指定できるオプション(引数)も違っていた。 master_indexは定期的に更新するのが望ましいため、crontabで更新処理を行うようにした。[[BR]] 各グループの master_index を作成するスクリプト(create_master_index.sh)を用意し、kbdaemonユーザで30分おきに実行するように設定した。[[BR]] {{{ */30 * * * * /mnt/edata1/archiver/ChannelArchiver/data/indices/create_master_index.sh }}} == CSSで閲覧する == CSSなどのクライアントアプリケーションからデータを閲覧するために!ArchiveDataServerを立ち上げる。[[BR]] 具体的には、HTTP Serverを立ち上げ、予め用意されているCGIを実行する。[[BR]] 1. '''サーバディレクトリ 作成'''(apache ユーザがアクセス出来るようにしておくこと) {{{ # mkdir /var/www/html/archive/cgi }}} ここにCGIプログラム、設定ファイルを配置する。 {{{ # cd /var/www/html/archive/cgi # cp $EPICS_EXTENSIONS/src/ChannelArchiver/XMLRPCServer/O.linux-x86_64/ArchiveDataServer . # cp $EPICS_EXTENSIONS/src/ChannelArchiver/XMLRPCServer/serverconfig.dtd . # cp $EPICS_EXTENSIONS/src/ChannelArchiver/XMLRPCServer/serverconfig.xml . # mv ArchiveDataServer ArchiveDataServer.cgi }}} 各グループのデータが見られるように、serverconfig.xml を下記のように編集する。 {{{ 1 BM /mnt/edata1/archiver/ChannelArchiver/data/2016/BM/index 2 BT /mnt/edata1/archiver/ChannelArchiver/data/2016/BT/index 3 CO /mnt/edata1/archiver/ChannelArchiver/data/2016/CO/index }}} 2. '''/etc/httpd/conf/httpd.conf 編集'''[[BR]] サーバディレクトリの設定(下記)を最終行に追加する。 {{{ # Check that environment variables are available, # assert that this directive is not commented-out. # Your web server might use a different module name # or location, in my case it happened to be this : LoadModule env_module libexec/httpd/mod_env.so # Check that CGI is enabled, i.e. assert that # these are not commented-out: LoadModule cgi_module libexec/httpd/mod_sgi.so # This tells Apache that ArchiveDataServer.cgi # is a CGI program because of the .cgi extension: AddHandler cgi-script .cgi Order Allow,Deny Allow from All # Allow cgi-scripts in the ..../cgi directory : SetEnv EPICS_TS_MIN_WEST -540 SetEnv LD_LIBRARY_PATH /usr/local/lib:/proj/epics/R314/R31412/base-3.14.12.3-CSA_centos7/lib/linux-x86_64 SetEnv SERVERCONFIG /var/www/html/archive/cgi/serverconfig.xml # This directive enables CGI for this dir.: Options +ExecCGI }}} 3. ''' httpdサービス 再起動''' {{{ # systemctl restart httpd.service }}} 4. '''CSS !DataBrowser 閲覧'''[[BR]] Archive SearchのURLで下記のように指定する。 {{{ xnds://localhost:80/archive/cgi/ArchiveDataServer.cgi }}} {{{#!comment == トラブルシューティング == * '''!ArchiveEngine 起動エラー'''[[BR]] どうやら write_period タグの値が読み込めていないようだが、なぜそうなっているのか原因は不明...[[BR]] get_threshold や file_size など他タグでも、同様のエラーが発生している。 {{{ 12/25/2015 15:52:04 Starting Engine with configuration file engineconfig.xml, index data/index 12/25/2015 15:52:04 Creating ChannelAccess Context. 12/25/2015 15:52:04 Removing memory for channels and groups. 12/25/2015 15:52:04 Stopping ChannelAccess. 12/25/2015 15:52:04 Engine main routine: ../EngineConfig.cpp (68): 'engineconfig.xml': Error in write_period 12/25/2015 15:52:04 Done. }}} Apache Xercesのバージョンが3.1.1でこの問題が発生してしまった。[[BR]] バージョンを2.8.0に変更したら解決したため、バージョンによる問題と思われる。[[BR]] 2.8.0のインストールは下記のように行った。[[BR]] {{{ $ cd $EXTENSIONS_TOP/src/ChannelArchiver/ThirdParty $ wget http://archive.apache.org/dist/xerces/c/xerces-c-src-current.tar.gz $ tar xzvf xerces-c-src-current.tar.gz $ ls xerces-c-src_2_8_0 $ cd xerces-c-src_2_8_0/src/xercesc $ export XERCESCROOT=$EXTENSIONS_TOP/src/ChannelArchiver/ThirdParty/xerces-c-src_2_8_0 $ ./runConfigure -plinux -cgcc -xg++ -minmen -nsocket -tnative -rpthread $ make $ su root # make install }}} * '''!ArchiveDataServer 起動'''[[BR]] [[Image(DataServerModel.png, 400)]][[BR]] クライアントアプリケーションとして '''!ArchiveViewer''' が配布されているようなので、早速試してみる。[[BR]] * [https://ics-web.sns.ornl.gov/archive/viewer/] !ArchiveViewer は !ArchiveDataServer に対して問い合わせを行う。手順はマニュアルを参考に行った。[[BR]] 1. httpd(v2.4.6-40) サービスを起動する。 {{{ # yum install httpd # systemctl enable httpd # systemctl start httpd }}} 2. !ArchiveDataServer 起動ディレクトリを作成する。[[BR]] このディレクトリに配置するものは、''$EPICS_EXTENSIONS/src/ChannelArchiver/DemoData'' にサンプルが用意されているので、今回はそれらを流用する。[[BR]] コピーしてくるものは、以下の2つ。 * abyss.conf * abyss/mime.types {{{ $ mkdir $HOME/ChannelArchiver/DataServer $ mkdir $HOME/ChannelArchiver/DataServer/abyss $ cd $HOME/ChannelArchiver/DataServer $ cp $EPICS_EXTENSIONS/src/ChannelArchiver/DemoData/abyss.conf . $ cp $EPICS_EXTENSIONS/src/ChannelArchiver/DemoData/abyss/mime.types abyss/ $ vim abyss.conf ---- # The Server Root (UNIX systems style) ServerRoot $HOME/ChannelArchiver/DataServer ---- $ $EPICS_EXTENSIONS/bin/linux-x86_64/ArchiveDataServerStandalone abyss.conf $HOME/ChannelArchiver/data/index ArchiveDataServerStandalone Running Unless your 'abyss.conf' selects a different port number, the data should now be available via the XML-RPC URL http://localhost:8080/RPC2 }}} 3. !ArchiveViewer を起動する。[[BR]] {{{ $ java -jar archiveviewer.jar -u http://localhost:8080/RPC2 }}} }}} ==== ArchiveDataServerのログ ==== ログの場所 {{{ /tmp/archserver.log }}} ログの一部 {{{ 08/29/2016 12:32:46 ---- ArchiveServer 3.0.0 Started ---- 08/29/2016 12:32:46 Client: Java/1.8.0_101 @ 172.28.65.194:64565 08/29/2016 12:32:46 archiver.get_values 08/29/2016 12:32:46 how=5, count=1 08/29/2016 12:32:46 get_channel_data 08/29/2016 12:32:46 Method: Averaging every 1 seconds 08/29/2016 12:32:46 Start: 08/29/2016 12:30:02.207781000 08/29/2016 12:32:46 End : 08/29/2016 12:32:47.369950753 08/29/2016 12:32:46 Open index, key 1 = '/home/epics/ChannelArchiver/data/master_index' 08/29/2016 12:32:46 Handling 'CERL:VAC:AMON:CCG13:HIGH' 08/29/2016 12:32:46 1 values 08/29/2016 12:32:46 ArchiveServer ran 0.00447 seconds }}} == 参考リンク == * [http://www.aps.anl.gov/bcda/epicsgettingstarted/starttools/channelarchiver.htm EPICS Channel Archiver(ANL)] * [https://ics-web.sns.ornl.gov/kasemir/archiver/ Kay氏のページ] * [https://github.com/EPICSTools/ChannelArchiver github]