2011/09/04(Sun)QNAP TS-219P+ を設定中 (4) - OpenPNE 3.6 beta13 をインストール

はてブ数 2011/09/04 2:23 計算機な日記::ボクと計算機 つーさ

OpenPNEをインストールして、一応動くところまではもってきた。
しかし、絶望的に動作が遅い。
adiaryは、今使ってるレンタルサーバに比べれば多少は遅いけどって感じなのに。

その他の負荷がまったくない状態でログイン後のマイページを表示するのに 20秒強 かかる。
httpd が CPU 100% のまま 20秒強
xdebug とかでプロファイリングしてみると、doctrine が絶望的に遅いらしい。

というか、トップページの表示のためにクエリが200以上飛んでるんだなぁ。
DB使いの荒い設計だ……。
opBlogPlugin に至っては、MemberTableでフレンドのIDを全部拾った後、その個々のIDに対して1個ずつQueryしてるっぽい。JOINでまとめないんですかー。

マイフレンド9人を表示するためにも、フレンドのIDを全部拾ってきて、php側でシャッフル・配列スライスして、今度はその1つ1つのIDに対して画像ファイルの場所を調べるためのクエリと、ユーザのニックネームを調べるためのクエリを別々に投げてる? なんだこれ。

っていうか、i18n のために friend → "フレンド" の変換までDB引いてる。

なんか、クエリの数はできるだけ減らせってどっかで習った気がするんだけど、それとはだいぶ感覚が違うなぁ……。

とにもかくにも、 Doctrine の クエリ実行 が信じられないほど遅い。
なぜかはわからないが、クエリの生成にめちゃくちゃ時間がかかっているくさい。
MySQLはインタラクティブモードでも、0.00secでクエリを処理してくれてる。

とりあえず、試しにアクティビティのボックスを例にDoctrineを使わないでPDOで生SQLを直接実行するように改造してみたり。

$data = $pdo->query("SELECT a.id, m.id mid, m.name, a.body, f.name iname, a.created_at, a.source_uri, a.source FROM member m LEFT JOIN member_image i ON m.id = i.member_id and i.is_primary = 1 LEFT JOIN file f ON i.file_id = f.id , activity_data a where a.member_id = m.id ORDER BY a.id DESC LIMIT ".$limit);

何これ気持ち悪いって感じだけど、これでプロファイラ上の実行時間は約1/5になった。
こうやって、doctrine使ってるとこ全部つぶしていけば、まぁ許容範囲に収まってくれるのか。
重くて我慢ならんとこだけ、と思っていたけど、全体的に我慢ならんので、作業量が多すぎてとてもやる気がしないω

原因の究明と解決にかれこれ2か月分の週末をほとんどつぎ込んでしまったわけだけど、
あまりにらちが明かないので、この辺でコミュニティサイトの運営は諦めようかなぁとかなんとか。

つーか、なんでこんなに動作が遅いんだろう。
そりゃ、レンタルサーバはXEON積んでるけど、だからってここまで差がつくもんなのか。
何か、キャッシュされるべきものがキャッシュされていないんだろうか。
x86 と ARM との違いのせいで、最適化に関する絶壁でもあるのだろうか。

正直その辺はまったくわからない。

OpenPNE以外のSNSエンジンってなんかないのかなぁ。
むしろ、ASP.NETでも使ってSNSサイト作ってみればいいのかも!

そして泥沼へ。