貧困層またはSAR + MySQL + Gnuplotの監視

なぜSARなのか



私はかなり長い間監視してきました。 したがって、私の活動の性質上、ホストを監視するためにさまざまな「自転車」を思い付く必要があるとき、私はしばしば異常な状況に遭遇します。 たとえば、リソースが非常に限られているサーバー(仮想マシンまたはVDS)がある場合を考えます。



Zabbix、Nagios、Cactiなどの多くの優れた監視システムがあります。 しかし、私たちのすべての状況において、明らかな理由から、それらは適切ではありません-それら自体がリソースを消費しますが、それほど多くはありません。 質問がすぐに発生します、どうすればいいですか? そして、ここでSARは私たちを助けるために急いでいます。



SARのインストールと構成



SAR (System Activity Report)は、システムパフォーマンスに関する統計情報を収集するための非常に強力なユーティリティです。 sysstatパッケージに含まれています。 したがって、サーバーにsysstatパッケージがまだない場合は、インストールします。 たとえば、Debianの場合:

# apt-get install sysstat
      
      





次に、SAR自体を構成する必要があります。 sysstatを含めます。このため、ファイルを修正します。

 # vim /etc/default/sysstat
      
      





そして、行ENABLED = "false"をENABLED = "true"に変更します。 次に、cronでタスクを修正する必要があります。

 # vim /etc/cron.d/sysstat
      
      





私は毎分データを収集しているので、私のシステムでは次のようになります(少し違うかもしれません):

 # Activity reports every 1 minutes everyday * * * * * root command -v debian-sa1 > /dev/null && debian-sa1 1 1 # Additional run at 23:59 to rotate the statistics file 59 23 * * * root command -v debian-sa1 > /dev/null && debian-sa1 60 2
      
      





sysstatサービスの再起動:

 # service sysstat restart
      
      





これでセットアップは完了です。



SARを使用する



SARの使用方法については詳しく説明しません。 これを行うために、インターネット上に多くの記事があり、SAR自体は非常に広範なドキュメントを提供します。 必要なのはマンサールだけで、そこにあると思います。



MySQLでレポートをアップロードするためのSARを学ぶ



はい、はい、あなたはそれを正しく読みます。 もちろん、SARを意図した目的に使用し、コンソールから呼び出して、次の形式でレポートを受信できます。

 $ sar -s 07:00:00 -e 07:10:00 Linux 3.2.0-4-amd64 (mind-x) 02.03.2015 _x86_64_ (1 CPU) 07:00:01 CPU %user %nice %system %iowait %steal %idle 07:01:01 all 0,64 0,00 0,15 0,10 0,00 99,11 07:02:01 all 0,03 0,00 0,02 0,00 0,00 99,95 07:03:01 all 0,03 0,00 0,02 0,00 0,00 99,95 07:04:01 all 0,03 0,00 0,02 0,02 0,00 99,93 07:05:01 all 0,05 0,00 0,03 0,00 0,00 99,92 07:06:01 all 0,63 0,00 0,17 0,10 0,00 99,11 07:07:01 all 0,03 0,00 0,02 0,00 0,00 99,95 07:08:01 all 0,02 0,00 0,02 0,00 0,00 99,97 07:09:01 all 0,03 0,00 0,02 0,00 0,00 99,95 : all 0,17 0,00 0,05 0,02 0,00 99,76
      
      





しかし、あなたは認めなければならない、私は長い一日の仕事の後、これらの数字を見たくない、私の目が痛いなど。 どうする? そのような重要な情報をどのように扱うか?



私はこの問題について一晩中考えて過ごしました。 すべての決定は私には奇妙に思えました。 おそらく私が思いついた解決策も奇妙ですが、なぜSAR MySQLと友達になりたいのですか? 私はさらに説明しようとします。



SARチューニング部分を注意深く読んでいると、SARは真夜中以降にログをローテーションすることに気づいたと思います。 これは、特に日ごとに雑誌を壊すために行われます。 一定の時間など、必要な列のみを選択できるように、データを継続的に受信したかった(後でグラフを作成するため) そして、これらのレポートをすべてデータベースにアップロードしてみませんか? サーバーにはすでにMySQLが含まれていたため、選択が明らかになりました。



だから、SARとMySQLの友達



