Blog ブログ

CPU使用率ってなに?

皆様お久しぶりです。
シニアプログラマの小田です。約1ヶ月ぶりの登場です。
今回は負荷についての第3弾、CPU使用率についてです。

概要

CPU使用率と聞くと、大抵の人がグラフで見たことあるあれ、という様なイメージでしょうか?
例えばMUNINですと、以下のように見えたりします。

MUNIでCPU使用率を表示

つまりCPUがどういう状態なの?というのを見るために存在するパラメータです。
上記の図では2つCPUがありますので、使用率は200%まであります。
使用率ということで、つまりは今忙しいのか?暇なのか?を表しているとお考え下さい。
では、どういうときに忙しくなり、私達は気をつければいいのか?を話していきます。

CPU使用率が上がる時

何か処理させれば当然上がるのですが、やはり問題になるのは「どこが重たいのか?」ということを探すときです。それを解決するのは簡単な話です。「コードを書かない」が使用率を上げない最も簡単な方法です。バカにはしておりません、至って真面目な回答です。
もちろんゲームを運営している関係で0%なんてことはありません。むしろそういう状況ならゲームは閑古鳥が鳴いているでしょう。ということは多少上がることは許容しても、何故か常に100%付近というものを考慮するには「無駄なものは書かない」に尽きるのです。

  1. そもそも忙しくなる要因は分かっているか?(要因)
  2. 暇になるようにすれば、どうすればいい?(解決方法)

こういうことです。
ではさっそく紐解いていきましょう。

要因

CPU使用率が上がる要因は様々ですが、その中で一番陥りやすい問題を上げて説明していきます。

無駄な処理①:for,foreachを連発する

これ、皆さん心当たりありませんか?特に、
  1. DBから値を取得する時
  2. レスポンスのデータを作成する時
  3. ゲームの仕様上、ロジックが複雑なため

これらが関係しているのではないでしょうか?
1,2については各社様もフレームワークを使われたり、自社ライブラリを組まれているので、それを使って対処されているかと思います。

無駄な処理②:何度もマスタにアクセスする

同じデータへのアクセスは無駄ですよね。ではそれを解決するにはどうするか?
大抵の人はキャッシュをイメージされるのではないでしょうか?確かにその方法は有効です。またDBよりもオンメモリ上に配置された値を取得すると高速に値を扱えます。
ただ、キャッシュサーバへのコネクション数が増加して、次はそこがボトルネックになってしまいます。

解決方法

無駄な処理①:for,foreachを連発する

 例えばソートや入れ替え、削除といった処理をさせているなら、それはPHPが用意している関数を使いましょう。また出来そうかどうかということをまずは考えましょう。
そもそも1人のエンジニアが思ったことは、大多数の人も思っています。ということは世界的に普及しているPHPであれば、既にそういうことが出来る処理が用意されているはずと考えるべきです。そうすればビルトイン関数を使うことにより高速化できます。これはPHPエクステンションがC/C++で書かれているため高速なのです。

同じロジックをPHPで書くのと、C/C++で書くのとを想像したら理解できますよね。

無駄な処理②:何度もマスタにアクセスする

 これはキャッシュサーバ増設といった方法(インフラ)でカバーできますが、そこまで予算もない場合は、webサーバのメモリを利用しましょう。
webサーバは簡単にスケールアウトできるということと、そもそもwebサーバでメモリを使うような処理はPHP以外に存在せず、ログ転送とかあってもそこまでメモリを使う状況に遭遇したことがありません。マスタデータは静的データのため、大概の稼働状況下でデータが変動することはありませんので、webサーバのメモリを使って高速化を図ることが可能です。

検証方法

jMeterで負荷をかけつつ、Xdebugで計測しながら検証することをお勧め致します。
地味な作業ですが、私は一番有効と考えております。
あとは自動化ですね。検証作業ほど機械に任せたいと思います。
GitHubでPushされたコードに対して、定期的に検証をまわすことで、
「いつ、どのコミットで重たくなったか?」がわかりますので、そういった検証方法をされている方がいましたら、是非、交流させて下さい!!

まとめ

今回はPHPを書き始めた新人や機能追加をしていって気がつけば陥るという側面から記述致しました。CPU使用率についてはどこにいった?!と思う人もいると思いますが、最初にも話したとおり「何も処理させない」を目指すために、それぞれの問題を解決し高速化することが、CPU使用率を下げることにつながります。
 また、開発中はこれらのことが忘れられがちです。作るのに必死なのかもしれませんが、後々困るのは負荷テスト実行者ではなく、それをチューニングするエンジニアなのです。つまりは自分たちであるわけです。サービスイン前に慌てなくていいように、早い段階から対応していき、余裕を持ってサービスインを行えるようにしましょう!!

採用情報

クラウドクリエイティブスタジオではプログラマを募集しております。
ぜひ、一緒に面白いゲームを作りましょう!
採用情報