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

  • 1,585 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
  • node.js のコード https://gist.github.com/kiwanami/3932122
    perl のコード https://gist.github.com/kiwanami/3932115
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
1,585
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
4
Comments
1
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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