2016年11月29日火曜日

LIO Cluster [LIO, DRBD, Pacemaker による冗長化 iSCSI Target] (その13)Munin用プラグイン(LIO)

今回は、LIO に関するプラグインを紹介します。

元ネタになりそうなものを探したのですが、見つからなかったのでスクラッチで作りました。
perl スクリプトではなく、シェルスクリプトにしました。

Read と Write は別のグラフにしましたが、1つのグラフの中にターゲット、イニシエータ、LUN、の全ての組み合わせを詰め込みましたので、接続数が多くなると見やすくはないと思います。
ターゲット、LUN 別に作るとか、折れ線グラフではなく、塗りつぶしのスタックで表現した方が見やすいとか、いろいろと改造の余地はあると思いますが、とりあえずたたき台としてもらえればと思います。

Read/Write 以外にも、グラフ化した方が有用な情報があるのではないかと思いますが、私のスキルでは選びきれなかったので、とりあえず必要そうなすべての情報をテキストで保存しておけば役に立つのではないか、と考えております。

/sys/kernel/config/target/ 配下にある情報を全て取得すると、私のテスト環境では、仮想サーバで6秒ほど、物理サーバで1秒強かかりました。


sudo mkdir -p /etc/lio
sudo mkdir -p /var/log/lio/

cat << 'EOF' | sudo tee /etc/lio/save
#!/bin/sh
FILE=/dev/shm/lio-$(date +%Y%m%d%H%M)
for i in $(find /sys/kernel/config/target ! -type d | LANG=C sort)
 do echo [$i]; cat $i; echo; done > $FILE 2> /dev/null
gzip $FILE
mv $FILE.gz /var/log/lio/
EOF
sudo chmod 755 /etc/lio/save


これを1分ごとに収集するのは負荷が高すぎると判断しております。多くのデータは値が変化しないので、無駄が多すぎます。1時間に1回取得する方向で考えます。

もう少し絞り込むことにします。

/sys/kernel/config/target/core/*/*/statistics
/sys/kernel/config/target/iscsi/*/fabric_statistics
/sys/kernel/config/target/iscsi/*/tpgt_1/acls/*/fabric_statistics
/sys/kernel/config/target/iscsi/*/tpgt_1/acls/*/*/statistics
/sys/kernel/config/target/iscsi/*/tpgt_1/lun/*/statistics
この配下にある情報を1分ごとに取得する、というあたりが妥協点だと考えました。「statistics (統計)」というディレクトリ配下に有用な統計情報が集約されている、ということにします。
これだけであれば、仮想マシンでも1秒かからずに収集できました。


