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