2008-01-01から1年間の記事一覧

高速ログフォーマットの提案

バイナリ形式のログフォーマットが必要になったので(テキストだと生バイト列を出力できなくて困る。Base64はイヤ)、どうせならオレオレフォーマットではなく一般的に使えるフォーマットだといいなーと思いメモ。 最初の発想 改良1:定義ファイル(静的型付…

MessagePack for C#

バイナリシリアライズ形式「MessagePack」がC#に移植されました! MessagePack C# 実装を作ってみた SUtils/Serialization 1.1.0 にて MessagePack, JSON 両方に対応してみた saiya++++++。 これでC、C++、Ruby、そしてC#の間で、相互に高速なオブジェクトの…

MessagePack 0.2.2 リリース - Rubyゼロコピー化, mswin32版

バイナリシリアライズ形式「MessagePack」のバージョン0.2.2をリリースしました。Ruby版で文字列をデシリアライズするとき、必ずしもコピーしなくなりました。文字列のデシリアライズが大幅に高速化しています。 また mswin32 版と mingw 版の ruby で Messa…

MessagePack 0.2.1 リリース

バイナリシリアライズ形式「MessagePack」のバージョン0.2.1をリリースしました。 Ruby:x86_64アーキテクチャでINT_MAXより大きいFixnumをシリアライズできなかったバグを修正 C++:msgpack::type::tuple がリファレンスをメンバに持つことができるようにな…

memcachedバイナリプロトコルは同期プロトコルを禁止するべき

現状のmemcachedのバイナリプロトコルのクライアント(=libmemcached)は、リクエストの順番通りにレスポンスが返ってくることを期待しており、これはmemcachedバイナリプロトコルを「汎用的なkey-valueベースの分散ストレージのためのプロトコル」として考…

Protocol Buffersは遅い

Google の Protocol Buffers は、同技術と競合するバイナリシリアライズ形式である MessagePack と比べて、場合によっては 19倍 以上遅く、シリアライズ後のデータサイズは 7倍 以上になることがあります。平均的に見ると MessagePack の方が高速であり、高…

MessagePack 0.2.0 リリース!

バイナリシリアライズ形式 MessagePack の2回目のリリースです。 フォーマットの仕様はそのままで、C++用のAPIを大幅に強化しました。詳しくは:サンプルコード msgpack-0.2.0.tar.gz MessagePackとは MessagePackは効率を重視したデータ交換用のフォーマッ…

mmap+POSIXセマフォによる高速なプロセス間通信 - mp::ipc_vector

同じホストの異なるプロセスの間で、高速な通信を行いたいときがあります:fork() したプロセスと通信したい場合や、「アプリケーションたくさん → localhostのクライアントデーモン1つ → サーバー」という形で接続したい*1 *2 場合などなど。 あるいは共有…

スレッド間通信のオーバーヘッドを比較する

pthread_系の関数は mutex か cond しか待てないが、select/poll/epoll はファイルディスクリプタしか待てないので、両方待ちたいときに困る。解決方法はいろいろあると思いますが、私の思いつく範囲では以下の4つ。 selectで待ち、シグナルで割り込む ファ…

同期プロトコルと非同期プロトコル

今のところチラシの裏的な話。 ネットワークプロトコルは、 リクエストした順番通りにレスポンスを返す(リクエストの順番とレスポンスの順番が同期している) リクエストした順番通りにレスポンスが返ってくるとは限らない(リクエストの順番とレスポンスの…

memstoredの実装詳細 1000行に収まる高速サーバーについて

1000行はテキトーなハッタリだが良くあること ;-) memstored の本体は memstored.cc ファイル1つに収まっており、その行数は600行程度しかない。memstored のポイントは、少ない行数で高速なサーバーをカンタンに書けたことであった。memstored の実装につ…

memstored 0.1 = memcached + mpio + Tokyo Cabinet

memstored は memcached のバイナリプロトコルをサポートしたハッシュストレージサーバーです。IO戦略ライブラリmpio の信頼性と性能をテストするために開発しました。IOに mp::iothreads を使用し、バックエンドには Tokyo Cabinet の抽象データベースAPIを…

MessagePack C++ API Document (β)

バイナリシリアライズ形式「MessagePack」を活発に開発中です。C++版のAPIについてサンプルコードを交えつつ紹介してみます。※2009-03-01:この内容はもう古いです。最新のドキュメントを参照してください:http://msgpack.sourceforge.jp/ インストール方法…

memcached binary protocol

先日memcached Night in Tokyo #1に参加してきました。レプリケーションがアツイ。バイナリプロトコルがアツイ。というわけでバイナリプロトコルのマイクロベンチマークをしてみました。 テストしたのは本家memcachedではなく、私が勝手に作ったストリームパ…

mp::iothreads

マルチコア時代の高速サーバーの実装で紹介したアーキテクチャを実装しようとすると、アーキテクチャ自体はマルチスレッドなので、ロックだ、メモリ管理だと、いろいろと面倒です。一般化できるなら一般化して、ロジック部分だけを書けば高速なサーバーが実…

MessagePack for C++ template版

※2009-03-01追記:ここの内容はもう古いです。最新のドキュメントを参照してください:http://msgpack.sourceforge.jp/cpp:doc 先日MessagePack for C++を紹介したのですが、やはり動的型とC++は合わないことが分かったので、動的型を使う方針はやめました。…

マルチコア時代の高速サーバーの実装

特にサーバー用途では、CPUがシングルコアに戻ってくることは考えにくい。マルチコアCPUの性能を活かすにはマルチスレッドに対応したサーバーの実装が必要になるわけですが、マルチスレッドなプログラミングは往々にして「高負荷になると固まる」とか「たま…

MessagePack for C++

この記事はもう古いです。「MessagePack for C++ template版」を見てください。 バイナリシリアライズ形式「MessagePack」のC++版APIを開発しています。 Thriftなどのコードジェネレータを利用して静的なクラスを生成するものとは差別化を図り、IDLを記述し…

memcachedプロトコルのストリームパーサ

memcachedクライアントはほとんどの言語で実装されており、key-valueベースの何かを作るときにはmemcacheプロトコルをサポートしておくと、クライアントを実装する手間が省けるのでイケてます。しかしmemcachedのテキストプロトコルのような「行」が主体とな…

バイナリシリアライズ形式「MessagePack」

Googleが公開したバイナリエンコード手法であるProtocol Buffersは、クライアントとサーバーの両方でシリアライズ形式を取り決めておき(IDL)、双方がそれに従ってデータをやりとりするようにします。 この方法では高速なデータのやりとりができる反面、IDL…

Proxy DHCPを使ってネットワークブートサーバーを構築する

pxe-pdhcpはProxy DHCPサーバーの実装です。Proxy DHCPはPreboot Execution Environment (PXE)というネットワークブートの標準規格を使ってディスクレスコンピュータをネットワークブートする際に使います。ディスクレスコンピュータは簡単に増やしたり交換…

Setting up network boot server using Proxy DHCP server

pxe-pdhcp is an implementation of Proxy DHCP server. Proxy DHCP is used to boot diskless computers by using the network boot standard named Preboot Execution Environment (PXE). PXE with Proxy DHCP makes it easy to prepare thin clients, HPC…

オブジェクト指向パーサジェネレータ 「Metal」based on Parsing Expression Grammar

Parsing Expression Grammar (PEG)をベースとした構文解析器を生成するパーサジェネレータMetalを作りました。Rubyで書かれており、Rubyのコードを生成します。Metalの多くはOMeta: an Object-Oriented Language for Pattern MatchingをRubyに移植したもので…

自己構文拡張・マルチパラダイム言語

id:ranhaに影響されて、言語方面に興味を持ちつつある今日この頃、Objective-Cをちょっと触ってみたので紹介してみます。 Objective-Cの特徴(WikiPedia:Objective-C): 静的型付けと動的型付けの両方をサポート コンパイル時型チェックが効く ダックタイピ…

Cometと同時接続数制限

HTTPプロキシを通してCometサーバーに接続する場合や、1つブラウザで複数のタブを開いてCometサーバーに接続する場合、同時接続数制限が問題になる。Cometでは1つのリクエストに対して応答を遅らせるため、クライアント1台がコネクションを1本占有してしまう…

Aerial over Comet

Aerial(エアリアル) - Ajax/Cometの次を行く リアルタイム双方向RPCのトラックバックより引用: 次世代Webアプリケーション基盤技術 - 個人的まとめ他 これは本当に非常に素晴らしい。 ただ、Flash・サーバ間の通信がHTTPじゃなく、Socket(独自プロトコル …

Aerial(エアリアル) - Ajax/Cometの次を行く リアルタイム双方向RPC

JavaScript - サーバー間で双方向のRPC通信を行う技術は「Aerial」(エアリアル)という名前になりました*1。アイディアを出していただいた皆様、ありがとうございましたm(_ _)m Aerialは、通信にFlashを使い、JavaScriptとサーバープログラムとの間で双方向…

Comet/Ajaxの上を行く技術

上を行くかどうかは知りませんが :-pAjaxはクライアントの都合でサーバーに通信を仕掛けるpull型の通信ができ、Cometはサーバーが好きなタイミングでクライアントへデータを送りつけるpush型の通信ができるわけですが、新たに双方向の通信ができる技術を開発…

Partty!でリモートペアプロしてみた

Cagraの開発でPartty!.orgを使ってリモート・ペアプログラミングをやってみたところ、かなりイイ感じだったので書いてみます。 使ったツール: Partty!.org(ターミナル共有) IRC(コミュニケーション等々) IRCのログ(作業の記録) Mercurial(ソースコー…

P2P分散ストレージ「Cagra」

id:nyaxt氏との共同開発の分散ストレージ「Cagra」(かぐら)のアルファ版をリリースしました。 cagra α3リリース cagra テクニカルデモ α2リリース 分散ストレージエンジンテクニカルデモ α版リリース cagraのα版試してみたよ - takumalog Cagraは以下のよ…