dorapon2000’s diary

忘備録的な。セキュリティとかネットワークすきです。

macOSで1つのコアだけに負荷を掛けたいけどできない!

&とwaitに関する記事を書いた時、macで1つのコアだけに負荷を掛けたいという状況がありました。しかしどうしても均等に負荷が掛かってしまうので、そのことについてまとめます。なお、この記事からは、原因も解決策もわからないです。

宣伝

dorapon2000.hatenablog.com

目次

環境

やったこと

yesで負荷を掛ける

macOSに収録のyesコマンドはマルチスレッドに最適化されていないため、メニーコアのCPUを積むMacで実行しても、1基の論理CPU(コア)に対し負荷をかけるに過ぎないからだ。

ひたすらMacを重くする「ストレステスト」をお手軽に - 新・OS X ハッキング!(248) | マイナビニュース

私は上の記事を読んで、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%ですが、

f:id:dorapon2000:20210612183524p:plain:w400

yes > /dev/null & yes > /dev/null &

f:id:dorapon2000:20210612183555p:plain:w400

1つ実行でも2つ実行でも4つの物理コアに対して均等に負荷が掛かっています。

最近のmacだとなにか仕組みが違うのかと思って別のコマンドでも試してみました。

opensslで負荷を掛ける

yesで紹介した記事の方法にありました。こちらであればCPU数を指定できます。

openssl speed -multi 1

f:id:dorapon2000:20210612184449p:plain:w400

うーん、こちらでも均等に負荷が掛かってしまいます。

openssl speed -multi 8

f:id:dorapon2000:20210612184438p:plain:w400

ちなみに、8を指定すればすべての論理コアに負荷がかかることは確認できます。

stress-ngで負荷を掛ける

stress-ng — Homebrew Formulae

このコマンドであれば、指定したコアにだけ負荷を掛けられるようなので試してみます。

❯ brew install stress-ng

# CPU数1つでコア番号1に指定して負荷を掛ける
❯ stress-ng -c 1 --taskset 1
taskset: setting CPU affinity not supported

エラーが出ました。

結論っぽいもの

エラーについて調べると以下のような記事を見つけました。

stackoverflow.com

どうやら、macAPIではコアを指定してプロセスを実行できないようで、カーネルがすべてのスレッドを掌握しているようです。

となると、それぞれのコアに均等に負荷がかかるのはmacOSがよしなにした結果で、macでは1つのコアだけに負荷を掛けるのは無理そう?

これ以上はブロックボックスっぽいので調べられなさそうです。記事おわり!