CPUごとの負荷を見る
マルチコア時代のロードアベレージの見方 - naoyaのはてなダイアリーでは、sarコマンドを使ってMySQLのマルチスレッドの負荷分散状況を見ていたが、手持ちのsar(sysstatパッケージに含まれる)をインストールし忘れていた(そして今となってはyumコマンドは使えない)サーバで、状態を見たかったので、適当にスクリプトをでっち上げた。
#!/bin/bash TMP=`/bin/mktemp` function cleanup() { for f in $TMP do if [ -f $f ] then rm -f $f fi done } trap "cleanup" EXIT date echo "CPU# user nice system idle iowait irq softirq" cat /proc/stat > $TMP sleep 10 cat /proc/stat >> $TMP /bin/awk ' BEGIN{ first = 1} first == 1 && $1 ~ /intr/ { first = 0} first == 1 && $1 ~ /cpu/ { user[$1]-=$2 nice[$1]-=$3 sys[$1]-=$4 idle[$1]-=$5 iowait[$1]-=$6 irq[$1]-=$7 softirq[$1]-=$8 } first == 0 && $1 ~ /cpu/ { user[$1]+=$2 nice[$1]+=$3 sys[$1]+=$4 idle[$1]+=$5 iowait[$1]+=$6 irq[$1]+=$7 softirq[$1]+=$8 } END{ for (name in user) { print name, user[name] / 10, "%", nice[name]/10, "%", sys[name]/10, "%", idle[name]/10, "%", iowait[name], "%", irq[name], "%", softirq[name], "%" } } ' < $TMP | /bin/sort
実行するとこんな感じ。(SMPでそれぞれデュアルコアな環境なので4コア)
/proc/statで各CPUについて iowait, irq, softirqまで取れる環境で、単位が1/100秒だという前提。(詳しくは、使用中のマシンのman procで /proc/stat の項目参照)
# コマンド名 Thu Sep 25 16:01:38 JST 2008 CPU# user nice system idle iowait irq softirq cpu0 21.7 % 0 % 19.6 % 56.7 % 0 % 0 % 26 % cpu1 3.2 % 0 % 3.2 % 93.5 % 6 % 0 % 2 % cpu2 13.1 % 0 % 9.7 % 77.6 % 0 % 0 % 4 % cpu3 3.8 % 0 % 2.7 % 92.2 % 21 % 0 % 1 % cpu 41.8 % 0 % 35.3 % 319.9 % 28 % 0 % 32 %
iowait, irq, softirqに%はねーべよ、とも思うけど、これで用は足りる。