« 2007年08月 | メイン | 2007年10月 »

2007年09月28日

DBI::Printf - A Yet Another Prepared Statement

 Java や C++ のような関数のオーバーロードができる言語では、プリペアードステートメントのプレースホルダが型をもつ必要はありません。しかし、Perl のように数値型と文字列型の区別がない言語で最善を期そうとすると、変数をバインドするタイミングで型を意識してコードを書かなければならず面倒です。 (参考: MySQL の高速化プチBK)

 だったら、printf のように、プリペアードステートメントのプレースホルダで型を指定できればいいのに、と、もともとは Twitter でつぶやいたネタなのですが、SQLステートメントをキーとしてキャッシュにデータを保存したいといった事情もあって、実際に作ってしまいました。

Kazuho Oku / DBIx-Printf - search.cpan.org
DBI-Printf-0.01.tar.gz

続きを読む "DBI::Printf - A Yet Another Prepared Statement"

投稿者 kazuho : 2007年09月28日 10:10 | コメント (2) | トラックバック (2) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年09月27日

ウェブサービスのためのMutex - KeyedMutex

 昨日、以下のように書いたのですが、両者のうち2番目のアプローチを実現する Perl モジュール KeyedMutex を作成しました。

 サーバにおける Thundering Herd 問題は良く知られていると思いますが、類似の現象はキャッシュシステムでも発生することがあります。
(中略)
 対策としては、以下の2種類の手段があります。
  • バックエンドへの同一リクエストを束ねるような仕組みを実装する
  • エクスパイヤ以前の残存時間が一定以下となった段階で、キャッシュエントリのアップデートを開始する
 これらの手法には、それぞれメリットとデメリットがあり、アプリケーションによって最適な方法は異なります。
Kazuho@Cybozu Labs: キャッシュシステムの Thundering Herd 問題

 KeyedMutex は、クライアントが指定した鍵毎に排他処理を行うサーバ・クライアント型のシステムです。キャッシュへのデータ保存と連動させることで、データベースへの余分な問い合わせを抑制し、動作効率を高めることができます。以下のような感じで使用します。

続きを読む "ウェブサービスのためのMutex - KeyedMutex"

投稿者 kazuho : 2007年09月27日 15:46 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年09月26日

キャッシュシステムの Thundering Herd 問題

 サーバにおける Thundering Herd 問題注1は良く知られていると思いますが、類似の現象はキャッシュシステムでも発生することがあります注2

 通常、キャッシュに格納されるデータは、それぞれ単一の生存時間をもっています。問題は、頻繁にアクセスされるキャッシュデータがエクスパイアした際に発生します。データがエクスパイヤした瞬間から、並行に走る複数のアプリケーションロジックがミスヒットを検知し、いずれかのプロセスがキャッシュデータを格納するまでの間、同一のリクエストが多数、バックエンドに飛んでしまうのです。

 対策としては、以下の2種類の手段があります。

続きを読む "キャッシュシステムの Thundering Herd 問題"

投稿者 kazuho : 2007年09月26日 10:11 | コメント (2) | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年09月20日

MySQL の高速化プチBK

 鴨志田さんに教えていただいたのですが、MySQL のクエリは数値をクォートしない方が高速になるらしいです。たとえば以下の例では、160万件の整数から4の倍数を数えていますが、数値をクォートしないほうが約50%も高速になっています。

続きを読む "MySQL の高速化プチBK"

投稿者 kazuho : 2007年09月20日 12:06 | コメント (1) | トラックバック (2) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年09月19日

システムコールの最適化

 今朝、会社で「最速のファイルコピー」についての話題が出ていました。そこで、ちょっと気になって、read(2) の呼出のオーバーヘッドがどの程度あるのか、ベンチマークをとってみました。

Performance of read(2)

 グラフは、それぞれの環境で、10MBのファイルを1,024回読み込むのにかかった時間を示しています。ファイルの内容は当然メインメモリにキャッシュされているので、実際は、カーネル内のバッファキャッシュからユーザープロセスのバッファへのメモリコピーの速度を測定していることになります。このグラフから、以下のような傾向を読み取ることができます。

続きを読む "システムコールの最適化"

投稿者 kazuho : 2007年09月19日 13:14 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年09月18日

Swifty 0.03 を公開しました

 共有メモリによる高速なキャッシュ実装である、Swifty 0.03 を公開しました。今回のバージョンは、バグ修正も含んでいますが、64-bit のアトミックアクセスを利用して n-way set associative 化したのが、技術的におもしろい点かなと思います。

 Perl からの利用という意味ではメモリ確保がボトルネックになっているので、これ以上高速化するメリットはないでしょう。今後は Pathtraq に組み込んで、実際どうなるか見てみたいと考えています。

投稿者 kazuho : 2007年09月18日 15:55 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年09月12日

swifty-0.02 と Perl バインディング

 自作しているキャッシュシステム Swifty のバージョン 0.02 と Perl バインディングをリリースしました。ベンチマーク等はそちらをご覧いただくとして、こちらでは今後の課題を書きたいと思います。

  • ダイレクトマップ方式をセットアソシアティブに変更する (さぼっています)
  • エクスパイア時に複数のプロセスが更新作業を開始しないよう、事前更新機能と排他ロックを実装する

そんなところでしょうか。パージングが LRU ではなくランダムなのは、リードが lock-free なので修正は難しいかな、と思っています。まとまりがないエントリで恐縮ですが、リリースの告知をかねてということでご容赦いただければ。

投稿者 kazuho : 2007年09月12日 16:43 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年09月10日

Perl から MySQL に非同期アクセスする方法

mod_perl のプロセス内でやるのに POE でイベントループ回せ、ということ? もうちょいkwsk! > b:id:kazuhooku
naoyaグループ - naoyaの日記 - 非同期SQLサーバ

 エントリ全体の趣旨はさておき、ソケット通信を非同期化するためにまた別のソケット通信を行うという使用例に違和感を覚えたのですが、回避策としてブクマコメントで提示した POE::Component::EasyDBI も内部で fork (&プロセス間通信) してるんですね。変なコメントしてごめんなさい忘れてください。って、それだけではなんなので...

 ここから本題。

 私はそういうケースに遭遇したことはないのですが、大規模なサービスでは、複数の SQL クエリを同時実行したり、あるいは、時間がかかるクエリを実行中に他の処理を行ったりしたくなる、ということがあるかもしれません。ですが、DBI にはクエリを非同期実行するための仕組みがないようです。というわけで、Net::MySQL で非同期クエリを可能にするパッチを書いてみました。

続きを読む "Perl から MySQL に非同期アクセスする方法"

投稿者 kazuho : 2007年09月10日 10:54 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2007年09月05日

サーバシグニチャは隠さないのが当たり前

ウェブサーバ(Apache)で、404などのエラーページを表示したとき、ヘッダやページの下にApacheやOSのバージョンが表示されます。こういったサーバ情報をわざわざ表示する必要はありません。

ウノウラボ Unoh Labs: 5分でできるウェブサーバのセキュリティ向上施策

私も何年も前からセミナーではサーバ、モジュールバージョンは隠すようにと言っています。何故こんな事で賛否両論になるのか全く理解できません。

yohgaki's blog - サーバシグニチャは隠すのが当たり前

 Server: ヘッダを隠すメリットについての議論はあるようですが、Server: ヘッダを表示すべき理由についての解説がないようなので、知っていることを書いておきたいと思います。

続きを読む "サーバシグニチャは隠さないのが当たり前"

投稿者 kazuho : 2007年09月05日 10:27 | トラックバック (1) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク