🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 查找问题 ### nginx timewait过多 > 在高并发短连接的TCP服务器上,当服务器处理完请求后主动正常关闭TCP连接,都会出现TIMEWAIT > 比如取一个web页面,1秒钟的http短连接处理完业务,在关闭连接之后,这个业务用过的端口会停留在TIMEWAIT状态几分钟,而这几分钟,其他HTTP请求来临的时候是无法占用此端口的 > 当如果NGINX或者PHP-FPM 的TIMEWAIT过多,可以考虑加大连接数、以及开启TCP重用功能 ``` netstat -n|grep :80 #nginx tcp状态 netstat -n|grep :9000 # fpm tcp状态 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' ``` ![](https://img.kancloud.cn/99/8f/998f2502a1496dba6bbf7086235ba374_635x70.png) ### mysql sleep过多 > 出现的问题,同nginx一样,采用max_connetions加大,wait_timeout改小 #### 查看TCP进程状态 ``` netstat -n|grep :3306 ``` #### 查看MYSQL连接状态 ``` SHOW FULL PROCESSLIST ``` 或者 ``` SELECT * FROM information_schema.processlist WHERE `time`>100 ORDER BY TIME DESC ``` > 该方式可以根据条件进行查询,更加灵活 ## 1. NGINX释放内存 > 一般linux 跑了一段时间后,buff/cache会急剧增加,导致网站无法访问,这个时候需要写一个脚本,每天晚上进行释放。 > cd /home/www/ > vim clear_cache.sh ``` #!/bin/bash sync echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches echo "清理结束" ``` > chmod 777 clear_cache.sh > vim /etc/crontab ``` 0 8 * * * root /home/www/clear_cache.sh ``` ## 2. 修改worker进程数 > 一般为cpu数的1~2倍 > vim nginx.conf ``` # worker进程数这里设置的2倍 worker_processes 4; # worker进程分配到对应的cpu方式改为auto自动化,nginx1.9之后支持auto worker_cpu_affinity auto; ``` ## 3. nginx优化配置 > A)`worker_connections`:单个worker进程最大连接数 > B) `worker_rlimit_nofile`:单个worker进程的最大打开文件数,(修改的同时系统环境下的ulimit -n 需要大于此值,不然容易报`too many open files`) > C) `keepalive_timeout`:连接超时时间,(http1.1出了一个保持tcp连接复用,供其他的静态资源可以复用之前打开的连接资源,尽可能设置小,建议为1分钟,这样不会导致TCP的长期间waiting) > D) `limit_conn perserver`:限制当前站点最大并发数 > E) `limit_conn perip`:限制单个IP访问最大并发数 > F) `limit_rate`:限制每个请求的流量上限(单位:KB) > `vim /etc/security/limits.conf`,可通过`ulimit -a`查看是否生效 > 如果不是1048576 (默认1024),需进行修改 ~~~ # 该方式每次重启就会失效,记得再次设置 ulmint -n 1048576 ~~~ 或者 ``` vim /etc/security/limits.conf root soft nofile 1048576 root hard nofile 1048576 * soft nofile 1048576 * hard nofile 1048576 ``` ![](https://img.kancloud.cn/c0/41/c041bfbcb919e42096be3de7013c2f6a_692x486.png) ![](https://img.kancloud.cn/73/83/738346214c1e71646e7fc484f1ca2a10_623x574.png) ## 4. php-fpm优化配置 ### 开启慢日志 > slowlog:慢日志路径 > request_slowlog_timeout:超时时间(秒) ### 进程优化 > max_children:允许创建的最大子进程数 > start_servers:起始进程数(服务启动后初始进程数量) > min_spare_servers:最小空闲进程数(清理空闲进程后的保留数量) > max_spare_servers:最大空闲进程数(当空闲进程达到此值时清理) > 本文采用的是动态进程模式,内存开支小,稳定;静态模式对内存开销较大,但并发能力较好,本文没有涉及 > 每个PHP子进程需要20MB左右内存,过大的max_children会导致服务器不稳定 ![](https://img.kancloud.cn/40/19/4019b036a1ef618c4f662a639cbff525_496x478.png) ## 5. 系统层面进行调优 > `vim /etc/sysctl.conf` ``` net.core.somaxconn = 65535 #最大tcp监听连接数,默认128 net.core.netdev_max_backlog = 20000 #每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目,默认1000 net.ipv4.tcp_max_syn_backlog = 16384 #记录的那些尚未收到客户端确认信息的连接请求的最大值,默认为1024 net.ipv4.tcp_max_tw_buckets = 180000 #TIME_WAIT的最大数量(尽量调大),超出的部分会被关闭掉,并且日志记录报错信息 net.ipv4.tcp_fin_timeout = 15 # 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间,默认60 net.ipv4.tcp_max_orphans = 131072 #该参数用于设定系统中最多允许存在多少TCP套接字不被关联到任何一个客户文件句柄上,假如超过这个数字,没有与客户文件句柄关联到TCP套接字将立即被复位,同时发出警告信息,这个限制只是为了简单防治Dos攻击,一般系统内存充足的情况下,可以增大这个参数,默认32768 net.ipv4.tcp_tw_reuse = 1 #开启TIME-WAIT(空闲TCP)重用 net.ipv4.tcp_tw_recycle = 0 # (空闲TCP快速回收)不建议开启,如果tcp_tw_recycle和tcp_timestamps同时开启,服务器或者客户机网络处于NAT情况下,网络会经常被断开; net.ipv4.tcp_syncookies = 0 #不做TCP洪水抵御 net.ipv4.tcp_timestamps = 1 # 记录TCP连接的最新时间戳 # 这里提一下 # 1. 要么 打开tcp_tw_recycle和tcp_timestamps选项 # 2. 要么 打开tcp_tw_reuse和tcp_timestamps选项 # 两者选其一,我们上面的例子选择的是第2选项,安全稳妥,不能同时都打开。 # tcp_tw_recycle 选项不适用于NAT/LB的情况,容易网络丢失,并且在linux 4.10内核后彻底废除了。 ``` > `sysctl -p` 使其生效 > 为了以防tcp_timestamps、tcp_tw_recycle同时开启,建议查看系统参数是否生效 ~~~ cat /proc/sys/net/ipv4/tcp_timestamps cat /proc/sys/net/ipv4/tcp_tw_recycle cat /proc/sys/net/ipv4/tcp_tw_reuse ~~~ ## 6. 进参数进行测试 > 使用ab进行测试 ``` ab -c 1000 -n 1000000 http://www.test.com/test.html ```