久しぶりに自分以外のNucleusを触る機会があったんですが、memcacheを組み込んでいないNucleusの動作のモッサリ加減に閉口。memcacheを組み込んでいるNucleusとは明らかに速度が違います。現状の1ページ表示するのにmysqlに100回とかクエリを投げているのはどう考えてもサーバにやさしくないので、Nucleusコアに汎用のキャッシュマネジメントをする機構が必要なんではないかと思いました。
ということで、以前に作ったmemcacheコア改造を汎用化すると同時に、キャッシュの書き出し先をmemcacheだけでなくファイルにすることも可能なように改造してみました。
オリジナル版のNucleusについてはv3.31がリリースされました。
We have released Nucleus CMS v3.31. This release has some new features and a lot minor improvements. You can find more details in the version history.
日本語版についてもリリース準備が始まっていますので、もうすぐリリースされると思います。ということで、僕もこれからテストに参加したいと思います。
N-gramを使えば形態素解析がなくても、MySQLのfulltextインデックスを使った全文検索ができるよという話。文章をN-gramに変換するためのphpモジュールもついているので、すぐに導入できます。
MySQL FULLTEXT Ngram : LIKE検索より数十倍高速な、お手軽 日本語全文検索 について|blog|たたみラボ
前回の記事 で触れた、FULLTEXTとNgramを駆使した日本語全文検索についてまとめてみました。パフォーマンスや導入方法の解説にあわせて、専用のNgramテキストを生成する php/perl モジュールも公開していますので、使いどころを把握した上で、気軽に試してみてくださいませ。
確かにこの方法なら簡単だし、特に追加で必要になるものもないのでNucleusの標準の検索機能にこの機能を組み込んでしまうというのはいいかもしれない*1なぁ。
外部APIへのアクセスを非同期取得にして動作を高速化させたバージョンをリリースします。
現状でもYahoo!APIは十分早いのでそんなに効果がないかも知れません。。。。
※使い方についてはplugins:metatags[Nucleus CMS Japan Wiki]を参照してください。
動作確認はNucleus 3.3(UTF-8)、PHP 4.4.7環境で行っています。動作確認報告、バグ報告はこのエントリへ、コメント・トラックバックをお願いします。
これまでTrackbackブロックや公開の切り替え、削除などの管理が行えるのはSuper-Adminに限られていましたが、これをSuper-Admin以外にもできるようにしてみました。複数人でNucleusを利用している場合にはバージョンアップをすることをおススメします。例によって穴が開いている可能性がありますので、おかしな動きを見つけたら教えてください。
※使い方についてはplugins:trackback [Nucleus CMS Japan Wiki]を参照してください。
動作確認はNucleus 3.3(UTF-8)、PHP 4.4.7環境で行っています。
動作確認報告、バグ報告はこのエントリへ、コメント・トラックバックをお願いします。
正式にパッケージングしたりドキュメントを整備いる暇がないのでNP_BBAuthとNP_MetaTags /w AsyncHTTPは僕のプライベートリポジトリからNucleusCMS JapanのCVSに移しておきました。
興味のある方はCVSから落としてみてください。
ここで触れたとおりUSのYahoo!IDにしか対応していませんが、Yahoo!アカウントでユーザーを認証するNP_BBAuthをサクッと作ってみました。欲求不満のリバウンドなのか本気を出してみたら3時間くらいでできちゃいました。中身はNP_HatenaAuthと兄弟という感じです。
† このAPIの雑感
作ってみた雑感ですが、この認証APIはHatena認証APIやTypeKeyとはちょっと違っていて認証したユーザーの生のアカウント名(つまりYahoo!IDのこと)が通知されてきません。通知されてくるのはアカウントのハッシュ値だけなので、これだけではYahoo!のユーザーということしかわからないようになっています。
つまり認証結果のみを純粋に返すだけで、ユーザーに関する個人情報が一切取得できないような割り切ったAPIです。シングルサインオンとして使うのであれば、別途自分のDBにアカウントのハッシュ値と紐付ける形で何らかのプロファイルを持つ必要がありそうです。Buzzurlもアカウント作成時にYahooで認証した後に、Buzzurl側にユーザー名やメールアドレスを入力する必要がありますが、これもこのような事情があるためであると推測されます。
8月中はNucleus関連のエントリを1つも書いていませんでしたが、細かな改良は粛々とやっております。夏場はアクセスがすごかったので負荷対策もさらにあれこれやってみたので、この辺りも余裕ができたらちょっとずつ公開していきたいと思いますので、しばらくお待ちください。
うーん、時間ができるのは仕事のデッドラインがすぎてからかなぁ。
cactiが復活したのでサーバのCPU Usage 2年間分*1を貼ってみます。CPUはPentium4 3GHzで、大半の負荷はNucleusの関連プロセス(apache, mysql, memcached)によるものです。1日あたりのPVはロボットによるアクセスも含めて現在約4万強(1700PV/h)くらい*2です。
グラフを見ると2006年3月末と12月中に大きくCPU Usageが下がっていますが、これはアクセスが下がったわけではなくチューニングを行ったためです。特に後者についてはmemcachedの導入ポイントであり、コア改造によりプラグインオプション、スキン、テンプレート、グローバルオプションがmemcachedにてキャッシュされるようになったことにより、かなりmysqlの負荷軽減が達成できていることがわかると思います。
kimitakeさんにNP_HatenaAuthが動かないという連絡をもらって、いろいろ追跡したら最後にallow_url_fopenがoffだったという結論にたどり着きました。セキュリティ的にはデフォルトはoffである方が好ましいというのはわかるのですが、この問題は結構根が深そうです。
驚いたことにPHP 4.3.4からphp.iniからしかこの設定を変更できなくなってしまいました。(INI_SYSTEMの設定項目になった)誰かがセキュリティ強化を目的として変更したのだとは思いますが、セキュリティも強化できず、有用なリモートファイルアクセス機能も使えなくする非常に拙い変更です。
allow_url_fopenってphp.iniからしかこの設定を変更できないんですね。実は自作のプラグインでもallow_url_fopenに頼ってしまっている部分が結構あってallow_url_fopenがoffだとうまく動かなかったりするんですが、その一方で自前でHTTPの処理をしている部分*1もあるような状態でちょっと統一感がないような状態になってしまっているのですが、この辺りの処理を統一したほうが幸せになれそうです。ということで今後のtodoにいれておきます。