最近、Negitaku.org の表示が遅くなってしまう問題が頻発していたので原因を調べました。
今回の件でいうと、原因は MySQL のクエリーが原因で、 クエリの結果が処理されるまでに時間がかかりすぎて DB が高負荷となり、 正常に表示されるまでに時間がかかっていました。
この部分はサイト的には実際のところどうでも良いレベルの処理なので 思いきって簡素化してざっくりとした処理にしました。 結果的にはほとんど影響が無くなったのではないかと思います。
Negitaku.org の表示が遅くなるにはこれまでいくつかのパターンがあったのでなんとなく書いてみることにします。
一言で言うと基本的には「実装がまずい」ということになります。 Negitaku.org は CakePHP という PHP のフレームワーク上に 僕が素人レベルのスキルと情熱だけで構築したプログラムで動作しています。 ですので、実はいたるとこに問題があったりするのです。
CakePHP に頼りすぎ
Negitaku.org は先に書いたとおり、 CakePHP という PHP のフレームワーク上にサイトを構築しています。 このフレームワークはかなり便利で数行の処理を書くだけで 簡単にデータベースからデータを取得してくれます。
しかし、データベースに渡される SQL は CakePHP が自動的に発行するもので 無駄な処理が含まれてしまっているケースが多いです。 今回の重い処理もそれが原因でした。 この辺りは、問題が起きる度に毎回 SQL のクエリーを最適化して対応しています。
ブログパーツが遅い
はてなと Twitter のブログパーツを使っているのですが、 ここの表示が遅い関係でサイトのレンダリングにも影響しています。 はてなブックマークは、サイトを見てくれている方はあまり利用されていないので 削除してしまっても良いかなと個人的には思っています。 その影響がどうなるのかがちっょとわからない感じですね。 Twitter は外せない状態なので現状維持で…。
設定・構造の問題
データベースの構造とか、キャッシュの持たせ方が良くないとか。 スマートじゃないデータの持たせ方をしているため処理が遅い、 キャッシュファイルを1つのディレクトリにまとめて出力させたために 表示までの時間が増加してしまっているとか色々あります。
これはまあ素人が作っているので宿命的な部分です。 問題がある度に原因を究明して改善している感じです。
ニュース記事のキャッシュであれば、記事IDの末尾の数字をベースに 10フォルダに分けたりとか。
memcached とか 複数データベースとか使ってみたりとかもしたいですけど この辺りはノウハウが個人的に全然ないので導入が難しい感じです。
ホスティング元の回線の問題
Negitaku.org は勤務先の会社の好意で、 自分が購入したサーバーを無料でホスティングしてもらっています。 ただ、回線がちょっと細かったりする関係で大きなメディアファイルを処理するのがきついです。
ですので、ニュースの画像はさくらインターネットにホスティングしている この negitaku.net の方において回線負荷を分散しています。
あとは、某ヒーローのサイトと同じ回線上に乗っている関係で 毎年4/1は確実に死亡することになっています。 優先順位的にはそちらが優先なのでその日はどうしようもない感じです。
このあたりの問題を改善するためにサーバーをさくらのVPS上に移動させようと思って いろいろやっていたりします。協力してもらっている @fedlic さんに感謝。 でも時間が足りなくてサーバーの設定とか全然進んでいません。
とりあえずそんな感じで色々進めていたりします。