2015-03-31

Bash: Number of CPU cores

インフラを自動化していると、CPU コア数に応じてパラメーターを変えたい、ということがある。Python だと /proc/cpuinfo からそれらを計算するライブラリーを自作していたりするのだが、書き捨てスクリプト、特に Bash で同じことをやりたい。

もちろん Bash でも頑張れば可能だが、書き捨てスクリプトでは「空で書ける」ことも重要。欲を言えば、Linux 間での可搬性があると尚良い。

以前にも調べたことはあって、その時は簡単にコア数を求める良い方法が見つからなかった。最近になってようやく満足のいく方法を見つけた。

これを参考にして、

cpuinfo.sh:

#!/bin/bash

ncpu_sockets() {
    cat /proc/cpuinfo \
	| grep -P '^physical id\s*:' \
	| sort -u \
	| wc -l
}

ncpu_cores() {
    cat /proc/cpuinfo \
	| grep -P '^(physical|core) id\s*:' \
	| paste - - \
	| sort -u \
	| wc -l
}

ncpu_processors() {
    cat /proc/cpuinfo \
	| grep -P '^processor\s*:' \
	| wc -l
}

echo sockets = $(ncpu_sockets)
echo cores = $(ncpu_cores)
echo processors = $(ncpu_processors)
# grep '^model name' /proc/cpuinfo | head -1
model name      : Intel(R) Xeon(R) CPU           E5640  @ 2.67GHz

# bash cpuinfo.sh
sockets = 2
cores = 8
processors = 16

やっていることのロジックさえ理解すれば、これくらいなら空で書くのも難しくない。paste コマンドは初見だったが、手持ちの RedHat 系 OS を見る限り何処にでも入っている基本コマンドのようだし、可搬性も問題ないだろう。