cat << 'EOF' | sudo tee /etc/lio/statistics
#!/bin/sh
FILE=/dev/shm/lio-statistics-$(date +%Y%m%d%H%M)
YYYYMMDD=$(echo $FILE | sed -e 's/^.*\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\)[0-9][0-9][0-9][0-9]$/\1/')
for i in $(for k in /sys/kernel/config/target/{core/*/*/,iscsi/*/{fabric_,tpgt_1/{acls/*/{fabric_,*/},lun/*/}}}statistics; do echo $k; done | LANG=C sort)
 do for j in $(find $i ! -type d | LANG=C sort); do echo [$j]; cat $j; echo; done; done > $FILE 2> /dev/null
gzip $FILE
mkdir -p /var/log/lio/$YYYYMMDD/
mv $FILE.gz /var/log/lio/$YYYYMMDD/
EOF
sudo chmod 755 /etc/lio/statistics


これらの情報を貯めこむと1年あたり 1GB 程度になる見込みです。1年経過したものは削除する、ということでいいと思います。1つのディレクトリに大量のファイルを置くのはよくないので、毎日別のディレクトリに入れるということで。
タダの HDD の肥やしになりそうな予感がしていますが、取得しておけばよかった、とならないための用心です。


cat << 'EOF' | sudo tee /etc/cron.d/lio
59 * * * * root nice -n 19 /etc/lio/save
* * * * * root nice -n 19 /etc/lio/statistics
58 23 * * * root nice -n 19 /bin/find /var/log/lio -mtime +365 -print0 | xargs -0 rm -rfv 2> /dev/null
EOF




Munin 用プラグインは以下の通りです。GitHubに置きました。

iqn については、「:」以降の文字列のみを切り出して表示しています。


https://raw.githubusercontent.com/blog-pcoffice/public/master/lio_read

cat << 'EOF' | sudo tee /usr/share/munin/plugins/lio_read
#!/bin/sh
#%# family=auto
#%# capabilities=autoconf

if [ "$1" = "autoconf" ]; then
  if [ -d /sys/kernel/config/target/iscsi/iqn.*/tpgt_1 ]; then
    echo yes
  else
    echo 'no (no iscsi target)'
  fi
  exit 0
fi
if [ "$1" = "config" ]; then
  echo 'graph_title LIO (Read)'
  echo 'graph_category LIO'
  echo 'graph_info Graph LIO (Read)'
  echo 'graph_vlabel Graph LIO (Bytes/sec)'
  echo 'graph_scale yes'
  echo 'graph_args --base 1024 --lower-limit 0'
  echo 'graph_period second'
#  echo 'graph_height 200'
#  echo 'graph_width 400'
  echo 'graph_printf %7.2lf'

  TGT_=
  INI_=
  for i in $(echo /sys/kernel/config/target/iscsi/iqn.*/tpgt_1/acls/iqn.*/*/statistics/scsi_auth_intr/read_mbytes | LANG=C sort)
  do
    TGT=$(echo $i | cut -d/ -f7)
    INI=$(echo $i | cut -d/ -f10)
    LUN=$(echo $i | cut -d/ -f11)
    if [ "$TGT_" = "$TGT" ]; then
      if [ "$INI_" = "$INI" ]; then
        :
      else
        INI_=$INI
        INI_F=$(echo $INI | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
      fi
    else
       TGT_=$TGT
       TGT_F=$(echo $TGT | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
       INI_=$INI
       INI_F=$(echo $INI | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
       for j in $(echo /sys/kernel/config/target/iscsi/$TGT/tpgt_1/lun/*/statistics/scsi_tgt_port/read_mbytes | LANG=C sort)
       do
         LUN_=$(echo $j | cut -d/ -f10)
         echo ${TGT_F}$LUN_.label $(echo $TGT | cut -d: -f2) \($LUN_\) Read
         echo ${TGT_F}$LUN_.cdef ${TGT_F}$LUN_,1048576,\*
         echo ${TGT_F}$LUN_.min 0
         echo ${TGT_F}$LUN_.type DERIVE
       done
    fi
    echo ${TGT_F}${INI_F}$LUN.label $(echo $TGT | cut -d: -f2) - $(echo $INI | cut -d: -f2) \($LUN\) Read
    echo ${TGT_F}${INI_F}$LUN.cdef ${TGT_F}${INI_F}$LUN,1048576,\*
    echo ${TGT_F}${INI_F}$LUN.min 0
    echo ${TGT_F}${INI_F}$LUN.type DERIVE
  done
  exit 0
fi

TGT_=
INI_=
for i in $(echo /sys/kernel/config/target/iscsi/iqn.*/tpgt_1/acls/iqn.*/*/statistics/scsi_auth_intr/read_mbytes | LANG=C sort)
do
  TGT=$(echo $i | cut -d/ -f7)
  INI=$(echo $i | cut -d/ -f10)
  LUN=$(echo $i | cut -d/ -f11)
  if [ "$TGT_" = "$TGT" ]; then
    if [ "$INI_" = "$INI" ]; then
      :
    else
      INI_=$INI
      INI_F=$(echo $INI | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
    fi
  else
     TGT_=$TGT
     TGT_F=$(echo $TGT | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
     INI_=$INI
     INI_F=$(echo $INI | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
     for j in $(echo /sys/kernel/config/target/iscsi/$TGT/tpgt_1/lun/*/statistics/scsi_tgt_port/read_mbytes | LANG=C sort)
     do
       LUN_=$(echo $j | cut -d/ -f10)
       echo -n "${TGT_F}$LUN_.value "
       cat $j
     done
  fi
  echo -n "${TGT_F}${INI_F}$LUN.value "
  cat $i
done

exit 0;
EOF
sudo chmod 755 /usr/share/munin/plugins/lio_read



https://raw.githubusercontent.com/blog-pcoffice/public/master/lio_write

cat << 'EOF' | sudo tee /usr/share/munin/plugins/lio_write
#!/bin/sh
#%# family=auto
#%# capabilities=autoconf

if [ "$1" = "autoconf" ]; then
  if [ -d /sys/kernel/config/target/iscsi/iqn.*/tpgt_1 ]; then
    echo yes
  else
    echo 'no (no iscsi target)'
  fi
  exit 0
fi
if [ "$1" = "config" ]; then
  echo 'graph_title LIO (Write)'
  echo 'graph_category LIO'
  echo 'graph_info Graph LIO (Write)'
  echo 'graph_vlabel Graph LIO (Bytes/sec)'
  echo 'graph_scale yes'
  echo 'graph_args --base 1024 --lower-limit 0'
  echo 'graph_period second'
#  echo 'graph_height 200'
#  echo 'graph_width 400'
  echo 'graph_printf %7.2lf'

  TGT_=
  INI_=
  for i in $(echo /sys/kernel/config/target/iscsi/iqn.*/tpgt_1/acls/iqn.*/*/statistics/scsi_auth_intr/write_mbytes | LANG=C sort)
  do
    TGT=$(echo $i | cut -d/ -f7)
    INI=$(echo $i | cut -d/ -f10)
    LUN=$(echo $i | cut -d/ -f11)
    if [ "$TGT_" = "$TGT" ]; then
      if [ "$INI_" = "$INI" ]; then
        :
      else
        INI_=$INI
        INI_F=$(echo $INI | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
      fi
    else
       TGT_=$TGT
       TGT_F=$(echo $TGT | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
       INI_=$INI
       INI_F=$(echo $INI | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
       for j in $(echo /sys/kernel/config/target/iscsi/$TGT/tpgt_1/lun/*/statistics/scsi_tgt_port/write_mbytes | LANG=C sort)
       do
         LUN_=$(echo $j | cut -d/ -f10)
         echo ${TGT_F}$LUN_.label $(echo $TGT | cut -d: -f2) \($LUN_\) Write
         echo ${TGT_F}$LUN_.cdef ${TGT_F}$LUN_,1048576,\*
         echo ${TGT_F}$LUN_.min 0
         echo ${TGT_F}$LUN_.type DERIVE
       done
    fi
    echo ${TGT_F}${INI_F}$LUN.label $(echo $TGT | cut -d: -f2) - $(echo $INI | cut -d: -f2) \($LUN\) Write
    echo ${TGT_F}${INI_F}$LUN.cdef ${TGT_F}${INI_F}$LUN,1048576,\*
    echo ${TGT_F}${INI_F}$LUN.min 0
    echo ${TGT_F}${INI_F}$LUN.type DERIVE
  done
  exit 0
fi

TGT_=
INI_=
for i in $(echo /sys/kernel/config/target/iscsi/iqn.*/tpgt_1/acls/iqn.*/*/statistics/scsi_auth_intr/write_mbytes | LANG=C sort)
do
  TGT=$(echo $i | cut -d/ -f7)
  INI=$(echo $i | cut -d/ -f10)
  LUN=$(echo $i | cut -d/ -f11)
  if [ "$TGT_" = "$TGT" ]; then
    if [ "$INI_" = "$INI" ]; then
      :
    else
      INI_=$INI
      INI_F=$(echo $INI | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
    fi
  else
     TGT_=$TGT
     TGT_F=$(echo $TGT | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
     INI_=$INI
     INI_F=$(echo $INI | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
     for j in $(echo /sys/kernel/config/target/iscsi/$TGT/tpgt_1/lun/*/statistics/scsi_tgt_port/write_mbytes | LANG=C sort)
     do
       LUN_=$(echo $j | cut -d/ -f10)
       echo -n "${TGT_F}$LUN_.value "
       cat $j
     done
  fi
  echo -n "${TGT_F}${INI_F}$LUN.value "
  cat $i
done

exit 0;
EOF
sudo chmod 755 /usr/share/munin/plugins/lio_write




0 件のコメント:

コメントを投稿