Blog ブログ
CPU使用率ってなに?
皆様お久しぶりです。
シニアプログラマの小田です。約1ヶ月ぶりの登場です。
今回は負荷についての第3弾、CPU使用率についてです。
概要
CPU使用率と聞くと、大抵の人がグラフで見たことあるあれ、という様なイメージでしょうか?
例えばMUNINですと、以下のように見えたりします。
MUNIでCPU使用率を表示 |
つまりCPUがどういう状態なの?というのを見るために存在するパラメータです。
上記の図では2つCPUがありますので、使用率は200%まであります。
使用率ということで、つまりは今忙しいのか?暇なのか?を表しているとお考え下さい。
では、どういうときに忙しくなり、私達は気をつければいいのか?を話していきます。
CPU使用率が上がる時
何か処理させれば当然上がるのですが、やはり問題になるのは「どこが重たいのか?」ということを探すときです。それを解決するのは簡単な話です。「コードを書かない」が使用率を上げない最も簡単な方法です。バカにはしておりません、至って真面目な回答です。
もちろんゲームを運営している関係で0%なんてことはありません。むしろそういう状況ならゲームは閑古鳥が鳴いているでしょう。ということは多少上がることは許容しても、何故か常に100%付近というものを考慮するには「無駄なものは書かない」に尽きるのです。
- そもそも忙しくなる要因は分かっているか?(要因)
- 暇になるようにすれば、どうすればいい?(解決方法)
こういうことです。
ではさっそく紐解いていきましょう。
要因
CPU使用率が上がる要因は様々ですが、その中で一番陥りやすい問題を上げて説明していきます。
無駄な処理①:for,foreachを連発する
- DBから値を取得する時
- レスポンスのデータを作成する時
- ゲームの仕様上、ロジックが複雑なため
これらが関係しているのではないでしょうか?
1,2については各社様もフレームワークを使われたり、自社ライブラリを組まれているので、それを使って対処されているかと思います。
無駄な処理②:何度もマスタにアクセスする
同じデータへのアクセスは無駄ですよね。ではそれを解決するにはどうするか?
大抵の人はキャッシュをイメージされるのではないでしょうか?確かにその方法は有効です。またDBよりもオンメモリ上に配置された値を取得すると高速に値を扱えます。
ただ、キャッシュサーバへのコネクション数が増加して、次はそこがボトルネックになってしまいます。
解決方法
無駄な処理①:for,foreachを連発する
同じロジックをPHPで書くのと、C/C++で書くのとを想像したら理解できますよね。
無駄な処理②:何度もマスタにアクセスする
検証方法
まとめ
今回はPHPを書き始めた新人や機能追加をしていって気がつけば陥るという側面から記述致しました。CPU使用率についてはどこにいった?!と思う人もいると思いますが、最初にも話したとおり「何も処理させない」を目指すために、それぞれの問題を解決し高速化することが、CPU使用率を下げることにつながります。
また、開発中はこれらのことが忘れられがちです。作るのに必死なのかもしれませんが、後々困るのは負荷テスト実行者ではなく、それをチューニングするエンジニアなのです。つまりは自分たちであるわけです。サービスイン前に慌てなくていいように、早い段階から対応していき、余裕を持ってサービスインを行えるようにしましょう!!