noob

底辺オペレーターのメモ

nginx の worker_connections は worker 当たりの同時接続数だと思ってたけどどうも違うっぽい


※2014-12-18 追記※

はてブとかtwitterがついててちょっとビックリしてます.
そしてtwitterで貴重なご意見をいただきました.

なるほどー.
ということでworker_processes 8, worker_connections 768でざっくりですが早速試してみました.
結果,worker_connections are not enoughエラーは見られなくなったように思います.
# というのも ApacheBench でapr_socket_recv: Connection reset by peer (104)が頻発するようになってしまって自信がないです.
# この記事を書いたときにはこんなことはなく,同じ環境で確認を行っているのですが…うーん…

というわけで,早とちりだったようです.申し訳ありません.

もともとは

worker_connectionsは「worker 当たり」ではなく「nginx 全体」の同時接続数になっていると考えられる.

という風にまとめていましたが,

workerの偏りを考慮してworker_connectionsはある程度マージンを持たせて設定したほうがよさそう.

とまとめ直したいと思います.

※追記おわり※


ベンチマークを取っている時にどうも違うような挙動をしたので確認してみた.

worker_processes 8, worker_connections 256 のとき

いままでの理解

nginx の同時接続数は

worker_connections * worker_processes

なので

256 * 8 = 2048

になるんだと思ってた.

確認

この設定に対して同時接続数 1024 でリクエストしても当然問題なく処理されるものと思いきや,

[root@client ~]# ab -c 1024 -n 10240 'http://10.100.47.58/10k.dat'
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 10.100.47.58 (be patient)
apr_socket_recv: Connection reset by peer (104)
Total of 544 requests completed

エラーになってしまった.
さらにエラーログに

2014/11/12 17:41:55 [alert] 13733#0: 256 worker_connections are not enough

が出力されておりworker_connectionsを使い切ったことがはっきりとわかる.

worker_processes 1, worker_connections 2048 のとき

[root@hosweb001 ~]# ab -c 1024 -n 10240 'http://10.100.47.58/10k.dat'
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 10.100.47.58 (be patient)
Completed 1024 requests
Completed 2048 requests
Completed 3072 requests
Completed 4096 requests
Completed 5120 requests
Completed 6144 requests
Completed 7168 requests
Completed 8192 requests
Completed 9216 requests
Completed 10240 requests
Finished 10240 requests


Server Software:        nginx/1.7.7
Server Hostname:        10.100.47.58
Server Port:            80

Document Path:          /10k.dat
Document Length:        10240 bytes

Concurrency Level:      1024
Time taken for tests:   1.003 seconds
Complete requests:      10240
Failed requests:        0
Write errors:           0
Total transferred:      107595930 bytes
HTML transferred:       105031680 bytes
Requests per second:    10206.19 [#/sec] (mean)
Time per request:       100.331 [ms] (mean)
Time per request:       0.098 [ms] (mean, across all concurrent requests)
Transfer rate:          104727.19 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    4   5.3      1      21
Processing:     3   20  42.7     13     620
Waiting:        2   17  42.3     12     617
Total:          7   24  44.2     13     630

Percentage of the requests served within a certain time (ms)
  50%     13
  66%     14
  75%     16
  80%     31
  90%     37
  95%     61
  98%     85
  99%    216
 100%    630 (longest request)

この設定だと問題なく処理されるので,さっきのエラーがカーネルパラメータや ulimit 等によるリソース不足によるものではないことがわかる.

まとめ

今までの理解ならどっちも問題なく処理できるか,どっちも失敗するかのはず.
「worker_processes 8, worker_connections 256」がダメで「worker_processes 1, worker_connections 2048」が OK ということは worker_connectionsは「worker 当たり」ではなく「nginx 全体」の同時接続数になっていると考えられる.

早とちりだったようです.追記をご覧ください.