nginx并发数疑问

Posted 运维行闻录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx并发数疑问相关的知识,希望对你有一定的参考价值。

前段时间单台nginx的并发连接数量达到了5w多,那时候就比较惶恐,因为对65535这个数字有着陌生的敬畏,于是测试了一下到底当前配置下的nginx并发以及在性能足够的情况下,nginx并发连接数与什么有关

测试环境:

环境 详细
压测软件 wrk
压测机 12C24G 机器若干
压测对象 16C32G Nginx Server机器一台

测试方法:

使用wrk创建并发连接去获取该nginx提供的一个静态图片,观察最高并发连接数

测试过程:

初始配置如下:

nginx进程由用户root启动,worker进程为nobody

系统参数配置:

 
   
   
 
  1. cat /proc/sys/fs/file-max

  2. 2000000


  3. tail -4/etc/security/limits.conf

  4. * soft nofile 65535

  5. * hard nofile 65535

  6. root soft nofile 65535

  7. root hard nofile 65535

nginx参数配置:

第一阶段:

使用一台压测机执行如下命令:

 
   
   
 
  1. ./wrk -c 120000 -t 12 -d 60 https://172.16.0.1/images/china-map.png

此时nginx server并发如下:

nginx并发数疑问

并没有达到预期的120k连接,原因在于发压机器端口耗尽,无法创建更多连接,于是新增一台发压机,每台机器执行语句修改为

 
   
   
 
  1. ./wrk -c 60000 -t 12 -d 60 https://172.16.0.1/images/china-map.png

效果如下:

nginx并发数疑问

可以看到,对于上述配置的nginx来说,单台处理120k的连接没有任何异常,远远超出当时担心的65k连接数的问题(但是实际场景中nginx作为反向代理这个并发还是要打折)。

虽然当时理论nginx支持的并发连接数为16*10240,但是因为nobody用户的可打开连接数受限,只有65535。

那么问题来了,为什么nobody的nofile限制对nginx不起作用?nginx并发数不受用户可打开文件数限制吗?那到底并发瓶颈在哪里?

第二阶段:

继续用两台压测机对nginx发出请求,统计nobody用户打开的文件数量

 
   
   
 
  1. lsof -u nobody|wc -l

  2. lsof -c nginx|wc -l

统计结果显示nobody打开的文件数量在11w9左右,突破了该用户本身的限制65535

此时查看/proc/${nginx_worker_pid}/limits 显示该进程的限制为65535,由于Nginx Server配置中root与其他用户的nofile限制都是65535

为了搞清楚这个65535到底是root的还是nobody的,也为了方便实验,我们将nofile限制如下:

nginx并发数疑问

重新登陆生效后,重启nginx
此时看到/proc/${nginx_worker_pid}/limits显示为1024
重新压测得到并发如下

恰好为16k,那么应该是
nginx并发数量在打开文件数这里的限制大小=用户的ulimit * nginx worker进程数

那么除此之外nginx并发数量在服务器cpu内存资源足够的情况下还受哪些参数影响呢?

第三阶段:

nginx 还有两个参数

 
   
   
 
  1. worker_connections number;

  2. worker_rlimit_nofile number;

worker_rlimit_nofile number;

Changes the limit on the maximum number of open files (RLIMIT_NOFILE) for worker processes. Used to increase the limit without restarting the main process.

该参数作用与上述实验原理相同,也是通过限制可打开文件数量来实现

worker_connections number;

Sets the maximum number of simultaneous connections that can be opened by a worker process.

设置单个进程可同时打开的连接数,我们将它改成1024,再进行压力测试,结果如下

可以看见,有很多连接状态会处于writing状态

结论:

nginx并发连接限制影响主要有两个方面:

worker_connections * worker_processes number

worker_rlimit_nofile或者master进程ulimit -n * worker_processes number

具体nginx为何突破系统用户打开文件数限制或者说普通用户下的nginx还是这样吗还有待进一步明确。

以上是关于nginx并发数疑问的主要内容,如果未能解决你的问题,请参考以下文章

查看nginx当前并发连接数 - 修改最高并发数

【ngin】nginx 查看并发连接数的两种方法

Nginx限制并发连接数

nginx 并发数

nginx限制ip并发数

控制 Nginx 并发连接数