今回はとても恣意的なエントリーです。
目的は「Koaで開発しようぜ!」ってことなので。
概要
単純にちょっと待ち時間の発生するようなスクリプトを実行してみて、それによってかかる時間やメモリコストを実測しようという企画です。
比較対象
今回はKoaで構築するサーバとPHPer御用達のWEBサーバを比較対象としました。
- Koaで作った非同期処理サーバ
- Apacheを使ったオーソドックスなphpアプリ
- Nginx + PHP-FPMを使ったサーバ
テストはローカルの仮想サーバで行い、各テストの後は一旦再起動しています。
方法
Macにはapache bench があるので、
$ ab -n 1000 -c 100 http://192.168.33.10/
こんな感じで計測し、動作サーバー上で
$ free -s 1
1秒毎にメモリ消費量を計測します。
apache benchでの計測パラメータは、-nと-cのパラメータを10倍変えています(リクエスト数 = 10 ☓ 同時接続数)。
計測数は, 10, 20, 100(, 1000)です。
処理内容
処理内容は、単純に「1.5秒待ってからhello worldを返す」という単純なものです。
詳しいコードは以下のとおりです
'use strict'
const koa = require('koa');
const app = koa();
app.use(function* (){
const x = yield new Promise(res => setTimeout(() => res(1), 1500));
console.log(x);
this.body = 'hello world';
});
app.listen(3000);
<?php
usleep(1500000);
echo 'hello world';
結果
Koa
同時接続数 | 平均レスポンス時間(ms) | メモリ使用量(KB) |
---|---|---|
10 | 1610.973 | 496 |
20 | 1613.035 | 1240 |
100 | 1606.868 | 9168 |
1000 | 1888.211 | 70060 |
メモリ使用量は少々ゆらぎがあると思います。
レスポンス時間にほとんど1600msで収まっているところが特徴でしょう。
100msを接続にかけていると考えれば、実質各リクエストに処理の順番待が存在しなかったと考えていいと思います。
流石に1000同時接続だとレスポンスに影響が出ていますが、それでも300ms程度なので、それほど気にならないかもしれません。
メモリも70M程度で済んでいるようです。
apache
同時接続数 | 平均レスポンス時間(ms) | メモリ使用量(KB) |
---|---|---|
10 | 1613.714 | 22244 |
20 | 1669.724 | 19812 |
100 | 2017.839 | 125952 |
予想はできていましたが、やはりメモリの使用量が多いです。
また、同時接続数10での平均レスポンスは1.6sec程度ですが、実データの5%は2.5秒以上のレスポンス時間となっており、ある程度の遅延が発生しているようです
同様に、20接続だと、一部のレスポンスが2.5〜3.0secほどになっていました。
同時接続数100となると、幾つかのレスポンスは6秒を超えるようになります。それでも半分以上は正常にレスポンスを返せていました。
また、これ以上は接続数限界にも近づくようで、300接続も試せませんでした。
nginx + php-fpm
同時接続数 | 平均レスポンス時間(ms) | メモリ使用量(KB) |
---|---|---|
10 | 1605.511 | 10976 |
20 | 1728.408 | 9312 |
100 | 3302.610 | 25436 |
300 | 9571.414 | 20000 |
同時接続数20の時点で、レスポンスに少々影響が出ています。
実際の計測では、10%程度、大きく性能の落ちたリクエストがあるようです。
同時接続数が100の時、メモリについてはapacheに対して大きなアドバンテージを持っていますが、一方でレスポンスタイムに大きな性能低下が見られます。これはphp-fpmの子プロセスの個数による影響かと思います。
同時接続数300ではレスポンスが大幅に悪化し、リクエストがいくつか失敗していました。
考察
Koaというより、node.jsがそもそも大量同時接続に対応するように作られているだけあって、I/Oなどの非同期処理が処理時間の大部分を占めるアプリケーションであれば、想定通り大量アクセスをさばくことができます。
一方、apacheはプロセス作成によるメモリの消費量が大きいため、メモリについての不安があり、100接続程度でもレスポンスへの影響も出ていました。しかし、同時接続数100なんてのは相当多い数なので、案外堅牢なのかもしれません。
Nginx + php-fpm はちゃんとチューニングをやらないと性能が出ないように思います。php-fpm は予め最大の小プロセス数を決めているようで、おかげでメモリの消費量が制限できているように思えますし、一方で、同時処理数が少なくなって、結果的にNginxでの待ち時間が劇的に増えているように思います。
まとめ
Koaを使う動機として、長い処理待ちがあり得るアプリに対する大量同時接続に強いという性質を確かめてみました。
また、Nginxでサーバ作るときはチューニング頑張らないといけないんだなぁと思いました。