wiki:epics/channelarchiver

ここではSuperKEKB向けにセットアップした際の内容を記述しているため、適宜読み換えていただきたい。

概要

Channel ArchiverはSpallation Neutron Source(SNS)でC++を用いて開発された、EPICSのデータを記録するためのツールセットである。
その中心となるArchive Engine はChannel Access(CA)を介して複数のCA Server(IOC)からデータを収集する。
収集したデータは定期的に独自のバイナリ形式でローカルディスクファイル(データファイル)に書き出され、インデックスファイルによって関連付けられる(インデックスはR木で実装されている)。
これらの履歴データはXML-RPCを実装したData Serverを起動することで、ネットワーク上の他計算機からも読出すことができる。

ビルド方法

以下の環境でビルドできたことを確認済み。

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 セットアップ
    まずは EPICS Base 及び Extensions をセットアップする。
    これについては、EPICSをゼロからインストールに手順が記載されているため、ここでは説明を割愛する。
  2. ソース ダウンロード
    githubからクローンし、masterブランチでチェックアウトする。これよりも前?のバージョンはタグで管理されているようだ。
    $ cd $EPICS_EXTENSIONS/src
    $ git clone https://github.com/EPICSTools/ChannelArchiver
    $ cd ChannelArchiver
    $ git checkout --track origin/master
    
  3. 必要なライブラリの整備
    ChannelArchiver/ThirdPartyディレクトリに、ビルド時に利用されるライブラリパッケージが用意されている。
    今回インストールしたライブラリは下記の通り。
    なお、xerces-c-devel及びperl-Frontier-RPCはソースからインストールし、その他はyumでインストールした。
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の読込が失敗する。
これはバージョンが原因と思われるため、以下のように別途2.8.0をダウンロードしてインストールを行った。(用意されているxerces-c-develは2.4.0である)

$ 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
  1. ビルド
    GCCコンパイラのバージョンの影響かは分からないが、ビルド時にエラーが発生してしまう。
    そこで、予め ChannelArchiver/Tools/AVLTreeTest.cpp の修正を行っておく(この修正による影響はないとみている)。

そのままビルドすると、sort_compare や toString の関数定義がないといわれる。
これはAVLTree.h がインクルードされた後に、上記の関数定義がされていたためである。
これを、関数定義がされた後にインクルードするように修正しておく。

修正後、makeする。

$ 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管理画面でいくつか不具合が報告されている。
現象としては

  • チャンネル一覧ページですべてのデータが表示されない。
  • チャンネル一覧ページよりmainページ等へ移動するとArchiveEngineが落ちてしまう。

がありCentOS 6.8 32bitの環境で同様の問題が発生するかどうか検証した。
検証する上で新規に環境を構築したが、ライブラリの整備においてバージョンを落としたりソースからのインストールなどをせずyumだけで環境を構築できた。
また、ChannelArchiverのソースに手を加えなくてもビルドが正常に行え不具合も発生しなかった。
不具合は64bit環境で構築したことが原因ではないかと推測する。

検証した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) 作成
    ChannelArchiver/Engine ディレクトリ下に DTDファイル と サンプルのXMLファイルが置かれているので、これを参考に作成する。
    $ ls $EPICS_EXTENSIONS/src/ChannelArchiver/Engine | grep engineconfig*
     engineconfig.dtd      engineconfig.xml
    
  2. 起動
    インデックスファイルとデータファイルを格納する任意のディレクトリを用意し、各オプションを指定して起動する。
    $ 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) セットアップ

