#author("2022-05-30T21:11:31+00:00","default:sysosa","sysosa") #author("2022-05-31T01:06:04+00:00","default:sysosa","sysosa") Zabbixの監視対象として[[OpenPBS]]を加えたいと思う 横軸を時間として縦軸は提供したcpu-core数とか. &ref(2022y05m14d_053119350.png,nolink,noborder); &size(10){[[Zabbix/OpenPBS/memo]]}; ***OpenPBS管理ノードにZabbix-agentをインストール [#zbf95f6c] OpenPBS管理ノード「zabbix-pbs」を構築して[[Zabbix/Host]]と同じようにzabbixの監視対象にします &color(red){*};OpenPBSサーバはSELinuxを無効にします. &size(10){作ったスクリプトをzabbix-agentのUserParameter経由で実行したらSELinuxに怒られた...回避を考えたが面倒そうなのでSELinux自体を無効にしてます. 今後再度チャレンジしてSELinux有効でも動かせたいと思う}; #code(nonumber){{ [root@zabbix-pbs ~]# getenforce Disabled [root@zabbix-pbs ~]# }} ***監視項目 [#m5dcb5c8] zabbixサーバから定期的にOpenPBS管理ノードに使用中のslots数を数えさせて、その値をzabbixサーバが貰い受ける. 監視対象から目的の値を得るには、zabbix-agent、snmp、IMPI経由らがある. ここでは目的の値を得るためにスクリプトを組んで行うつもりで、その実行方法にzabbix-agentのUserParameter経由というのがある. &size(10){自分で作ったスクリプトを動かすにはこれ以外にも経路があります}; OpenPBSのpbsnodeコマンドで得られるデータを整理して目的の値を出そうと思う. pbsnodeにはjson形式で出力できるので、それを解析する「jq」コマンドを使うためまずはこの「jq」をインストールします #code(nonumber){{ [root@zabbix-pbs ~]# dnf install jq }} っで、全CPU-core数は #code(nonumber){{ [root@zabbix-pbs ~]# pbsnodes -aSF json | jq '[.nodes[].ncpus]|add' (欠損ノードを除くなら) [root@zabbix-pbs ~]# pbsnodes -aSF json |jq '[.nodes[]|select( (.State=="free") or (.State=="job-busy") )|.ncpus]|add' }} で得られる. GPUの総枚数は #code(nonumber){{ [root@zabbix-pbs ~]# pbsnodes -aSF json | jq '[.nodes[].ngpus]|add' }} で得られる. &size(10){[[OpenPBS/GPU]]の設定が必要です}; 複数のqueueで運用していて、特定のqueueの全CPU-core数は #code(nonumber){{ (queue名が gpu ) [root@zabbix-pbs ~]# pbsnodes -aSF json | jq '[.nodes[]|select(.queue =="gpu")|.ncpus]|add' (queue名が cpu ) [root@zabbix-pbs ~]# pbsnodes -aSF json | jq '[.nodes[]|select(.queue =="cpu")|.ncpus]|add' }} で得られる. &size(10){OpenPBSでのgpu数は手動で定義する必要があります [[OpenPBS/GPU]]}; 次に現在どれくらい消費されているのかを調べる 「pbsnodes -ajF json」を使うと「resources_assigned」と現在計算ノードでアサインされているリソースが分かる. #code(nonumber){{ [root@zabbix-pbs ~]# pbsnodes -ajF json | jq '[.nodes[].resources_assigned.ncpus]|add' 各queue毎なら [root@zabbix-pbs ~]# pbsnodes -ajF json | jq '[.nodes[]|select(.queue=="gpu")|.resources_assigned.ncpus]|add' [root@zabbix-pbs ~]# pbsnodes -ajF json | jq '[.nodes[]|select(.queue=="cpu")|.resources_assigned.ncpus]|add' }} で得られる &size(10){gpu枚数も調べられるが、queuingの際に「-l select=1:ncpus=4:&color(magenta){ngpus=4};」とか明示的でないと得られないです}; ***UserParameterを定義する [#l08d6f9f] 前段でzabbixに送る数値の算出方法を決めた. 次にこのコマンドらをzabbix-agentに仕込んで定期定期に値を取得してもらうようにします 変数としては、CPUとGPU、そして全ノードかqueue毎があるかなと. そうなるとスクリプトを用意しました「/opt/pbs/bin/zabbix-openpbs.sh」 #code(bash,nonumber,nooutline,noblock){{ #!/bin/bash usage="usage: `basename $0` (available|assigned) (ncpus|ngpus) [quene name]" if [ $# -eq 0 ]; then echo $usage exit 1 fi if [ "$1" != "available" ] && [ "$1" != "assigned" ] ; then echo $usage exit 1 fi if [ "$2" != "ncpus" ] && [ "$2" != "ngpus" ]; then echo $usage exit 1 fi PATH=/opt/pbs/bin:$PATH #-------------------------------------------------------------------# if [ "$3" == "" ]; then if [ "$1" == "available" ]; then cmd="pbsnodes -aSF json |jq -r '[.nodes[]|select( (.State==\"free\") or (.State==\"job-busy\") )|.$2]|add'" elif [ "$1" == "assigned" ]; then cmd="pbsnodes -ajF json |jq -r '[.nodes[].resources_assigned.$2]|add'" fi else if [ "$1" == "available" ]; then cmd="pbsnodes -ajF json |jq -r '[.nodes[]|select( ( (.state==\"free\") or (.state==\"job-busy\") ) and (.queue==\"$3\") )|.resources_available.$2]|add'" elif [ "$1" == "assigned" ]; then cmd="pbsnodes -ajF json |jq -r '[.nodes[]|select(.queue==\"$3\")|.resources_assigned.$2]|add'" fi fi #echo $cmd value=`eval $cmd` if [ "$value" == "null" ]; then echo 0 else echo $value fi }} このスクリプトをzabbix-agentに参照させるために「/etc/zabbix/zabbix_agentd.d/openpbs_userparams.conf」を用意します #code(nonumber){{ [root@zabbix-pbs ~]# vi /etc/zabbix/zabbix_agentd.d/openpbs_userparams.conf UserParameter=openpbs[*],/opt/pbs/bin/zabbix-openpbs.sh $1 $2 $3 [root@zabbix-pbs ~]# systemctl restart zabbix-agent }} ***zabbixサーバ側でホストグループ「OpenPBS」を作る [#s91af465] この方法が正しいのか不明なのですが、まず[設定]->[ホストグループ]を開き、右上の「ホストグループの作成」を押下します. 表示された「ホストグループ」画面でグループ名に「OpenPBS」を入力して「追加」ボタンを押下します &ref(2022y05m14d_053808846.png,nolink); これで「ホストグループ」に「OpenPBS」が追加されました &ref(2022y05m14d_054018759.png,nolink); ***zabbixサーバ側でテンプレート「OpenPBS by Zabbix agent」を作る [#j99f576e] 次に[設定]->[テンプレート]を開き、右上の「テンプレートの作成」を押下します. テンプレート名は「OpenPBS by Zabbix agent」として、テンプレートは未選択、(ホスト)グループに先ほど作った「OpenPBS」を選択します. そして「追加」ボタンを押下します. &ref(2022y05m14d_054453887.png,nolink); テンプレート画面に戻ります. &size(10){下図は「openpbs」で検索した結果を示してます. 1件のみ表示されています}; このテンプレートにデータ取得のitem、グラフ表示設定を追加していくことになります. &ref(2022y05m14d_054708878.png,nolink); ***アイテムの作成 [#f4cfc49f] データ元となるアイテムは2つ作ります -openpbs available slots 利用可能なcpu-core数 -openpbs assigned slots 計算ノードに割り当てているcpu-core数 まずは「openpbs available slots」のアイテムを作ります.テンプレート画面で「OpenPBS by Zabbix agent」をクリックして「アイテム」リンクをクリックします &ref(2022y05m14d_055015663.png,nolink); 「アイテム」画面になったら、右上の「アイテムの作成」リンクをクリックします 名前は「openpbs available slots」、タイプは「Zabbixエージェント」、キーは「openpbs[available,ncpus]」で 得られる値のデータ型は「数値(整数)」とします. 入力が済んだら「テスト」ボタンを押下して動作確認を行います &ref(2022y05m14d_063514521.png,nolink); 表示された「アイテムのテスト」にてホストのアドレスにzabbix-agent先、ポートはzabbix-agentが使用しているport(10050が既定)を指定します。そして「値の取得とテスト」ボタンを押下します。ここでエラーがないことを確認します. 確認後「キャンセル」ボタンを押下します. &ref(2022y05m14d_063529185.png,nolink); 「アイテム」画面に戻り、「追加」ボタンを押下します. &ref(2022y05m14d_064635081.png,nolink); これで1つめのアイテム「openpbs available slots」設定は完了. 次にもう1つ「openpbs assigned slots」アイテムを作ります. 再度右上の「アイテムの作成」をクリックします &ref(2022y05m14d_064850633.png,nolink); 今度は名前は「openpbs assigned slots」タイプは「Zabbixエージェント」、キーは「openpbs[assigned,ncpus]」とします &ref(2022y05m14d_065121409.png,nolink); 同じようにテストを行って、「追加」ボタンを押下します. これでアイテムが2つ作れました. &ref(2022y05m14d_065240098.png,nolink); ***グラフの設定 [#t224a71e] テンプレート「OpenPBS by Zabbix agent」にグラフを追加します テンプレート画面で「グラフ」リンクをクリックします &ref(2022y05m14d_152537422.png,nolink); グラフ画面に移ったら、右上の「グラフ作成」ボタンを押下します &ref(2022y05m14d_152707151.png,nolink); 名前を「OpenPBS slots usage」として、アイテム欄の「追加」リンクを押下します. &ref(2022y05m14d_152921974.png,nolink); -するとグラフの要素を選ぶ画面になります. ここでは2つのアイテム「openpbs available slots」と「openpbs assigned slots」を選んで「選択」ボタンを押下します. &ref(2022y05m14d_153152302.png,nolink); グラフ画面に戻り、アイテム欄が埋まりました. 形状や色など調節して「追加」ボタンを押下します. &ref(2022y05m14d_153521207.png,nolink); ここで、グラフ画面の上部にある「プレビュー」リンクを押下します. &ref(2022y05m14d_153702911.png,nolink); 値がないもののグラフの外形が見えます &ref(2022y05m14d_153813768.png,nolink); ***作ったテンプレートをホストに適用する [#d1a626d7] 最後の段階. [設定]->[ホスト]画面に移り、OpenPBSサーバが稼働するホスト「zabbix-pbs」に先ほど作ったテンプレート「OpenPBS by Zabbix agent」を適用させる. 「zabbix-pbs」リンクをクリックします. &size(10){「zabbix-pbs」はテンプレート「Linux by Zabbix agent」のみ適用されている}; &ref(2022y05m14d_154112511.png,nolink); -ホスト画面が表示され、テンプレート欄で「選択」ボタンを押下します. &ref(2022y05m14d_154512927.png,nolink); --テンプレート画面が表示され、ホストグループの選択ボタンを押下します. &ref(2022y05m14d_154704703.png,nolink); ---ホストグループから「OpenPBS」を選択します &ref(2022y05m14d_154805479.png,nolink); --テンプレート画面に戻り、ホストグループ「OpenPBS」で選べるテンプレート「OpenPBS by Zabbix agent」を選択します &ref(2022y05m14d_155005751.png,nolink); -ホスト画面に戻り、テンプレート欄に「OpenPBS by Zabbix agent」が入りました. 画面下の「更新」ボタンを押下します &ref(2022y05m14d_155202135.png,nolink); 対象となったホスト「zabbix-pbs」にテンプレート「OpenPBS by Zabbix agent」が適用されました. &ref(2022y05m14d_160008184.png,nolink); ***グラフ表示 [#wb4a56ca] [&color(magenta){監視データ};]->[ホスト]で監視対象リストから目的のホスト「zabbix-pbs」のグラフリンクをクリックします &ref(2022y05m14d_160333120.png,nolink); その中に「zabbix-pbs: OpenPBS by Zabbix agent」のグラフが表示される &ref(2022y05m14d_160451904.png,nolink);