CPU コアごとの使用率を数字で取得したい。
topコマンドを使うと、「t」-「t」-「1」で表示される。
top - 15:22:44 up 16 days, 21:07, 5 users, load average: 0.18, 0.11, 0.06
Tasks: 212 total, 1 running, 211 sleeping, 0 stopped, 0 zombie
%Cpu0 : 1.7/1.0 3[ ]
%Cpu1 : 2.7/0.7 3[ ]
MiB Mem : 3747.8 total, 230.7 free, 1058.1 used, 2459.0 buff/cache
MiB Swap: 2048.0 total, 1104.2 free, 943.8 used. 2363.9 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
924 nanbuwks 20 0 497116 13412 4728 S 2.7 0.3 478:05.78 Xorg
1182 nanbuwks 20 0 3961512 73720 14468 S 2.3 1.9 644:43.25 gnome-s+
254699 nanbuwks 20 0 731940 13576 11660 S 1.0 0.4 160:04.04 check-n+
14 root 20 0 0 0 0 I 0.3 0.0 10:34.36 rcu_sch+
628 root 20 0 2548 40 0 S 0.3 0.0 18:33.31 acpid
1165 nanbuwks 20 0 950656 52080 8016 S 0.3 1.4 95:50.11 node /h+
182332 Debian-+ 20 0 26888 6064 2696 S 0.3 0.2 13:31.30 snmpd
675961 root 20 0 0 0 0 I 0.3 0.0 0:00.61 kworker+
テキストコピペだと見えないけど、実際には CPU コアの使用率が以下のように白いグラフで表示されている。
この数字をスクリプトで取得したい。
top だといろんな数字がごちゃまぜになる。この数字だけ取得できないかな?・・・と思ったが意外と無い。
システムコールなども簡単に使えそうなものが無いっぽい。仕方なく、top のようなコマンドの出力をパースすることにした。
top, snmpwalk, sar などで取得できるが、今回は MPSTAT の出力をパースすることにした。
環境
- Ubuntu 20.04 ja LTS
- sysstat (mpstat) 12.2.0
MPSTAT
パッケージ sysstat に含まれています。
インストール
$ sudo apt install sysstat
通常の表示
$ mpstat
Linux 5.15.0-43-generic (nanbuwks-PRIMERGY-TX1310-M3) 2022年08月22日 _x86_64_ (2 CPU)
15時40分52秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
15時40分52秒 all 3.42 0.04 0.96 1.75 0.00 0.02 0.00 0.00 0.00 93.82
CPUコアそれぞれ表示
$ mpstat -P ALL
Linux 5.15.0-43-generic (nanbuwks-PRIMERGY-TX1310-M3) 2022年08月22日 _x86_64_ (2 CPU)
15時41分33秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
15時41分33秒 all 3.42 0.04 0.96 1.75 0.00 0.02 0.00 0.00 0.00 93.82
15時41分33秒 0 3.32 0.02 0.99 1.89 0.00 0.01 0.00 0.00 0.00 93.77
15時41分33秒 1 3.52 0.05 0.92 1.62 0.00 0.02 0.00 0.00 0.00 93.86
数字として取り出す
上のような出力から、AWK でデータを抜き出してみました。
まずは5行目の3番目のフィールド値、 CPU0 の %usr 値を取り出します。
$ mpstat -P ALL | awk 'NR==5 {print $3}'
3.32
うまく取れましたね。では usr 以外の負荷も合計した値を取り出したいので、100%から %idle を引いた値を取り出してみます。
$ mpstat -P ALL | awk 'NR==5 {print 100-$12}'
6.23
この値を zabbix-sender に取り込みたいので、整数値に直すようにしてみます。
$ mpstat -P ALL | awk 'NR==5 {print int(100-$12)}'
6
最初に変数 cpu に番号を入れるようにしてみました。
$ cpu=0; mpstat -P ALL | awk -v cpuno="$cpu" 'NR==cpuno+5 {print int(100-$12)}'
6
なお、-1を入れると CPUすべての総合値が出力されます。
$ cpu=-1; mpstat -P ALL | awk -v cpuno="$cpu" 'NR==cpuno+5 {print int(100-$12)}'
6