gridfsをhttpでアクセスするサーバーを nginx, perl, node.js で作ってみた
DESCRIPTION
TRANSCRIPT
GridFSをHTTPでアクセスするサーバーをnginx, perl, node.js で作ってみた
@kiwanami
2012/10/13 at fukuoka.pm
分散ファイルシステムが欲しい
● 小さく始められる● 構築が楽● 速い● 候補:GlusterFS、GridFS、iSCSI
● その他:S3、MogileFS、STF、LeoFS、Ceph
GridFSとは?
MongoDBを使った分散ファイルシステム
Webでファイルを配信したい
● アプリケーションでGridFSを読んで送るのは非現実的
● nginx-gridfs– https://github.com/mdirolf/nginx-gridfs
– nginxモジュール– 小粒なファイルは高速で速い– ブロックするが、アプリケーションでやるよりは速くて我慢できるレベル
動画が見れません!
● HTTP 1.1 Range Request が必要– 動画の頭出しなどでプレーヤーが使ってる
● → 対応した
そもそも動画はでかい!
● nginx-gridfs の実装上の問題– 動画を送り切るまでブロックする!– ファイル全部を一度メモリに読み込む!
● そもそもでかい動画ファイルはストリーミング処理(接続維持したままちょっとずつ受信)される!
nginx-gridfs
オワタ \(^o^)/
対応策
● gridfs やめて別の DFS へ → 調査中● 別の gridfs のWeb配信作る
高速・スケーラブルWeb技術ならPerl!
● 非同期PSGI
– → Twiggy
● 非同期MongoDBドライバ– → MongoDB::Async
● あとはつなげるだけ!● 出来た!
非同期じゃない!
● ブロックするのでTwiggyが動かない!– MongoDB::Asyncモジュールざっと読んだけど、非同期になっているように見えない
● Starmanにしてとりあえず動かす– とりあえずでかいファイルの配信は出来るようになった
● ストリーミングの問題は未解決
イマドキの非同期・高速・スケーラブルWeb技術なら☆Node.js
● 部品は揃ってるので書いた● 動くけどちょっと怪しい
– CPU負荷高い、メモリ使いすぎ– 全速力で送ろうとして、でもIOが詰まってるのでメモリに未送信バッファが溜まってる
● クライアントの受信の様子を見ながら自分で流量を調整する必要がある– nginx : proxy_buffering off;
● 対応した
スループットの性能比較
● ファイルサイズ– 200KByte(GridFSの1chunk以内)– 200MByte 中くらい– 1GByte でかい
● 条件– 自分自身へのab
– 性能比較は参考程度で
200KByte
● /usr/sbin/ab -c 200 -n 2000 http://~
● 結果– ※rps = request per second
– nginx cache: 3444.61 rps (参考値)
– nginx gridfs: 1102.52 rps
– starman: 404.21 rps
– node: 394.56
● nginx速い!
200MByte
● /usr/sbin/ab -c 100 -n 100 http://~
● 結果– nginx: x (swap out)
– starman: 2.40 rps
– node: 1.64 rps
● starman, node は余裕● nginxすでに息してない
1GByte
● /usr/sbin/ab -c 20 -n 20 http://~
● 結果– nginx: x (timeout)– starman: 0.28 rps
– node: 0.33 rps
● nodeは全リクエストが一斉に始まって一斉に終わる– →ストリーミング可能
結果概要ファイルサイズ
同時アクセス
nginx-gridfs
node.jsstarman
結論
● nginxのモジュールの性能・品質は重要● Cのモジュールに比べて、Perl、Node.jsは悪くない性能
● すべてが非同期なNode.jsは素晴らしい