Node.js用フレームワーク「Fastify」「Express」のパフォーマンス比較

11/17/2017

Fastify vs Expressベンチマークテスト

このサイトを駆動しているウェブ・レンダラー「ハヤブサ(仮)」は、Node.js用フレームワーク「Next.js」をベースにしています。

Next.jsは、githubでソースコードと共に数多くのサンプルを公開していて、Node.jsのフレームワークやライブラリを知る上でなかなか面白い構成になっています。

今回は、このサンプルから発見したNode.js用フレームワーク「Fastify」をサーバに導入、せっかくなのでExpressと比較するベンチマークをとってみました。FastifyはExpressに影響を受けたフレームワークですが、オーバーヘッドの少なさを売りにしており、公式サイトでは「Expressの1.5倍」のパフォーマンスをうたっています。

テスト環境

  • Apple MacBook Pro (Retina, 13-inch, Early 2015)
  • CPU: 2.7GHz Intel Core i5
  • メモリ: 8GB 1867 MHz DDR3
  • グラフィック: Intel Iris Graphics 6100 1536MB
  • OS: macOS Sierra (10.12.6)

テスト方法

  1. サーバコードはNext.jsのbuildを使って、予めコンパイル
  2. pm2を使ってNODE_ENV=productionでサーバを実行
  3. pm2のcluster設定を使って、4つのプロセスを起動
  4. ab -c 250 -n 2000 http://localhost:3000/ でテスト

備考

ハヤブサは、WordPressサーバからJSON APIを通じてデータを取得するシステムですが、アプリ側のメモリ内でデータをキャッシュしており、このテストにデータ層のオーバーヘッドは含まれません。固定データでReactをサーバレンダリングするテストとして理解してください。

結果

  • Fastify (0.29.2): 332.95 [req/sec]
  • Express (4.16.1): 294.80 [req/sec]

開発用のMacBook Proでのテストなので、バックグラウンドのアプリの状況が影響する場合を考慮して、何度かApache Benchを実行して最良の結果を使用しています。

前述のように、FastifyはExpressよりパフォーマンスが優れることを売りにしているのですが、リアルな環境ではアプリケーション内でのオーバーヘッドなどもあり、そこまでの差はでません。ただ、実験をした感触としては、やはりFastifyの方が少しだけ高い結果を出せるようです。

ハヤブサは、アプリサーバ1台+WordPressサーバ1台程度の小規模な運用でCDNの併用を前提にしているので、10%程度のパフォーマンス向上ならば枯れたExpressという判断もありかもしれませんが、ほんの少しでもパフォーマンスが向上するならその道を行きたいところです。そんなわけで、しばらくこのサイトで運用しながら検証を続けます。

参考: ログファイル

FastifyのApache Benchログ

$ ab -c 250 -n 2000 http://localhost:3000/
This is ApacheBench, Version 2.3 <$Revision: 1796539 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 200 requests
Completed 400 requests
Completed 600 requests
Completed 800 requests
Completed 1000 requests
Completed 1200 requests
Completed 1400 requests
Completed 1600 requests
Completed 1800 requests
Completed 2000 requests
Finished 2000 requests

 

Server Software:
Server Hostname: localhost
Server Port: 3000

Document Path: /
Document Length: 102853 bytes

Concurrency Level: 250
Time taken for tests: 6.007 seconds
Complete requests: 2000
Failed requests: 0
Total transferred: 206182000 bytes
HTML transferred: 205706000 bytes
Requests per second: 332.95 [#/sec] (mean)
Time per request: 750.857 [ms] (mean)
Time per request: 3.003 [ms] (mean, across all concurrent requests)
Transfer rate: 33519.98 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 3.5 0 26
Processing: 86 711 165.6 733 1039
Waiting: 49 709 168.7 731 1036
Total: 100 712 162.7 733 1039

Percentage of the requests served within a certain time (ms)
50% 733
66% 793
75% 814
80% 826
90% 868
95% 892
98% 924
99% 945
100% 1039 (longest request)

Express.jsのApache Benchログ

$ ab -c 250 -n 2000 http://localhost:3000/
This is ApacheBench, Version 2.3 <$Revision: 1796539 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 200 requests
Completed 400 requests
Completed 600 requests
Completed 800 requests
Completed 1000 requests
Completed 1200 requests
Completed 1400 requests
Completed 1600 requests
Completed 1800 requests
Completed 2000 requests
Finished 2000 requests

 

Server Software:
Server Hostname: localhost
Server Port: 3000

Document Path: /
Document Length: 102853 bytes

Concurrency Level: 250
Time taken for tests: 6.784 seconds
Complete requests: 2000
Failed requests: 0
Total transferred: 206182000 bytes
HTML transferred: 205706000 bytes
Requests per second: 294.80 [#/sec] (mean)
Time per request: 848.038 [ms] (mean)
Time per request: 3.392 [ms] (mean, across all concurrent requests)
Transfer rate: 29678.74 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 2.3 0 10
Processing: 91 790 138.0 798 1070
Waiting: 62 788 139.5 796 1064
Total: 101 791 136.5 798 1074

Percentage of the requests served within a certain time (ms)
50% 798
66% 831
75% 860
80% 882
90% 922
95% 964
98% 1003
99% 1030
100% 1074 (longest request)

 

シェアする