单机简单压测及调优

2019-04-14 11:50:00
CJL
原创
3129

安装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




发表评论
评论通过审核后显示。
流量统计