私はこれについてインターネット全体を検索しましたが、実際には情報はなく、2、3の記事、スクリプトである読書の結果があります。 しかし、分解する前に、ベースを準備しましょう。



sysstatデータベースを作成します。

 CREATE DATABASE `sysstat`;
      
      





ユーザーsysstatを作成します(このユーザーに他の権利を与えることができます)。

 CREATE USER 'sysstat'@'localhost' IDENTIFIED BY 'some_pass'; GRANT ALL PRIVILEGES ON sysstat.* TO 'sysstat'@'localhost';
      
      





テーブルを作成します。私にとっては次のようなものです。

 CREATE TABLE `host_health_cpu` ( `datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `pct_user` decimal(10,2) DEFAULT NULL, `pct_nice` decimal(10,2) DEFAULT NULL, `pct_system` decimal(10,2) DEFAULT NULL, `pct_iowait` decimal(10,2) DEFAULT NULL, `pct_steal` decimal(10,2) DEFAULT NULL, `pct_idle` decimal(10,2) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `host_health_memory` ( `datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `kbmemfree` int(11) DEFAULT NULL, `kbmemused` int(11) DEFAULT NULL, `per_memused` decimal(10,2) DEFAULT NULL, `kbbuffers` int(11) DEFAULT NULL, `kbcached` int(11) DEFAULT NULL, `kbcommit` int(11) DEFAULT NULL, `per_commit` decimal(10,2) DEFAULT NULL, `kbactive` int(11) DEFAULT NULL, `kbinact` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `host_health_la` ( `datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `runq_sz` int(11) DEFAULT NULL, `plist_sz` int(11) DEFAULT NULL, `ldavg_1` decimal(10,2) DEFAULT NULL, `ldavg_5` decimal(10,2) DEFAULT NULL, `ldavg_15` decimal(10,2) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `host_health_net` ( `datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `iface` varchar(7) DEFAULT NULL, `rxpck_persec` decimal(10,2) DEFAULT NULL, `txpck_persec` decimal(10,2) DEFAULT NULL, `rxbyt_persec` decimal(10,2) DEFAULT NULL, `txbyt_persec` decimal(10,2) DEFAULT NULL, `rxcmp_persec` decimal(10,2) DEFAULT NULL, `txcmp_persec` decimal(10,2) DEFAULT NULL, `rxcst_persec` decimal(10,2) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
      
      





レポートをMySQLにアップロードするために、すべてが準備できました。



スクリプトを解析する



スクリプトでは、SARによって収集されたデータをさまざまな形式(CSV、JSON、XMLなど)で表示できるsadfユーティリティを使用します。 CSVが必要です。 スクリプト自体はそれほど大きくなく、理解するのも難しくありません。sadf出力から最初の2列を削除するだけで、ホストとデータ読み取り間隔の情報が含まれています。 私たちの場合、ホストは1つしかなく、間隔はすでにわかっているので、この情報は必要ありません。

 #!/bin/bash #  WORKDIR=/var/cache/sar FMATDIR=/var/cache/sar_data SADF=`which sadf` HEAD=`which head` AWK=`which awk` #      cd ${WORKDIR} COPY=`which cp` SAR_LOG=/var/log/sysstat cd ${SAR_LOG} LATEST_DATA=`ls -tlr ${SAR_LOG} | tail -1 | awk '{print $9}'` ${COPY} ${LATEST_DATA} ${WORKDIR} for file in *; do #    6 .     $TIME UNIXTIME=$((`date +%s`-300)) TIME=`date -d@${UNIXTIME} +%H:%M:%S` #  CPU ${SADF} -d ${file} -s ${TIME} -t | cut -d ';' -f3,5- > "${FMATDIR}"/"${file}"-host_health_cpu.csv #  ${SADF} -d ${file} -s ${TIME} -t -- -n DEV | cut -d ';' -f3- > "${FMATDIR}"/"${file}"-host_health_net.csv #   LA ${SADF} -d ${file} -s ${TIME} -t -- -q | cut -d ';' -f3- > "${FMATDIR}"/"${file}"-host_health_la.csv #    ${SADF} -d ${file} -s ${TIME} -t -- -r | cut -d ';' -f3- > "${FMATDIR}"/"${file}"-host_health_memory.csv done #   MySQL cd ${FMATDIR} MYSQL=`which mysql` USER='user' PASS='some_pass' HOST='localhost' DB='sysstat' for file in *.csv; do ${MYSQL} -u${USER} -p${PASS} -h${HOST} -D${DB} -e "LOAD DATA LOCAL INFILE '${FMATDIR}/${file}' INTO TABLE `echo ${file} | sed 's/.csv//g' | awk -F'-' '{print $2}'` FIELDS TERMINATED BY ';' IGNORE 1 LINES;" done #   rm -fr ${FMATDIR}/*.csv rm -fr ${WORKDIR}/sa*
      
      





一般的に、このようなスクリプト。 充填を開始するには、cronに追加します。 5分ごとに電話をかけます。

  */5 * * * * bash /usr/local/sbin/sar.sh
      
      





SARの興味深い機能は、開始時刻を示すsar -sと呼ぶと、この時間自体はレポートに含まれないため、最後の6分間でsarスクリプトを呼び出すと、出力で5分間でレポートが取得されることです。 これを考慮する必要があります。 そうしないと、MySQLに「穴」または重複が生じます。



その結果、次のようなものが得られます。

 mysql> SELECT * FROM host_health_memory WHERE datetime > NOW() - INTERVAL 10 MINUTE; +---------------------+-----------+-----------+-------------+-----------+----------+----------+------------+----------+---------+ | datetime | kbmemfree | kbmemused | per_memused | kbbuffers | kbcached | kbcommit | per_commit | kbactive | kbinact | +---------------------+-----------+-----------+-------------+-----------+----------+----------+------------+----------+---------+ | 2015-03-02 08:36:01 | 1381896 | 679396 | 32.00 | 104044 | 155520 | 803420 | 38.00 | 484244 | 142688 | | 2015-03-02 08:37:01 | 1377476 | 683816 | 33.00 | 104068 | 155668 | 810284 | 39.00 | 487632 | 142808 | | 2015-03-02 08:38:01 | 1377476 | 683816 | 33.00 | 104096 | 155672 | 810284 | 39.00 | 487668 | 142804 | | 2015-03-02 08:39:01 | 1377476 | 683816 | 33.00 | 104120 | 155680 | 810524 | 39.00 | 487832 | 142804 | | 2015-03-02 08:40:01 | 1372416 | 688876 | 33.00 | 104160 | 155684 | 819104 | 39.00 | 490708 | 142816 | | 2015-03-02 08:41:01 | 1377104 | 684188 | 33.00 | 104276 | 155700 | 810524 | 39.00 | 488008 | 142808 | | 2015-03-02 08:42:01 | 1379228 | 682064 | 33.00 | 104288 | 155708 | 816640 | 39.00 | 486392 | 142632 | | 2015-03-02 08:43:01 | 1378980 | 682312 | 33.00 | 104328 | 155708 | 816744 | 39.00 | 486680 | 142628 | | 2015-03-02 08:44:01 | 1378608 | 682684 | 33.00 | 104356 | 155716 | 816932 | 39.00 | 486936 | 142636 | | 2015-03-02 08:45:01 | 1371564 | 689728 | 33.00 | 104392 | 155720 | 827704 | 40.00 | 491912 | 142648 | +---------------------+-----------+-----------+-------------+-----------+----------+----------+------------+----------+---------+
      
      





このデータをどうしますか?



それらを使って何でもできます。 このデータに基づいてグラフを作成することを少し高めに書きました。 これは可能な限りの方法で行うことができます。 それはすべてあなたの想像力にかかっています。



ヌープロット



私の選択はGnuplotにかかった 。 これは、グラフやチャートなどを構築するための非常に便利なツールです。 Gnuplotのホームサイトには多くのドキュメントがあります 。そのため、機能と使用方法に関する部分はスキップします。



私はこのスクリプトを書きました:

 #!/bin/bash sleep 10 #    width="640" high="480" outfile="graph.svg" format="svg" NO_ARGS=0 E_OPTERROR=65 if [ $# -eq "$NO_ARGS" ] #    ? then echo "   !     : -o     (  \"graph.svg\") -f     (  \"svg\") -w   (  \"640\") -h   (  \"480\") -t     ." exit $E_OPTERROR fi #   while getopts ":h:w:t:f:o:" Option do case $Option in h) high="$OPTARG";; w) width="$OPTARG";; f) format="$OPTARG";; o) outfile="$OPTARG";; t) type="$OPTARG";; esac done shift $(($OPTIND - 1)) #     /tmp/datatmp if [ ${type} == 'cpu' ] then #   title="   CPU, %" QUERY="select time(datetime), pct_idle as idle, pct_iowait as iowait, pct_system as system, pct_user as user from host_health_cpu where now() - interval 1 hour < datetime;" format_y='set format y "%.0f%%";' elif [ ${type} == 'mem' ] then title=" , B" QUERY="select time(datetime),(kbmemfree * 1024) as Free,(kbmemused * 1024) as Used,(kbbuffers * 1024) as Buffers,(kbcached * 1024) as Cached from host_health_memory where now() - interval 1 hour < datetime;" format_y="set format y '%.1s%cB'" elif [ ${type} == "net" ] then title="   , B/s" QUERY='select time(datetime), (rxbyt_persec * 1024) as Rx, (txbyt_persec * 1024) as Tx from host_health_net where now() - interval 1 hour < datetime and iface="eth0";' format_y="set format y '%.1s%cB/s'" elif [ ${type} == "la" ] then title="Load Average" QUERY="select time(datetime),ldavg_1 as LoadAvg1, ldavg_5 LoadAvg5,ldavg_15 as LoadAvg15 from host_health_la where now() - interval 1 hour < datetime;" format_y="set format y '%.2f'" fi #         MYSQL=`which mysql` USER="user" PASS="some_pass" DB="sysstat" ${MYSQL} -u${USER} -p${PASS} -D${DB} -B -r -e "${QUERY}" >> /tmp/datatmp_${type} #    . cols=`awk '{print NF}' /tmp/datatmp_${type} | sort -nu | tail -n 1` #   hour_ago=`${MYSQL} -u${USER} -p${PASS} -D${DB} -N -e "select time(datetime) from host_health_cpu where now() - interval 1 hour < datetime limit 1;"` now=`${MYSQL} -u${USER} -p${PASS} -D${DB} -N -e "select time(datetime) from host_health_cpu where now() - interval 1 hour < datetime order by datetime desc limit 1;"` #  gnuplot << EOP #      set terminal ${format} size ${width},${high} #   set output ${outfile} #  set key autotitle columnhead set key outside center bottom set key horizontal #  set style fill transparent solid 0.5 noborder set title "${title}" #       set xdata time set timefmt "%H:%M:%S" set xrange ["${hour_ago}":"${now}"] set xtics format "%H:%M" #   set xlabel "" set ylabel "${title}" set grid set yrange [0:*] ${format_y} #  . plot for [i=2:${cols}] "/tmp/datatmp_${type}" using 1:i smooth unique with filledcurve x1 EOP #  . rm /tmp/datatmp_${type} echo "Image write to \"${outfile}\"" exit 0;
      
      





次のように実行します。

 $ sar-plot.sh -t mem -o /path/to/memory.svg
      
      





その結果、1時間でこのようなスケジュールになります。



このスクリプトをcronに追加して、たとえば5分ごとに1回呼び出すと、常に新しいグラフが作成されます。 たとえば、私はこのようにしました:

 */5 * * * * bash /usr/local/sbin/sar-plot.sh -t cpu -o /path/to/images/cpu.svg */5 * * * * bash /usr/local/sbin/sar-plot.sh -t mem -o /path/to/images/memory.svg */5 * * * * bash /usr/local/sbin/sar-plot.sh -t net -o /path/to/images/network.svg */5 * * * * bash /usr/local/sbin/sar-plot.sh -t la -o /path/to/images/la.svg
      
      





さらに、これらの画像をHTMLページに追加して、自動的に更新することができます。 したがって、ホストのパフォーマンスをほぼリアルタイム(5分遅れで)で監視できます。 原則として私たちにとって十分なものです。



おわりに



SARは非常に便利なツールであり、システム管理者の作業に不可欠です。 私が説明した監視方法は、リソースが非常に限られている人、Zabbixサーバーでの昇格を希望しない人、またはその他のさまざまな理由に適しています。

このソリューションを自分で開発できます。



それはすべてあなたの欲求に依存します。 頑張って



All Articles