Macで「ストレステスト」が必要になったことはないだろうか? ストレステストとは、通常以上の負荷をかけても正常動作するか、弱点や不具合はないかを調べるもので、いろいろなシチュエーションで利用される。アプリ開発者やインフラ系エンジニアはいざ知らず、一般のMacユーザには関係ないといわれそうだが、使う機会は意外に多い。
たとえば、Macの内蔵バッテリーがどの程度持つのか知りたいとき。Intelプロセッサの「Turbo Boost」により、どのようにクロックが変動するか確認してみたいとき。複数あるCPUコアのうち1基だけフル回転させたい、どうせなら全基フル回転させたい、といった場面もあるだろう。そんなとき、さくっとストレステストできればうれしいはず。
もっとも、ストレステストといってもCPU/コアに負荷をかけることが目的であり、大げさな仕掛けは必要ない。特殊なタイミングでストレスをかける場合はともかく、専用アプリを用意するほどのことでもないだろう。そこで今回は、コマンドライン1行、ワンライナーで実行可能なMac向けストレステストを紹介してみたい。
もっともシンプル、コア1基が対象なら「yes」
Macで実行できるもっともシンプルなストレステストは、おそらく「yes」コマンドだ。引数もオプションもなく「yes」を実行すればOK、改行された「y」を延々出力し続けるだけのものだが、それでCPUにかかる負荷は劇的に上昇する。
しかし、この方法には課題が多い。ひとつはコアの問題。macOSに収録のyesコマンドはマルチスレッドに最適化されていないため、メニーコアのCPUを積むMacで実行しても、1基の論理CPU(コア)に対し負荷をかけるに過ぎないからだ。もうひとつは、yesコマンドを実行しただけではCPU使用率が100%にならないこと。シェルのフォアグラウンドで実行すると、Terminalでの描画処理が足かせとなるからだ。
そこでひと工夫、以下のように出力を「/dev/null」へリダイレクトしたうえで、バックグラウンドで実行する。負荷をかける対象は論理CPU1基ぶん(1コア)相当となるが、これだけで100%近いCPU使用率を稼ぐことができる。手軽かつ効果的なストレステストといえるだろう。
$ yes > /dev/null &
yes、メニーコア
前掲のyesコマンドだが、実は複数回繰り返せば他のコアの負荷も上げることができる。4コアのCore i5では、以下のようにyesコマンドの実行を4回繰り返せばいいというわけだ。すべてのコアの負荷を上げてしまうと、システムの反応が鈍くなりコマンドの中断が難しくなることは留意しておこう。
ところで、バックグラウンドで実行したyesコマンドは、Terminalを終了してもプロセスが残るため、確実に終了させよう。fgコマンドで(yesコマンドを)フォアグラウンドに戻した上でControl-Cを押してもいいが、jobsコマンドでジョブ番号を確認のうえ、killコマンドで終了させることが確実だ。
もっとスマートに、メニーコアに負荷をかける
yesコマンドでもストレステスト代わりになるが、各コアの限界までCPU消費率を上げたければ、「openssl」コマンドがお勧めだ。このコマンドには、一定時間内にどれほどの暗号化処理を実行できるかを知るためにスピード測定機能が含まれており、「speed」オプションを付けて実行すると、1基の論理CPU(コア)を対象にその限界までCPU消費率を上げ始める。
opensslコマンドには、メニーコア環境用に「-multi」オプションも用意されている。引数としてコア数を指定すると、そのぶん対象の論理CPUが増えるのだ。たとえば、4コア搭載のCore i5で「-multi 3」とすれば、4コアのうち3コアのCPU消費率をその限界まで引き上げることができる。
コア数がわからない場合は、「getconf」コマンドで確認できるが、戻り値をそのままopensslコマンドで使うとスマートだ。具体的には以下のとおり、これで搭載されたすべてのコアを対象に、ストレステストを実行できる。
$ openssl speed -multi `getconf _NPROCESSORS_ONLN`