Cakephp2系が激重だったので、色々やったらクソ速くなった
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]
<?php echo $this->element(‘sql_dump’); ?>
[/php]
を計測したいビューに貼付けて実行すると、、、
そのページで読んでるクエリの数が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でコンパイルする時に、
[shell]
compass watch –output-style compressed
[/shell]
とすれば、自動でやってくれます。
インフラ的(サーバー、DB、OSなど)でやったこと
mysqlチューニング
[shell]
vim /etc/my.cnf
[/shell]
そこに、
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コマンドで、メモリ使用量をチェックします。
[shell]
# free
total used free shared buffers cached
Mem: 1922360 1429568 492792 0 167796 655068
-/+ buffers/cache: 606704 1315656
Swap: 2097144 5032 2092112
[/shell]
CentOSは利用しない機能を起動させている事が多いので、以下のコマンドで停止させます。
[shell]
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
[/shell]
これで不要なデーモンをストップできました。
OSを再起動すると設定が適用されます。
再びfreeでメモリをチェック
[shell]
# free
total used free shared buffers cached
Mem: 1922360 303292 1619068 0 14044 60608
-/+ buffers/cache: 228640 1693720
Swap: 2097144 0 2097144
[/shell]
メモリの使用量めっちゃ減った。
メモリの使用量は減ったけど、体感ではあまり変化を感じませんでした。
[参考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
となり、ほぼストレスなく見れる様になりました。
サイト速いとやっぱ良いですね。