express+node.jsのmongodb単純readとsendfileのNetIOがsinatra+unicornの2倍

npmする

cd /path/to/nodeアプリケーション
npm install express mongoose
npm install forever -g #デーモンにする何か

musicdb_devではファイルを転送する部分をsinatraからnodeに切り替えた。

理由は特に無いのです。x-sendfileとか使うほうが良いです。絶対に。
現状よく動いてくれています。高負荷とかチェックできないのでよくわかりません。
対象ファイルが同じで同時接続100ぐらいだとこの旧世代なサーバーでnodeもmongoも落ちないかな??
いろんなURLで同時に、というリアルな状況だとどうなるのかは不明。
生nodeは感覚的に気持ち悪いのでngixからプロキシで。
nginxはvarnishの下にいるのでvarnish->nginx->nodeになります。
nodeでmongoに接続します。今回はreadだけです。
もっと簡単な方法もあるでしょうが。まずもって動けはOKなコード

/* web.jsとか */
//express
var express = require('express');
var app = express.createServer();

//mongoose
var mongoose = require('mongoose');
// コネクション
var musicdb = mongoose.createConnection('mongodb://192.168.110.7/misic-mongoid');
//スキーマ
var MusicmodelSchema = new mongoose.Schema({
     _id : mongoose.Schema.ObjectId 
    ,path : String /* 転送するファイルパスが格納されている */
});
// 実際のドキュメントはもっと要素が多いが必要なものだけでスキーマを作れば良いでしょ。
//mongooseにスキーマをモデルとして登録して使えるようにしているのかしら?
//このあたりインターネッツのコピペ。公式ドキュメント読んでない
//結構うえんだ。
var Musicmodel = musicdb.model('Musicmodel',MusicmodelSchema) ;


// expressでsendfileする与えられた:midでmondoにアクセスしてpathフィールドの文字列のファイルを転送
app.get("/musicdb/:mid/:param",function(req,res){
  Musicmodel.findById(req.params.mid,function(err,doc){
     if(doc) /* このifできちんとドキュメントの有無が確認できているのかしら*/
       res.sendfile(doc.path,function(serr){});
     else
       res.send("no file");
  });
});

// 待受
var port = process.env.PORT || 23001;
app.listen(port, function(){
  console.log("Listening on " + port);
});

速度

sinatra-unicornより2倍ぐらいNetIOがでますねー
受付件数はおんなじー
varnishに乗っかると(当たり前だけど)静的ファイルとおんなじレベルの速度。
このアプリでvarnishに乗り切るはずは無いのでnodeが安定して稼動してくれるならnodeがbetterというところでしょうか?
安定、メモリ使用量いろいろ未知数。
しばらく様子見。様子見していることも忘れるぐらいだと安定OKということですね。

node 13.7 req/s , Net I/O: 55228.0 KB/s
$ httperf --hog --client=0/1 --server=192.168.110.7 --port=23001 --uri=/stream/musicdb/4e93c9a79ef02f126d00af9e/file.mp3 --send-buffer=4096 --recv-buffer=16384 --num-conns=100 --num-calls=10
httperf --hog --client=0/1 --server=192.168.110.7 --port=23001 --uri=/stream/musicdb/4e93c9a79ef02f126d00af9e/file.mp3 --send-buffer=4096 --recv-buffer=16384 --num-conns=100 --num-calls=10
httperf: warning: open file limit > FD_SETSIZE; limiting max. # of open files to FD_SETSIZE
Maximum connect burst length: 1

Total: connections 100 requests 1000 replies 1000 test-duration 72.737 s

