Entries from 2008-01-01 to 1 year

Sub::Throttle で MyISAM テーブルのホットメンテナンス

Kazuho@Cybozu Labs: 実行時間を抑制するモジュール Sub::Throttle を書いた の話。サービスを動かしたまま、テーブルの全行書き換えをやりたいこととかって時々あるけど、MyISAM で単純に update ... とかやると、全行の更新が完了するまでの間テーブルがロ…

Q4M のバージョンを SQL で確認する方法

mysql> select PLUGIN_VERSION from information_schema.plugins where plugin_name='QUEUE'; +----------------+ | PLUGIN_VERSION | +----------------+ | 0.1 | +----------------+ 1 row in set (0.01 sec)長いですがこんな感じ。ちなみに、今までのバー…

Q4M の複数行一括消費モード

Pathtraq の DB 負荷のかなりの部分が、Gungho が InnoDB からデータを読んでる点に由来するっぽいので、なんとかしたい。かといって Gungho 自体は捨てたくない (よくできてると思うし) ので、じゃあ Gungho のモデルを保ったまま Q4M をつなごうと思うと、…

XMLBind を coderepos にアップロード

昔書いた C++ の XML バインディングである XMLBind を coderepos にアップロードしました。http://coderepos.org/share/browser/lang/cplusplus/XMLBind/ドキュメントは探さないと出てこないけど、こんな感じ。 たとえば、 struct Date { int year; int mon…

keyedmutexd のハッシュ関数

