こちらのコマンドの出力結果を見て欲しいのですが
$ wrk -c300 -d30s http://172.31.23.140/
Running 30s test @ http://172.31.23.140/
2 threads and 300 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 28.79ms 64.06ms 1.11s 89.38%
Req/Sec 19.25k 3.29k 31.37k 69.57%
1149710 requests in 30.04s, 0.91GB read
Requests/sec: 38278.54
Transfer/sec: 31.03MB
172.31.23.140はサーバー自身の持っているインタフェースに割り振られたIPアドレスです。
自分自身に向けてwrkコマンドを実行しています。宛先をhttp://127.0.0.1/ に変えると・・・
$ wrk -c300 -d30s http://127.0.0.1/
Running 30s test @ http://127.0.0.1/
2 threads and 300 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 47.57ms 122.82ms 1.26s 92.45%
Req/Sec 10.78k 2.04k 19.24k 71.83%
644420 requests in 30.03s, 522.35MB read
Requests/sec: 21458.50
Transfer/sec: 17.39MB
え?何でこんなに遅くなるの?
プロセスを見比べると・・・
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17697 root 20 0 269388 10024 3144 S 83.6 0.3 0:24.39 wrk
17668 syslog 20 0 36060 7592 2348 R 55.9 0.2 0:32.85 nginx
17667 syslog 20 0 36160 7572 2348 R 55.6 0.2 0:32.98 nginx
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17632 root 20 0 437784 77332 19732 S 88.5 2.0 0:09.86 exe
17702 root 20 0 269388 15344 3100 S 45.3 0.4 0:05.10 wrk
17667 syslog 20 0 36068 7600 2348 R 29.3 0.2 0:37.08 nginx
17668 syslog 20 0 35976 7508 2348 R 29.0 0.2 0:37.28 nginx
このPID:17632のexe
とは何ぞ?とみると
docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.18.0.2 -container-port 80
!?
docker-proxyはホストとコンテナ間のポート転送をかけてるプロセスのようです。
ループバックアドレス宛に大量アクセスした場合にだけ、なぜだかこのプロセスがCPUをたくさん使います。
通常、ループバックアドレス宛てにはアクセスしないので困らないかと思いますが、
dockerでの負荷を計測する際はお気をください。(負荷は外からかけろということですね)