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