Categories: DevOps

如何检查nginx打开socket数量

nginx在大并发的场景下,会出现CPU占用过高,请求响应慢的问题,在错误日志中通常表现为Too many open files,即它进入了超出系统允许的打开文件数量并开始拒绝请求的状态。在这种情况下可以检查nginx打开的socket数量,优化nginx配置。

我们可以使用以下命令找出系统上允许打开的文件的最大数量:

$ ulimit -n
1024

我们的假设是某些套接字连接从未关闭,因此打开的文件数一直在缓慢上升,直到超过限制。

我们想检查nginx打开了多少个套接字,因此首先我们需要知道它在下面运行的进程ID:

$ ps aux | grep nginx | grep -v grep
root      1089  0.0  0.7 105152  2736 ?        Ss   17:34   0:00 nginx: master process /usr/sbin/nginx
www-data 17474  0.0  0.6 105300  2296 ?        S    21:49   0:04 nginx: worker process
www-data 17475  0.0  0.7 105300  2856 ?        S    21:49   0:04 nginx: worker process
www-data 17476  0.0  0.7 105300  2792 ?        S    21:49   0:03 nginx: worker process
www-data 17477  0.0  0.7 105300  2668 ?        S    21:49   0:04 nginx: worker process

因此,nginx的进程进程ID是1089、17474、17475、17476和17477。

我们可以使用以下命令检查打开了哪些文件描述符:

$ sudo ls -alh /proc/{1089,17{474,475,476,477}}/fd
/proc/17476/fd:
total 0
dr-x------ 2 www-data www-data  0 Apr 23 23:40 .
...
l-wx------ 1 www-data www-data 64 Apr 23 23:40 6 -> /var/log/nginx/error.log
l-wx------ 1 www-data www-data 64 Apr 23 23:40 7 -> /var/www/thinkingingraphs/shared/log/nginx_access.log
l-wx------ 1 www-data www-data 64 Apr 23 23:40 8 -> /var/www/thinkingingraphs/shared/log/nginx_error.log
lrwx------ 1 www-data www-data 64 Apr 23 23:40 9 -> socket:[8910]

/proc/17477/fd:
total 0
...
lrwx------ 1 www-data www-data 64 Apr 23 23:40 56 -> socket:[52213]
lrwx------ 1 www-data www-data 64 Apr 23 23:40 57 -> anon_inode:[eventpoll]
l-wx------ 1 www-data www-data 64 Apr 23 23:40 6 -> /var/log/nginx/error.log
l-wx------ 1 www-data www-data 64 Apr 23 23:40 7 -> /var/www/thinkingingraphs/shared/log/nginx_access.log
l-wx------ 1 www-data www-data 64 Apr 23 23:40 8 -> /var/www/thinkingingraphs/shared/log/nginx_error.log
lrwx------ 1 www-data www-data 64 Apr 23 23:40 9 -> socket:[8910]

我们可以缩小范围以仅显示打开了多少个套接字:

$ sudo ls -alh /proc/{1089,17{474,475,476,477}}/fd | grep socket  | wc -l
189

我们也可以使用lsof,尽管由于某些原因返回的数字略有不同:

$ sudo lsof -p 1089,17474,17475,17476,17477 | grep socket | wc -l
184

使用括号扩展来做到这一点

$ sudo lsof -p `echo {1089,174{74,75,76,77}} | sed 's/ /,/g'` | grep socket | wc -l
184
5.0
01
Elasticsearch集群脑裂问题详解
多租户架构
嘻嘻

嘻嘻IT: 笔者是一个工作七八年的程序猿老鸟,从事涉及的技术栈主要包括PHP、Linux、Devops等,喜欢研究新技术,尝试新技术,提升技术自动化和开发效率,致力于write less,do more! 技术每年都会层出不穷,领域划分的越来越细,不可能学习所有的东西,保持对技术的好奇心,理解技术中核心思想,做一个有深度,有思想的开发!

Recent Posts

Replit是一个强大的在线集成AI开发环境

Replit是一个强大的在线集…

3小时 ago

AutoLink一款SEO策略AI优化工具

AutoLink AI为内部链…

3小时 ago

wordpress侧边栏酷炫倒计时小工具

每个WordPress站点都值…

3小时 ago

如何在Linux中根据修改日期和时间查找和排序文件

习惯于使用图形用户界面的人可以…

1天 ago

Golang中如何实现PHP中array_fill函数?

PHP中的array_fill…

1天 ago