インデックスファイルは破損してしまうことがしばしばあり、サイズが大きいと復旧にかなりの時間を要する。
この影響を低減させる目的で、!ArchiveDaemonをセットアップする。
!ArchiveDaemonは複数のArchive Engineを一括管理でき、自動再起動なども設定できる。

  1. ArchiveDaemon 定義ファイル(XML)作成
    定義ファイルのサンプルは $EPICS_EXTENSIONS/src/ChannelArchiver/ExampleSetup ディレクトリに置かれている。
    例えば、日毎にインデックスファイルを作成する(Archive Engineを再起動する)場合は、以下のように記述する。
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <!DOCTYPE daemon SYSTEM "ArchiveDaemon.dtd">
    <daemon>
      <port>4900</port>
      <engine directory='/mnt/edata1/archiver/ChannelArchiver/data/BM'>
        <desc>BM</desc>
        <port>51130</port>
        <config>/mnt/edata1/archiver/cssArchiver/xml_files/BM.xml</config>
        <restart type='daily'>00:10</restart>
      </engine>
      <engine directory='/mnt/edata1/archiver/ChannelArchiver/data/BT'>
        <desc>BT</desc>
        <port>51131</port>
        <config>/mnt/edata1/archiver/cssArchiver/xml_files/BT.xml</config>
        <restart type='daily'>00:20</restart>
      </engine>
      <engine directory='/mnt/edata1/archiver/ChannelArchiver/data/CO'>
        <desc>CO</desc>
        <port>51132</port>
        <config>/mnt/edata1/archiver/cssArchiver/xml_files/CO.xml</config>
        <restart type='daily'>00:30</restart>
      </engine>
    <daemon>
    
  2. ArchiveDaemon 起動
    1. 環境変数 設定
      $ export PATH="$EPICS_EXTENSIONS/bin/linux-x86_64:$PATH"
      $ export LD_LIBRARY_PATH="/usr/local/lib:$EPICS_BASE/lib/linux-x86_64"
      
    2. 起動
      $ 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 でアクセスできる。
  1. master_index 作成
    最新の index は current_index で参照することが出来る。
    しかし、このままでは日毎のデータしか参照できない状態であり、不便である。
    そこで、index をひとまとめにした master_index を作成する。
    1. indexconfig.xml を作成する
      make_indexconfig.pl を実行して、indexconfigを作成する。
      $ export PATH=$EPICS_EXTENSIONS/bin/linux-x86_64:$PATH
      $ make_indexconfig.pl -d indexconfig.dtd /path/to/index > indexconfig.xml
      $ less indexconfig.xml
      <?xml version="1.0" encoding="UTF-8" standalone="no"?>
      <!DOCTYPE indexconfig SYSTEM "/proj/epics/R314/R31412/extensions/R314123-CSA_centos7/src/ChannelArchiver/IndexTool/indexconfig.dtd">
      <indexconfig>
              <archive>
                      <index>/mnt/edata1/archiver/ChannelArchiver/data/BM/2016/01_18/index</index>
              </archive>
              <archive>
                      <index>/mnt/edata1/archiver/ChannelArchiver/data/BM/2016/01_19/index</index>
              </archive>
      </indexconfig>
      
      なお、/path/to/*/index と指定すれば、/path/to 以下全ての index を探してくれる。
    2. master_index を作成する
      $ ArchiveIndexTool -v 1 indexconfig.xml master_index
      

なお、今回のバージョンよりも前のものでは、ArchiveDaemon が自動的に master_index を作成している。
少し調べてみると、どうやら ArchiveDaemon.pl の仕様が変更されている模様。
PF-ARのは 2.3.0 、こちらは 3.0.0 とメジャーバージョンが異なっている。
2.3.0 では、master_index を作成していると思われるファンクションや変数があるが、3.0.0 には無くなっている。
指定できるオプション(引数)も違っていた。

master_indexは定期的に更新するのが望ましいため、crontabで更新処理を行うようにした。
各グループの master_index を作成するスクリプト(create_master_index.sh)を用意し、kbdaemonユーザで30分おきに実行するように設定した。

*/30 * * * * /mnt/edata1/archiver/ChannelArchiver/data/indices/create_master_index.sh

CSSで閲覧する

CSSなどのクライアントアプリケーションからデータを閲覧するために!ArchiveDataServerを立ち上げる。
具体的には、HTTP Serverを立ち上げ、予め用意されているCGIを実行する。

  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 を下記のように編集する。
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE serverconfig SYSTEM "serverconfig.dtd">
    <serverconfig>
      <archive>
        <key>1</key>
        <name>BM</name>
        <path>/mnt/edata1/archiver/ChannelArchiver/data/2016/BM/index</path>
      </archive>
      <archive>
        <key>2</key>
        <name>BT</name>
        <path>/mnt/edata1/archiver/ChannelArchiver/data/2016/BT/index</path>
      </archive>
      <archive>
        <key>3</key>
        <name>CO</name>
        <path>/mnt/edata1/archiver/ChannelArchiver/data/2016/CO/index</path>
      </archive>
    </serverconfig>
    
  1. /etc/httpd/conf/httpd.conf 編集
    サーバディレクトリの設定(下記)を最終行に追加する。
    # 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
    
    <Directory "/var/www/html/archive">
      Order Allow,Deny
      Allow from All
    </Directory>
    
    # Allow cgi-scripts in the ..../cgi directory :
    <Directory "/var/www/html/archive/cgi">
      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
    </Directory>
    
  1. httpdサービス 再起動
    # systemctl restart httpd.service
    
  1. CSS DataBrowser 閲覧
    Archive SearchのURLで下記のように指定する。
    xnds://localhost:80/archive/cgi/ArchiveDataServer.cgi
    

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

参考リンク

Last modified 13 months ago Last modified on 09/13/16 09:35:20