单机简单压测及调优
- 2019-04-14 11:50:00
- CJL 原创
- 4950
安装:https://www.cnblogs.com/terryguan/p/6681055.html
其他概念参考:https://www.cnblogs.com/nulige/p/9370063.html
参数:
-n 即requests,用于指定压力测试总共的执行次数。 -c 即concurrency,用于指定的并发数。 -t 即timelimit,等待响应的最大时间(单位:秒)。 -b 即windowsize,TCP发送/接收的缓冲大小(单位:字节)。 -p 即postfile,发送POST请求时需要上传的文件,此外还必须设置-T参数。 -u 即putfile,发送PUT请求时需要上传的文件,此外还必须设置-T参数。 -T 即content-type,用于设置Content-Type请求头信息,例如:application/x-www-form-urlencoded,默认值为text/plain。 -v 即verbosity,指定打印帮助信息的冗余级别。 -w 以HTML表格形式打印结果。 -i 使用HEAD请求代替GET请求。 -x 插入字符串作为table标签的属性。 -y 插入字符串作为tr标签的属性。 -z 插入字符串作为td标签的属性。 -C 添加cookie信息,例如:"Apache=1234"(可以重复该参数选项以添加多个)。 -H 添加任意的请求头,例如:"Accept-Encoding: gzip",请求头将会添加在现有的多个请求头之后(可以重复该参数选项以添加多个)。 -A 添加一个基本的网络认证信息,用户名和密码之间用英文冒号隔开。 -P 添加一个基本的代理认证信息,用户名和密码之间用英文冒号隔开。 -X 指定使用的和端口号,例如:"126.10.10.3:88"。 -V 打印版本号并退出。 -k 使用HTTP的KeepAlive特性。 -d 不显示百分比。 -S 不显示预估和警告信息。 -g 输出结果信息到gnuplot格式的文件中。 -e 输出结果信息到CSV格式的文件中。 -r 指定接收到错误信息时不退出程序。 -h 显示用法信息,其实就是ab -help。
样例:
ab -n 50000 -c 1020 http://192.168.1.110/a.html
注意事项:
被测机器与压测机器要分开
错误:socket: Too many open files (24)
压测机需要修改机器最大允许打开文件
ulimit -a
open files (-n) 1024 默认最大文件打开个数
修改为20W
ulimit -n 204800
错误:apr_socket_recv: Connection reset by peer (104)
当socket出现错误时让不退出,加 -r 参数
错误:apr_pollset_poll: The timeout specified has expired (70007)
加-k 参数 保持连接
压测要排除的要素:
被测机硬件配置(CPU、内存、硬盘)
压测机硬件配置(CPU、内存、硬盘)
网络连接:带宽、交换机性能、网卡
排除其他因素时需要使用相应的CPU、IO、网络压测工具
iperf安装和使用:https://blog.csdn.net/shenzhen206/article/details/72820341
服务端:iperf -s -d
客户端:iperf -c 192.168.100.55 -t 20 -i 2 -d -m
上图分别是本机和普通家用无线网络速率,可以看到差距明显
上图是5G无线网络,可以看到基本翻倍,5G的内网速率还是有很多提升的
压测结果
如何查看linux硬件配置:https://www.cnblogs.com/xd502djj/p/4318289.html
被测机器配置server1:Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz 1核 内存8G
被测机器配置server2:Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz 2核 内存8G
压测机client1:Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz 1核 内存4G
压测机client2:Intel(R) Core(TM) i5-7360u CPU @ 2.30GHz 1核 内存16G
nginx+静态页面
server1+client1: ab -n 200000 -c 500 -r http://192.168.1.110/a.html
server1+client2: ab -n 20000 -c 100 -r http://192.168.1.110/a.html 4000 QPS
不考虑网络因素QPS最高5000
server1+client1: ab -n 10000 -c 100 -r http://192.168.1.110/aa phpinfo+url重写 530 QPS URL重写基本无影响
server1+client1: ab -n 10000 -c 500 -r http://192.168.1.110/index.php 直接die输出3个字符 2400 QPS
server1+client1: ab -n 10000 -c 500 -r http://192.168.1.110/index.php 不执行任何php代码 2600 QPS
参考:https://www.cnblogs.com/cocoliu/p/8566193.html
php-fpm调优尝试
ulimit -n 204800 #内核打开文件数,机器配置较低时无效
php-fpm改为socket方式(尝试无效果,QPS降为2300 )
修改php-fpm.conf
listen = /dev/shm/php-cgi.sock listen.owner = www listen.group = www
nginx配置
fastcgi_pass unix:/dev/shm/php-cgi.sock;
server1+client1: ab -n 10000 -c 500 -r http://192.168.1.110/index.php 直接die输出3个字符 2300 QPS
修改nginx的backlog
backlog=1024(等待连接队列的最大长度)修改后效果不大
server1+client1: ab -n 10000 -c 500 -r http://192.168.1.110/index.php 直接die输出3个字符 2600 QPS
php-fpm进程数
pm = dynamic; pm.max_children = 300; 静态方式下开启的php-fpm进程数量 pm.start_servers = 20; 动态方式下的起始php-fpm进程数量 pm.min_spare_servers = 5; 动态方式下的最小php-fpm进程数量 pm.max_spare_servers = 35; 动态方式下的最大php-fpm进程数量
max_spare_servers 调整到100性能反而下降了
server1+client1: ab -n 10000 -c 500 -r http://192.168.1.110/index.php 直接die输出3个字符 900 QPS
pm.max_requests = 500; #1024 有部分提升
server1+client1: ab -n 10000 -c 500 -r http://192.168.1.110/index.php 直接die输出3个字符 2700 QPS
慢日志
request_slowlog_timeout = 2; 开启慢日志
slowlog = log/$pool.log.slow; 慢日志路径
开启opcache
http://www.cnblogs.com/JohnABC/p/4531029.html
https://www.cnblogs.com/chenguoli/p/7607208.html
查看php-fpm状态
nginx配置
location ~ ^/status$ { include fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; }
php-fpm.conf配置
pm.status_path = /status
pool:php-fpm池的名称,一般都是应该是www process manage:进程的管理方法,php-fpm支持三种管理方法,分别是static,dynamic和ondemand,一般情况下都是dynamic start time:php-fpm启动时候的时间,不管是restart或者reload都会更新这里的时间 start since:php-fpm自启动起来经过的时间,默认为秒 accepted conn:当前接收的连接数 listen queue:在队列中等待连接的请求个数,如果这个数字为非0,那么最好增加进程的fpm个数 max listen queue:从fpm启动以来,在队列中等待连接请求的最大值 listen queue len:等待连接的套接字队列大小 idle processes:空闲的进程个数 active processes:活动的进程个数 total processes:总共的进程个数 max active processes:从fpm启动以来,活动进程的最大个数,如果这个值小于当前的max_children,可以调小此值 max children reached:当pm尝试启动更多的进程,却因为max_children的限制,没有启动更多进程的次数。如果这个值非0,那么可以适当增加fpm的进程数 slow requests:慢请求的次数,一般如果这个值未非0,那么可能会有慢的php进程,一般一个不好的mysql查询是最大的祸首。
关闭nginx日志 效果不明显不到 2700 QPS
access_log off;
nginx工作进程数
worker_processes auto #或者与核数相同
更换测试工具wrk
参考:https://blog.csdn.net/Diligent_ten/article/details/79081433
server1+client1: wrk -t 2 -c 50 -d 20 --latency http://192.168.1.110/a.html 12056 QPS
server1+client1: wrk -t 2 -c 50 -d 20 --latency http://192.168.1.110/index.php 4868 QPS
wrk工具性能更高
server2+client1: wrk -t 5 -c 100 -d 20 --latency http://192.168.1.110/a.html 19590 QPS
server2+client1: wrk -t 5 -c 100 -d 20 --latency http://192.168.1.110/index.php 8548 QPS
基本CPU一个核可以达到 1W QPS HTML/ 5k QPS PHP
更换web server为swoole
swoole安装: https://blog.csdn.net/u010474681/article/details/82463779
yum install glibc-headers
yum install gcc-c++
Web Server代码:https://wiki.swoole.com/wiki/page/327.html
server2+client1: wrk -t 5 -c 100 -d 20 --latency http://192.168.1.110:9501/index.php 21595 QPS #与静态文件差不多
大概是官方公布的一半
增加Mysql+mysqli
增加一次sql查询
server2+client1: wrk -t 5 -c 100 -d 20 --latency http://192.168.1.110/m.php 2034 QPS
增加一次sql插入
server2+client1: wrk -t 5 -c 100 -d 20 --latency http://192.168.1.110/m.php 2500 QPS
增加一次sql插入一次sql查询
server2+client1: wrk -t 5 -c 100 -d 20 --latency http://192.168.1.110/m.php 2189 QPS
增加Redis
Redis安装:https://www.cnblogs.com/rslai/p/8249812.html
增加一次redis插入和查询
server2+client1: wrk -t 5 -c 100 -d 20 --latency http://192.168.1.110/r.php 2710 QPS
增加一次redis查询
server2+client1: wrk -t 5 -c 100 -d 20 --latency http://192.168.1.110/r.php 3266 QPS
增加一次redis插入
server2+client1: wrk -t 5 -c 100 -d 20 --latency http://192.168.1.110/r.php 4051 QPS
更换golang环境
安装:https://blog.csdn.net/bawenmao/article/details/80217055
yum install golang -y
package main import( "net/http" "fmt") func hello(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "hello world") } func main() { http.HandleFunc("/", hello); err := http.ListenAndServe(":8000", nil); if err != nil { } }
go build s.go
./s
server2+client1: wrk -t 5 -c 100 -d 20 --latency http://192.168.1.110:8000/ 21000 QPS
跟swoole差不多
从设计到实战:Go 如何扛住100亿次请求 https://studygolang.com/articles/9457