macOSで1つのコアだけに負荷を掛けたいけどできない!
&とwaitに関する記事を書いた時、macで1つのコアだけに負荷を掛けたいという状況がありました。しかしどうしても均等に負荷が掛かってしまうので、そのことについてまとめます。なお、この記事からは、原因も解決策もわからないです。
宣伝
目次
環境
- MacBook Pro (13-inch, 2019) 4コア8スレッド
- macOS Big Sur 11.4
- fish 3.1.1
やったこと
yesで負荷を掛ける
macOSに収録のyesコマンドはマルチスレッドに最適化されていないため、メニーコアのCPUを積むMacで実行しても、1基の論理CPU(コア)に対し負荷をかけるに過ぎないからだ。
私は上の記事を読んで、macのyesであれば1つのコアだけに負荷を掛けられると想像しました。(今あらためて読むと全体として1コア分の負荷を掛けるだけで、1つのコアとは言っていない気もしますが...)
❯ yes > /dev/null & ❯ ps -o pid,comm,%cpu PID COMM %CPU 6152 -fish 0.0 8925 -fish 0.0 14652 yes 100.0
yesのcpu使用率は100%ですが、
yes > /dev/null & yes > /dev/null &
1つ実行でも2つ実行でも4つの物理コアに対して均等に負荷が掛かっています。
最近のmacだとなにか仕組みが違うのかと思って別のコマンドでも試してみました。
opensslで負荷を掛ける
yesで紹介した記事の方法にありました。こちらであればCPU数を指定できます。
openssl speed -multi 1
うーん、こちらでも均等に負荷が掛かってしまいます。
openssl speed -multi 8
ちなみに、8を指定すればすべての論理コアに負荷がかかることは確認できます。
stress-ngで負荷を掛ける
このコマンドであれば、指定したコアにだけ負荷を掛けられるようなので試してみます。
❯ brew install stress-ng # CPU数1つでコア番号1に指定して負荷を掛ける ❯ stress-ng -c 1 --taskset 1 taskset: setting CPU affinity not supported
エラーが出ました。
結論っぽいもの
エラーについて調べると以下のような記事を見つけました。
どうやら、macのAPIではコアを指定してプロセスを実行できないようで、カーネルがすべてのスレッドを掌握しているようです。
となると、それぞれのコアに均等に負荷がかかるのはmacOSがよしなにした結果で、macでは1つのコアだけに負荷を掛けるのは無理そう?
これ以上はブロックボックスっぽいので調べられなさそうです。記事おわり!