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に%はねーべよ、とも思うけど、これで用は足りる。