gridfsをhttpでアクセスするサーバーを nginx, perl, node.js で作ってみた

17
GridFSHTTPでアクセスするサーバーを nginx, perl, node.js で作ってみた @kiwanami 2012/10/13 at fukuoka.pm

Upload: masashi-sakurai

Post on 06-Dec-2014

2.550 views

Category:

Documents


7 download

DESCRIPTION

 

TRANSCRIPT

Page 1: GridFSをHTTPでアクセスするサーバーを nginx, perl, node.js で作ってみた

GridFSをHTTPでアクセスするサーバーをnginx, perl, node.js で作ってみた

@kiwanami

2012/10/13 at fukuoka.pm

Page 2: GridFSをHTTPでアクセスするサーバーを nginx, perl, node.js で作ってみた

分散ファイルシステムが欲しい

● 小さく始められる● 構築が楽● 速い● 候補:GlusterFS、GridFS、iSCSI

● その他:S3、MogileFS、STF、LeoFS、Ceph

Page 3: GridFSをHTTPでアクセスするサーバーを nginx, perl, node.js で作ってみた

GridFSとは?

MongoDBを使った分散ファイルシステム

Page 4: GridFSをHTTPでアクセスするサーバーを nginx, perl, node.js で作ってみた

Webでファイルを配信したい

● アプリケーションでGridFSを読んで送るのは非現実的

● nginx-gridfs– https://github.com/mdirolf/nginx-gridfs

– nginxモジュール– 小粒なファイルは高速で速い– ブロックするが、アプリケーションでやるよりは速くて我慢できるレベル

Page 5: GridFSをHTTPでアクセスするサーバーを nginx, perl, node.js で作ってみた

動画が見れません!

● HTTP 1.1 Range Request が必要– 動画の頭出しなどでプレーヤーが使ってる

● → 対応した

Page 6: GridFSをHTTPでアクセスするサーバーを nginx, perl, node.js で作ってみた

そもそも動画はでかい!

● nginx-gridfs の実装上の問題– 動画を送り切るまでブロックする!– ファイル全部を一度メモリに読み込む!

● そもそもでかい動画ファイルはストリーミング処理(接続維持したままちょっとずつ受信)される!

Page 7: GridFSをHTTPでアクセスするサーバーを nginx, perl, node.js で作ってみた

nginx-gridfs

オワタ \(^o^)/

Page 8: GridFSをHTTPでアクセスするサーバーを nginx, perl, node.js で作ってみた

対応策

● gridfs やめて別の DFS へ → 調査中● 別の gridfs のWeb配信作る

Page 9: GridFSをHTTPでアクセスするサーバーを nginx, perl, node.js で作ってみた

高速・スケーラブルWeb技術ならPerl!

● 非同期PSGI

– → Twiggy

● 非同期MongoDBドライバ– → MongoDB::Async

● あとはつなげるだけ!● 出来た!

Page 10: GridFSをHTTPでアクセスするサーバーを nginx, perl, node.js で作ってみた

非同期じゃない!

● ブロックするのでTwiggyが動かない!– MongoDB::Asyncモジュールざっと読んだけど、非同期になっているように見えない

● Starmanにしてとりあえず動かす– とりあえずでかいファイルの配信は出来るようになった

● ストリーミングの問題は未解決

Page 11: GridFSをHTTPでアクセスするサーバーを nginx, perl, node.js で作ってみた

イマドキの非同期・高速・スケーラブルWeb技術なら☆Node.js

● 部品は揃ってるので書いた● 動くけどちょっと怪しい

– CPU負荷高い、メモリ使いすぎ– 全速力で送ろうとして、でもIOが詰まってるのでメモリに未送信バッファが溜まってる

● クライアントの受信の様子を見ながら自分で流量を調整する必要がある– nginx : proxy_buffering off;

● 対応した

Page 12: GridFSをHTTPでアクセスするサーバーを nginx, perl, node.js で作ってみた

スループットの性能比較

● ファイルサイズ– 200KByte(GridFSの1chunk以内)– 200MByte 中くらい– 1GByte でかい

● 条件– 自分自身へのab

– 性能比較は参考程度で

Page 13: GridFSをHTTPでアクセスするサーバーを nginx, perl, node.js で作ってみた

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速い!

Page 14: GridFSをHTTPでアクセスするサーバーを nginx, perl, node.js で作ってみた

200MByte

● /usr/sbin/ab -c 100 -n 100 http://~

● 結果– nginx: x (swap out)

– starman: 2.40 rps

– node: 1.64 rps

● starman, node は余裕● nginxすでに息してない

Page 15: GridFSをHTTPでアクセスするサーバーを nginx, perl, node.js で作ってみた

1GByte

● /usr/sbin/ab -c 20 -n 20 http://~

● 結果– nginx: x (timeout)– starman: 0.28 rps

– node: 0.33 rps

● nodeは全リクエストが一斉に始まって一斉に終わる– →ストリーミング可能

Page 16: GridFSをHTTPでアクセスするサーバーを nginx, perl, node.js で作ってみた

結果概要ファイルサイズ

同時アクセス

nginx-gridfs

node.jsstarman

Page 17: GridFSをHTTPでアクセスするサーバーを nginx, perl, node.js で作ってみた

結論

● nginxのモジュールの性能・品質は重要● Cのモジュールに比べて、Perl、Node.jsは悪くない性能

● すべてが非同期なNode.jsは素晴らしい