Connection rate: 1.4 conn/s (727.4 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 641.8 avg 727.4 max 889.2 median 722.5 stddev 46.6
Connection time [ms]: connect 0.9
Connection length [replies/conn]: 10.000

Request rate: 13.7 req/s (72.7 ms/req)
Request size [B]: 114.0

Reply rate [replies/s]: min 13.2 avg 13.7 max 14.2 stddev 0.3 (14 samples)
Reply time [ms]: response 9.4 transfer 63.2
Reply size [B]: header 287.0 content 4113118.0 footer 0.0 (total 4113405.0)
Reply status: 1xx=0 2xx=1000 3xx=0 4xx=0 5xx=0

CPU time [s]: user 7.32 system 27.01 (user 10.1% system 37.1% total 47.2%)
Net I/O: 55228.0 KB/s (452.4*10^6 bps)

Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0
4worker unicorn 14.5 req/s Net I/O: 29104.9 KB/s
$ httperf --hog --client=0/1 --server=192.168.110.7 --port=13000 --uri=/api/stream2/4e93c9a79ef02f126d00af9e/file.mp3 send-buffer=4096 --recv-buffer=16384 --num-conns=100 --num-calls=10
httperf --hog --client=0/1 --server=192.168.110.7 --port=13000 --uri=/api/stream2/4e93c9a79ef02f126d00af9e/file.mp3 --send-buffer=4096 --recv-buffer=16384 --num-conns=100 --num-calls=10
httperf: warning: open file limit > FD_SETSIZE; limiting max. # of open files to FD_SETSIZE
Maximum connect burst length: 1

Total: connections 100 requests 200 replies 100 test-duration 13.803 s

Connection rate: 7.2 conn/s (138.0 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 43.6 avg 138.0 max 1457.9 median 125.5 stddev 203.5
Connection time [ms]: connect 0.1
Connection length [replies/conn]: 1.000

Request rate: 14.5 req/s (69.0 ms/req)
Request size [B]: 111.0

Reply rate [replies/s]: min 5.0 avg 7.5 max 10.0 stddev 3.5 (2 samples)
Reply time [ms]: response 10.2 transfer 127.6
Reply size [B]: header 351.0 content 4113118.0 footer 0.0 (total 4113469.0)
Reply status: 1xx=0 2xx=100 3xx=0 4xx=0 5xx=0

CPU time [s]: user 2.06 system 6.23 (user 15.0% system 45.1% total 60.1%)
Net I/O: 29104.9 KB/s (238.4*10^6 bps)

Errors: total 100 client-timo 0 socket-timo 0 connrefused 0 connreset 100
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0
varnish=>node 50.9 req/s Net I/O: 204380.3 KB/s
$ httperf --hog --client=0/1 --server=192.168.110.7 --port=80 --uri=/stream/musicdb/4e93c9a79ef02f126d00af9e/file.mp3 --send-buffer=4096 --recv-buffer=16384 --num-conns=100 --num-calls=10
httperf --hog --client=0/1 --server=192.168.110.7 --port=80 --uri=/stream/musicdb/4e93c9a79ef02f126d00af9e/file.mp3 --send-buffer=4096 --recv-buffer=16384 --num-conns=100 --num-calls=10
httperf: warning: open file limit > FD_SETSIZE; limiting max. # of open files to FD_SETSIZE
Maximum connect burst length: 1

Total: connections 100 requests 1000 replies 1000 test-duration 19.655 s

Connection rate: 5.1 conn/s (196.6 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 145.6 avg 196.6 max 296.2 median 152.5 stddev 55.3
Connection time [ms]: connect 0.3
Connection length [replies/conn]: 10.000

Request rate: 50.9 req/s (19.7 ms/req)
Request size [B]: 114.0

Reply rate [replies/s]: min 38.4 avg 54.9 max 66.6 stddev 14.7 (3 samples)
Reply time [ms]: response 0.6 transfer 19.1
Reply size [B]: header 326.0 content 4113118.0 footer 0.0 (total 4113444.0)
Reply status: 1xx=0 2xx=1000 3xx=0 4xx=0 5xx=0

CPU time [s]: user 0.74 system 8.75 (user 3.8% system 44.5% total 48.3%)
Net I/O: 204380.3 KB/s (1674.3*10^6 bps)

Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0