イベント駆動型プログラムのエラー処理

イベント駆動型のプログラムでは、エラー処理の記述が面倒になることがある。これを何とかしたい。 例えば、keyからidを引き、idからdata引くプログラムを書きたいとする。 手続き型で書くと以下のようになる: def doit(key) id = get_id(key) data = get_d…

Lazyレプリケーションはpush型とpull型のどちらが良いのか

更新ログをマスタからスレーブに送ることでデータをレプリケーションする、いわゆるログシッピングを、分散データストアに実装する方法について。 ログシッピングは、操作を同時に複数箇所に送信するレプリケーションと比べると、次のような実装上の利点があ…

非同期レプリケーションで単調読み出し整合性を保つ

レプリケーション*1は分散トランザクションと紙一重で、複数のサーバに分散された複数のデータを同時に書き換えたい。もしこれが同時でないと、クライアントによって異なるデータを読んでしまう可能性がある: しかし実際には同時でなくても良い。サーバ2か…

HTTPをMessagePack-RPCに変換する方法

HTTPは、クライアントは楽だけどサーバは大変。完全でセキュアで堅牢なHTTPのサーバに書くのは異常に難しい。 MessagePack-RPCは、クライアントで使えないかもしれないけど、サーバは書きやすい。それからRPCの弊害として、クライアントとサーバが簡単に密結…

kumofsに10MBのvalueを入れるとどうなるか実験してみた

kumofsは、本来小さいサイズのvalueを大量に入れることを想定した分散KVSで、高解像度の画像など、サイズの大きいvalueを入れることは想定されていない。と言うかテストされていない。 でも、実は入れてみたら案外うまく動くんじゃないか?というわけで試し…

RDBに代わるスケーラブルなデータモデルの必要性

