つよくなるブログ

その場にとどまるためには、全力で走り続けなければならない

Node.js 6系と8系の LTS でパフォーマンス比較してみた

Node.js 8.9.0 が LTS としてリリースされて数ヶ月がたち

そろそろ実戦投入していきたいのでパフォーマンスを計測/比較してみた.

実行環境

  • AWS EC2 m3.medium インスタンス
  • Ubuntu 16.04.3
Node.js
  • 6系 - 6.12.3
  • 8系 - 8.9.4

ベンチマークコード

シンプルに json を返すだけの処理で実施.

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'application/json'});
    res.write(JSON.stringify({result: 'success'}));
    res.end();
}).listen(8080);

github.com

パフォーマンステストの方法

  • Apache Bench を使用
  • 10万リクエスト
  • 並列数を変えながら(10 ~ 5000), かかった時間を計測
  • 各並列数で3回実行した平均値を計測値とする
 ab -n 100000 -c 5000 http://ec2-xxx/

途中で Too many open files が出たので ulimit -n 10240 で上限値を増やした.

結果

f:id:morugu:20180121170002p:plain

f:id:morugu:20180121170015p:plain

まとめ

平均で 14%のパフォーマンス向上 が確認できた.

実戦投入に向けて

  • Cluster を使用
  • 重い処理
  • DBアクセス
  • シナリオテスト

あたりの検証もしていきたい.

おまけ

「なんで速くなってるの?」というところで

Node.js 本体とその実行環境である V8 JavaScript engine が改善されているからなのだけど

それらが具体的にどう改善されたかわかるまとめ.

(このあたりのコードを読んだ解説記事も書きたい)

http: improve outgoing string write performance by mscdex · Pull Request #13013 · nodejs/node · GitHub

lib,src: improve writev() performance for Buffers by mscdex · Pull Request #13187 · nodejs/node · GitHub

querystring: improve querystring unescapeBuffer perf by jseijas · Pull Request #12525 · nodejs/node · GitHub

stream: improve readable push performance by mscdex · Pull Request #13113 · nodejs/node · GitHub

v8project.blogspot.jp