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 を見た限り何処にでも入っている基本コマンドのようなので、可搬性も問題ないだろう。