このあたりの内容を卒業研究にする予定で、中間報告書まで書いたけど、整理と裏付けが全然追いつかなくて卒論なんて書けそうにないので、とりあえずテキトーにブログに書いておくなど。 データストアには、状態を永続化して共有する機能と、データモデル(状…

分散KVSの使い方

今流行のkey-value storageの利点と欠点など。小さいデータをたくさん扱うタイプで、単純なkey-value型のデータモデルを持つ分散KVSについて。 Webアプリをとりまく最近のKVS事情、雑感を読んで、ちゃんと整理して把握しておかないといけないな、と思ったの…

vimでShift-oを押して前の行に改行を入れるときに1秒ほど待たされる

のを修正する方法: set ttimeoutlen=10

HDDイメージをブロックデバイスにマップするスクリプト for linux

が転がっていたので忘れないうちに貼り付けておこう。 パーティションイメージではなくてHDDイメージ。VMを使っているとHDDイメージの中のパーティションを mount したくなるときがあって、このスクリプトを使うとお手軽に個々のパーティションをそれぞれブ…

非同期プロトコルのクライアント

非同期プロトコルとは、サーバーから返ってくる応答が、必ずしも要求した順番通りに返ってこないプロトコル(ソース無し。オレオレ定義)。 順不同で返ってくる応答と要求を対応づけるのはクライアントの仕事で、典型的には要求の中にシーケンス番号を入れて…

ネットワークプログラムのI/O戦略

図解求む。以下「プロトコル処理」と「メッセージ処理」を分けて扱っているが、この差が顕著に出るのは全文検索エンジンや非同期ジョブサーバーなど、小さなメッセージで重い処理をするタイプ。ストリーム指向のプロトコルの場合は「プロトコル処理」を「ス…

分散ストレージの収束する方向

サーバーサイドの分散ストレージについて。広域P2Pとかデータセンター間で同期するとかCDN云々は知らない。 kumofsのアプリケーション-Gateway間のインタフェースは Get(key) だが、Gateway-Server間のインタフェースは実は GetByHash(key, partitioning-id)…

ccfの計画

今実装中のccfの高水準なAPIについてメモ。(前に書いたccfの件はwavyのちょっとしたラッパ程度でしかない) connectionでCuriously Recurring Template Patternを使っているのはかなり本質的で、何段継承してもオーバーヘッドが無いし、どの段階でもフック…

The S100Kps problem(ソフト割り込み毎秒10万回問題)

勝手に命名。 システムコールの呼び出しが多くなることでソフト割り込みの回数が毎秒10万回を越え、ソフト割り込みの処理だけでCPU資源の大半が消費されてしまう問題。 ソフト割り込みが1つのCPUコアに集中し、コアを増やしてもスケールしなくなる。 epoll/…

ちょっと詳細なCPUモニタ

/proc/statを読み込んでCPU使用率をモニタリングする@Linux。 ちょっと詳細で、userで消費している時間、system、nice、iowait、irq、softirq、steal、guest で別々に数値を取れる。個々の意味はヨクワカラナイ ^^; 実行結果はこんな感じ: non-idle : 0.71…

RDMA+9pまたはNFSで超高速・超低負荷なストレージサーバー

RDMA(Remote DMA)の話は:http://d.hatena.ne.jp/sdyuki/20090115/1232030259 リモートホストのメモリにCPUを介さず直接値を書きこむので、CPUへの負荷が非常に小さく、かつ極めて小さい遅延で通信できることが期待できる。 Broadcom NetExtreme II BCM570…

double-hash-spaceの挙動

s1 s2 s3 s4 rhs whs 再配置方法 rhs whs 再配置方法 rhs whs 再配置方法 rhs whs 再配置方法 1.初期状態 1,2,3,4 1,2,3,4 1,2,3,4 1,2,3,4 1,2,3,4 1,2,3,4 1,2,3,4 1,2,3,4 2.s4ダウン 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 x x 3.再配置開始 -> 1,2,3,4 1…

スケールアウトする分散ブロックデバイスのアイディア

DRBDみたいだけどノードを足すとスケールアウトする感じのもの。ローカルのHDDよりリモートのメモリの方が速いという前提に基づく。RDBMSやファイルサーバーのバックエンドとして。 RDBMSをkey-valueストレージでは置き換えられない状況は少なからず存在する…

INTEROP Tokyo 2009 クラウドコンピューティングコンペティション

http://www.interop.jp/pavilion/ccc.html 2009年4月30日参加応募締切実行委員の一人の首藤さんのブログより: こんな感じのネタ、どうでしょう。 memcached (日記12/14分,12/7分) 等 key-value store をチューン / 改造して、無改造品より高い性能を出す。 …

Chukanにユニットテストフレームワークを統合してみる

perl界でよく使われているらしいproveで実行できるユニットテストフレームワークを書いてChukanに統合してみた。理由は?と聞かれれば Chukan::Test が作りたかった!Ruby的にはRSpecを使っておけばいい気がする。 見た目的にはperlのTest::BaseのRuby移植版…

分散システムのテストの自動化

複数のプロセスが相互に連携して動くシステムのテストを自動化したい。ありがちに書くとプロセスを起動すると終了するまで待ってしまうので、同時に複数のプロセスを起動できなくて困る。バックグラウンドで起動させておいて後で終了させたとき、 ps aux | g…

新しい構造化Wiki記法パーサーの設計案

プラグインの記述 プラグイン=要素の記述。要素はRubyのクラス。このクラスが持つクラス変数(か定数): 開始マーク 終了マーク(省略可) XMLを生成するプログラム(メソッド) 包含可能な要素またはグループ(無ければ省略) 所属するグループ(無ければ…

initramfsにdebianを入れちゃえばいいじゃない

#!/bin/sh debootstrap --arch=amd64 etch rootfs cp -a /lib/modules/`uname -r` ./rootfs/lib/modules/ ln -s sbin/init ./rootfs/init cd ./rootfs && find | cpio --quiet -c -o | gzip -9 -c > rootrd.img kvm -m 1024 -kernel /boot/vmlinuz -initrd .…

initramfsの作り方概略

新しいディレクトリを作る /devを作る /dev/consoleなどは必須 何が必須で必須でないのかを判定するのは面倒なので、必要っぽいデバイスノードは全部作っておく 作りすぎで困ることはあまりない /binを作る スタティックリンクしてコンパイルしたbusyboxをイ…

QEMU/KVMを使ったネットワークブートシステムのテスト環境

ネットワークブートシステムを構築するために Linuxカーネルや initramfs を作成しているとき、本物のハードウェアを使って実験していると再起動が面倒すぎてイヤになる。VMを使うのが次善策だが、BIOSの初期化には時間がかかる。 そこで qemu のlinuxカーネ…

迅速なサーバー開発をサポートするRPCフレームワーク

ふと閃いたネタ。 「JavaでSeasar2を使ってアジャイルなWeb開発」などと言われるように、開発の効率化はライブラリやフレームワークに依るところが大きい。Rubyは言語自体も生産性が高いと思うが、Web開発を効率化しているのはRailsに依るところが大きいに違…

メモ

MessagePackの機能強化 C APIでC++ APIにあるような動的型付けオブジェクトをサポートする。コールバック関数を登録するタイプのストリーミングデシリアライザは使いにくい上に遅い(関数呼び出しが多い)ので、今後置き換えていく方針。C APIの動的型付けオ…

RDMA

Wikipedia RDMA:リモートホストのメモリにCPUを介さず直接値を書きこむ。CPUへの負荷が非常に小さく、かつ極めて小さい遅延で通信できることが期待できる。 速いのは良いことであるのはもちろんだが、ネットワーク通信の遅延は非常に大きいという前提が崩れ…

MessagePack RPC フレームワークの設計案

プロトコルにMessagePackを、IO戦略にmp::iothreadsを使ったRPCフレームワークの設計案。RPCのメソッドと、それに対応するコールバック関数の関連づけをリンク時に行う。google-gflagsと同じ戦略。 プロトコルは以下の3種類: Request [true, メソッドID, 引…

pthread_mutexはプロセスを越える

futex(2) を使ってせっせとmutexとconditionを実装していたら、意外なところに盲点が。 Linux では pthread_mutex と pthread_cond がプロセスを越えられる。移植性は無いようで、Mac OS Xでは動かなかった。 やり方は mmap(2) に MAP_SHARED フラグを渡して…