[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
```