xor 取るべきところが or になってるし、しかもループも壊れてないか? このひどさは異常。探索を速くするためにしか使ってないからバグとして顕在化はしないんだけどorz INLINE int key2i(const char* _key) { const int* key = (void*)(_key + KEY_SIZE); …

今日の MySQL トリビア

MySQL は merge join をサポートしていない dependent subquery より left join 〜 isnull のが速い mysql> select count(*) from m where id<100000 and not exists (select * from tt where tt.id=m.id); +----------+ | count(*) | +----------+ | 97 | +…

BASIC 認証でログアウトを可能にする方法

Cookie でログイン状態を管理すればいいんじゃいのかな。まず、ログインボタンを押した時「だけ」is_logged_on を真にする。 HTTP/1.1 Authorization Required Set-Cookie: is_logged_on=1 WWW-Authenticate: Basic realm="Hoge123456" ...サーバ側では、Bas…

12年前に書いたコードを晒してみる

http://coderepos.org/share/browser/lang/c/friendsdマルチプロセス&共有メモリによるダウンロード+ select(2) ベースの配信による finger プロキシ。タイムスタンプ見てると、1995年11月〜1996年10月っぽい。どうみてもダメダメな reader-writer lock が…

C++ サーバフレームワークの最適化

Kazuho Oku on Twitter: "とりあえず分散型 Twitter 技術デモの段階までは作る。Twitter への乗り入れモデルも実装するかも" とか言ってしまった都合上、高速なサーバフレームワークが必要になるので、Kazuho@Cybozu Labs: C++ テンプレートを使って高速な高…

エッジトリガ (epoll) の話

エッジトリガのメリットとしては、「データが貯まった状態で処理を後回ししても起こされない」というのもあるみたいだけど、これはEPOLLONESHOTというオプションを使うとレベルトリガでも実現可能。epollであえてエッジトリガを使うとすれば、「ノンブロッキ…

re 6 x 3: 「神(示申)」と「神」

rok さんありがとうございます。Firefox は Pasteboard Manager じゃなくて旧式の Scrap Manager を使っています。で、Firefox のソースコードを眺めていると、nsClipboard::SetNativeClipboardData 関数内で、 PutScrapFlavor(..., 'utxt', ...); PutScrapF…

re Yet Another Skeleton Engine を作ってみた (YASE 0.1リリース) - mir the developer

モダンでいいすなぁ。2点ほど。 ヘッダに static linkage の関数宣言があるのはおかしい ha_yase::lock が初期化されていない あと、ヘッダは #ifndef #define 〜 #endif で囲っておいたほうがいいのかなぁと思いました。MySQL 的には #pragma interface で…

C++ でバイナリイメージと type_info から型を (変換しながら) 組み立て

動いた。coderepos に上げた (http://coderepos.org/share/browser/lang/cplusplus/reflection/trunk/memrebuild.hpp) こんな感じでいいんじゃないかな。まだコンパイルしてないけど。 template <typename T> struct instantiator { virtual ~instantiator() {} T (*get(</typename>…

PostgreSQL におけるタイムライン処理

PostgreSQL 8.3 で ORDER BY ... LIMIT の処理が最適化されるようになったらしい。 ORDER BY ... LIMIT をソートしないで処理するようにした PostgreSQL 8.3 に関する技術情報 - SRA OSS, Inc. 日本支社 参考: Kazuho@Cybozu Labs: フレンド・タイムライン処…

コンパイルタイムにリスト構造作ってルックアップ

コンパイル時に typedef linked_list<int_pair<1, 'a'>, linked_list<int_pair<2, 'b'> > > tbl;みたく変換テーブル (1 => a, 2 => b) を構築してルックアップするってのを何となく書いてみた。リンクリストだけど定数のルックアップならコンパイル時に解決できるから O(0) だぉ。って使えなさ</int_pair<2,></int_pair<1,>…

MySQL と multi-statement SQL injection

複文が利用できるデータベースの調査: SQL Serverが狙われるには理由がある - 徳丸浩の日記(2008-05-02) の件だけど、MySQL のプロトコルは multi-statement をサポートしている。(参考: http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol…

スタックマシンとかレジスタマシンとかって

元の議論把握してないけど、命令セットアーキテクチャにおいて、 オペランドを明示的に指定するのがレジスタマシン オペランドがスタックトップとかに固定されてるのがスタックマシン なんじゃないの? 実際に変数をレジスタに割り付けするかとか関係なく。

バイト数が定数の memcmp

$ C -cO3 -S -e 'return memcmp(argv[0], argv[1], 1024);' (snip) movl $1024, %ecx cld repz cmpsb mov $0, %eax je 0f movzbl -1(%esi), %eax movzbl -1(%edi), %ecx subl %ecx,%eax 0: (snip)ちょwww マジですかorz

ToDo

以下の速度感を把握する context switch syscall unix socket tcp socket syscall については BYTE UNIX benchmark とかで出るけど、あれは close(dup(0)) だし、純粋なオーバーヘッドじゃないので注意が必要。

Mac OS X で pthread_mutex_lock と pthread_mutex_unlock の回数がずれる話

2059 回 lock (wait からの復帰も含まれる) され 59 回 wait し 2000 回 unlock され 1966 回 block したことがわかります pthread でキューを作る(再挑戦)。ついでに dtrace でスレッドの解析 - IT戦記 pthread_mutex_lock = pthread_cond_wait + pthread…

InnoDB の insert buffer

INSERT 処理のスループットについて、ユニーク制約のないインデックスについては、ディスクに落ちてても大きな問題にならないらしい。 逆に言うと、セカンダリインデックスについては、無駄に UNIQUE とかつけるべきではない。 9.4.4. Issues with the Inser…

mysql_direct_access でクライアントと直接会話する方法

結局文字列型の UDF として定義して、SELECT binary direct_udf_func(binary args); みたいな感じでバイナリデータをクライアントとやり取りすればいいだけの話かと思った。 #これで文字コード変換スキップできた... はず... たぶん...

MySQL のストアドプロシージャとバイナリプロトコル

InnoDB の数値がクライアントに送信されるまで - kazuhoのメモ置き場 の続き。で、MySQL のサーバサイドプリペアードステートメントを有効化すると、バイナリ転送が行われるようになるんだけど、これは「使うな」という人もいる。参考: Prepared Statements,…

memcpy 最適化

バイト単位でコピーするアホなコードの方が、勝手にベクトル化される分、gcc 内蔵のヤツより最大3倍高速なんだってwww memcpy() compiled with vectorizing compilers All current compilers for linux should support SSE2 auto-vectorization with #inclu…

InnoDB の数値がクライアントに送信されるまで

InnoDB から MySQL コアへ4バイトコピー 数値としてロード (RISC 系のみ) 数値をテンポラリバッファへ文字列化 (除算は桁毎に1回) 文字列の先頭を揃えて memcpy 数値の文字列を行バッファへ追記 行バッファを転送データバッファへ追記 送信 うーん...追記:…

Returning result sets from stored procedures

32.4.14: Can MySQL 5.1 stored routines return result sets?Stored procedures can, but stored functions cannot. If you perform an ordinary SELECT inside a stored procedure, the result set is returned directly to the client. You need to use t…

MySQL の UDF は遅いんじゃないかという話

Kazuho at Work: Performance of MySQL UDFs vs. Native Functionsほとんどの場合は気にする必要ないんじゃないかなぁ。郵便局行ってから出社する。

MySQL ストレージエンジンに直接アクセスするストアドプロシージャ

詳細な説明はこっち: Kazuho@Cybozu Labs: MySQL (InnoDB) に直接アクセスしてタイムライン処理を高速化する話 コードはこっち: http://coderepos.org/share/browser/lang/sql/mysql_timelineストアドプロシージャっつーか、ぶっちゃけ UDF なんですが。 と…

MySQL ストレージエンジンへのダイレクトアクセス

前項 (タイムライン処理と SQL オプティマイザの可能性 - kazuhoのメモ置き場) の続き。一方で、アプリケーション開発者の立場から言うと、SQL オプティマイザをチューンするというのは迂遠すぎてやってられないわけで。なら、MySQL のストレージエンジンに…

タイムライン処理と SQL オプティマイザの可能性

re Kazuho@Cybozu Labs: フレンド・タイムライン処理の原理と実践SQL オプティマイザについての議論としては、たとえば、 SELECT * FROM message INNER JOIN follower ON message.user_id=follower.follower_id WHERE user_id=2 ORDER BY message.id DESC LI…