压测、防止压测方案
1. 压测
(1) 压测工具:ab
(2) 压测请求方式:get
(3) 压测域名:url
(4) 压测方案:10万请求,500并发
(5) 压测脚本
ab -n 100000 -c 500 url
(6) 展示压测结果
从上面分析,10万请求错误有96881次请求错误,基本上也就是很大的问题了
(7) Nginx访问日志监控http返回状态
进一步分析:很明显,日志记录瞬间很多请求,有好多http 都是503服务器错误,这些是压测并发的请求,有一些是200,这些是正常请求的,访问是OK的。
(8) Top监控进程状态
① 压测前:
② 压测中:
(9) 解决方案
通过第八点分析:很明显,php-fpm进程数,瞬间增加到6个子进程,nginx增加到3个子进程,并且Nginx占用的CPU为43.7,40.0,20.5;并且ab进程也占了80.4,也就是10万请求,500并发的情况下,在这个机器上面,CPU超负荷了,很显然CPU是跟不上的,需要提升,当然可以根据具体情况应对具体的措施。
2. 通过第一大点,可以看出压测对服务器是很可怕的,我们在压测的同时,还需要做到,预防第三方的恶意压测,这里有
(1)
net.ipv4.tcp_syncookies = 0 (vim /etc/sysctl.conf 这里面可以看到)
这个是操作系统内核的一个参数,在高并发的情况下,内核会认为系统受到了SYN flood攻击,会发送cookies(possible SYN flooding on port 80. Sending cookies),这样会减慢影响请求的速度,所以在应用服务武器上设置下这个参数为0禁用系统保护就可以进行大并发测试了,如果设置为1,那么就会出现apr_socket_recv: Connection reset by peer (104),不让并发通过
net.ipv4.tcp_syncookies = 0 的时候,全部请求通过
net.ipv4.tcp_syncookies = 1 的时候,请求挡掉了
由此可见,这个可以预防恶意压测
(2)
limit_conn_zone等相关配置
limit_conn为限制并发连接数;
limit_rate为限制下载速度;
HTTP中配置
limit_conn_zone $binary_remote_addr zone=perip:10m;
Server中配置
limit_conn perip 10;
limit_rate_after 1m;
limit_rate 100k;
配置之前如下:
配置后如下:
很明显CPU利用率没有那么高了,以上是两种预压测的方案,当然还有其他的方案,不一一举例