Cakephp2系が激重だったので、色々やったらクソ速くなった

2017年10月26日

CakephpでWebサービスを作っているのですが、最初の頃は速かったのに
いつの日か気づいた時には、激重になっていました。

Google Speed Insightでチェックすると、

○ トップページ
モバイル 66点
PC 70点

○ シングルページ:
モバイル 47点
PC 69

そこまで悪い数字ではない(特にPC)けれど、体感でのスピードは激重。
5,6秒くらいかかってる気がする。これじゃユーザーすぐ離脱するぜ。。。

ということで、Cakephpのパフォーマンス向上施策をしました。

先に結果から書いておくと、

Mysqlのクエリ発行回数が多すぎた。

でした。
– ムダにDBにクエリ投げないこと
– DBにindexをきちんと

結果的には、mysqlのクエリが多すぎた事が一番大きな原因でした。
僕の場合footerに沢山の情報を表示するためにAppControllerで大量にfindしてControllerで読み込んで表示させてたんですね。。

どのくらいmysqlクエリを投げているか確認する方法

app/Config/core.phpのdebugモードにして、

<?php echo $this->element('sql_dump'); ?>

を計測したいビューに貼付けて実行すると、、、

そのページで読んでるクエリの数が70もありました。。
それを、出来るだけ減らして、半分以下の31に減らした結果、

(default) 31 queries took 33 ms

クエリ数: 31 になり
劇的にスピードがアップしました。

mysqlクエリが一番大きかった気がしますが、まぁ色々やった結果だと思うので、他にもやった事をメモっておきます。

パフォーマンス向上ためには、色んな因数があると思うんですが、

コード的側面:Cakephp側
インフラ的側面:mysql、OS、Apacheなど

と分けて2つにわけて考えました。

計測には、BenchmarkComponentで処理速度を計測します。

Cakephp側でやったこと

findでは、必要でない限り、firstを使う。

必要のないデータを取ってきても単に無駄なだけなので。

allの場合でもなるべくlimitを指定する。

これまた上記と同じで、無駄なデータはそもそも取得しない。

$html->linkを消す

これは、サイトに書いてあったんですが、Htmlヘルパーのリンクメソッドが実は激重らしいので、これを全て削除、絶対パスに書き換える。

cssをcompressed

SassでCSSを管理してるんですが、それ全部圧縮。
compassでコンパイルする時に、

compass watch --output-style compressed

とすれば、自動でやってくれます。

インフラ的(サーバー、DB、OSなど)でやったこと

mysqlチューニング

vim /etc/my.cnf

そこに、
query_cache_size = 64M
を追加

クエリキャッスサイズに関する記述を追加。

クエリキャッシュには、SELECTクエリのテキストとクライアントに送られた結果が格納され、以後同じクエリを受け取った際、クエリの解析と実行を行わず、クエリキャッシュから結果を取り出します。同じクエリが何度も実行される環境下では、クエリキャッシュを使う方が効率的で、かつパフォーマンスを向上させることができます。

まぁクエリキャッシュサイズを設定すると、同じクエリを受け取った場合、
キャッシュからそのデータを取り出せる様にするってことですね。
まぁいちいちmysqlからデータとってこなくても良いので、そりゃ速くなる。

[参考URL]
http://www.webcreator-net.com/tips_memo/server/20120705220008.html
http://dream-web.info/2014/01/28/2993/

CentOSチューンアップ

まずはメモリを異常に使用していないかチェック。
freeコマンドで、メモリ使用量をチェックします。

# free
total used free shared buffers cached
Mem: 1922360 1429568 492792 0 167796 655068
-/+ buffers/cache: 606704 1315656
Swap: 2097144 5032 2092112

CentOSは利用しない機能を起動させている事が多いので、以下のコマンドで停止させます。

sudo chkconfig auditd off
sudo chkconfig haldaemon off
sudo chkconfig lvm2-monitor off
sudo chkconfig mdmonitor off
sudo chkconfig netfs off
sudo chkconfig restorecond off
sudo chkconfig smartd off

これで不要なデーモンをストップできました。
OSを再起動すると設定が適用されます。

再びfreeでメモリをチェック

# free
total used free shared buffers cached
Mem: 1922360 303292 1619068 0 14044 60608
-/+ buffers/cache: 228640 1693720
Swap: 2097144 0 2097144

メモリの使用量めっちゃ減った。

メモリの使用量は減ったけど、体感ではあまり変化を感じませんでした。

[参考URL]
http://tnakamura.hatenablog.com/entry/20120430/sakura_vps_centos_setup
http://tanaka.sakura.ad.jp/archives/001065.html

結果

上記、色々やったんですが、結果的に

[ローカル] トップページ
改善前 0.5302823333
改善後 0.3308188333

[本番] トップページ
改善前 2.216441733
改善後 0.247553

[Google Speed Insight] PC版
2.1 → 0.3

[Google Speed Insight] モバイル版
1.8 → 0.28

[ローカル] シングル
改善前 0.5078827273
改善後 0.2126391538

[本番] シングル
改善前 2.163863706
改善後 0.3548705625

[Google Speed Insight] PC版
2.0 → 0.32

[Google Speed Insight] モバイル版
1.6 → 0.36

となり、ほぼストレスなく見れる様になりました。
サイト速いとやっぱ良いですね。