服务器A: nginx php mysql
服务器B: nginx php
故障现象: 服务器B无法远程连接服务器A的mysql服务(一直等待直至超时),经过排查发现关闭服务器A的nginx后mysql即可正常连接。
排查过程: 1.关闭A的防火墙,发现没什么用 2.查看A的tcp连接,发现有很多time_wait和fin_wait1
netstat -anp | grep ":80"
netstat -anp | grep ":3306"
3.统计80端口连接数
netstat -anp | grep ":80" | wc -l
发现连接数量非常多
4.暂停服务器A的nginx服务,mysql瞬间复活
5.估计是nginx占用了太多的"资源",尝试限制nginx
6.修改nginx.conf,调整 worker_processes 为 1,worker_rlimit_nofile减小到2048,worker_connections减小到2048,重启nginx服务,mysql不再受到影响。
探究原理:
1.文件描述符 修改的nginx参数主要是文件描述符和每worker处理连接数。
cat /proc/sys/fs/file-nr
#5728 0 1615734
查看系统文件描述符状态,第一列表示系统打开的文件描述符,第二个表示已分配但未使用的,第三列表示文件描述符总数
查看nginx打开的文件描述符数量,首先查看nginx进程号
pidof nginx
#6557 6556 6555
ll /proc/6555/fd | wc -l
#17
ll /proc/6556/fd | wc -l
#2000
ll /proc/6557/fd | wc -l
#15
查看系统文件描述符数量限制
ulimit -n
#1024
更多尝试 lsof
还不知道到底要怎么做,先试试ulimit -n 65535吧,nginx疯狂报错:too many open files
后记
最后还是从提高处理速度,减少请求,增加服务器负载均衡等方面处理,系统本身我实在不会优化了。 最后先上了cdn,静态文件合并,请求数量能减少一大半。