[转帖]Apache的ab进行并发性能测试的注意点

apache,ab,进行,并发,性能,测试,注意 · 浏览次数 : 0

小编点评

**内容简介:** 这是一个关于压力测试的描述,其中包含一些关于ab工具的设置和参数的说明。 **主要内容:** 1. **最终这一项Percentage的请求消耗了大量的时间,对于正常的用户响应来说,这是不行的。** 2. **通过把这行数据(longest request)控制在5秒内,我们可以得出一台服务器适当的并发能力到底是多少。** 3. **高并发测试的注意点:** - 1. **Mysql数据库并发调整**:设置`max_connections`参数可以解决并发连接数超过`max_connections`时的错误。 - 2. **ab错误**:设置参数`-c`可以禁用系统保护, allowing higher concurrency tests. - 3. **重新编译ab**:修改`ab.c`文件中的`apr_socket_recv`函数,解决连接时间超时的问题。 - 4. **ab错误**:设置参数`-k`可以保持连接进行测试。 - 5. **-c选项的参数不能大于-n的参数**:-c选项的参数不能超过`-n`。 6. **其他设置:** - `net.ipv4.netfilter.ip_conntrack_max`:设置连接跟踪最大数量。 - `net.nf_conntrack_max`:设置连接跟踪最大数量。 - `ip_conntrack模块**:用于连接跟踪功能。 7. **测试结果分析**: - 1000 Time taken for tests:测试运行时间。 - 2.629 seconds:测试总运行时间。 - 100000 Failed requests:失败的请求数量。 - 10018:连接成功的请求数量。 8. **gzip压缩**: - 默认情况下,ab没有启用gzip压缩功能。 - 使用参数`-H 'Accept-Encoding: gzip'`可以添加gzip压缩功能。

正文

http://www.piaoyi.org/linux/Apache-ab-test.html

 

正 文:

ab命令原理 

Apache的ab命令模拟多线程并发请求,测试服务器负载压力,也可以测试nginx、lighthttp、IIS等其它Web服务器的压力。 


ab命令对发出负载的计算机要求很低,既不会占用很多CPU,也不会占用太多的内存,但却会给目标服务器造成巨大的负载,因此是某些DDOS攻击之必备良药,老少皆宜。自己使用也须谨慎。否则一次上太多的负载,造成目标服务器直接因内存耗光死机,而不得不硬重启,得不偿失。

 

在带宽不足的情况下,最好是本机进行测试,建议使用内网的另一台或者多台服务器通过内网进行测试,这样得出的数据,准确度会高很多。远程对web服务器进行压力测试,往往效果不理想(因为网络延时过大或带宽不足)

 

ab 命令格式:

ab [ -A auth-username:password ] [ -b windowsize ] [ -c concurrency ] [ -C cookie-name=value ] [ -d ] [ -e csv-file ] [ -f protocol ] [ -g gnuplot-file ] [ -h ] [ -H custom-header ] [ -i ] [ -k ] [ -n requests ] [ -p POST-file ] [ -P proxy-auth-username:password ] [ -q ] [ -r ] [ -s ] [ -S ] [ -t timelimit ] [ -T content-type ] [ -u PUT-file ] [ -v verbosity] [ -V ] [ -w ] [ -x <table>-attributes ] [ -X proxy[:port] ] [ -y <tr>-attributes ] [ -z <td>-attributes ] [ -Z ciphersuite ] [http[s]://]hostname[:port]/path

 

经常用到的参数是:

-c 并发数

-n 请求数

-k 保持连接

 

比如 :

ab -c1000 -n10000 http://test.dev/

返回的结果:

[root@piaoyi.ORG ~]# /usr/local/apache/bin/ab -c15000 -n150000 http://test.dev/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking test.dev (be patient)
Completed 15000 requests
Completed 30000 requests
Completed 45000 requests
Completed 60000 requests
Completed 75000 requests
Completed 90000 requests
Completed 105000 requests
Completed 120000 requests
Completed 135000 requests
Completed 150000 requests
Finished 150000 requests


Server Software:        nginx
Server Hostname:        test.dev
Server Port:            80

Document Path:          /
Document Length:        123 bytes #HTTP响应数据的正文长度

Concurrency Level:      15000
Time taken for tests:   48.416 seconds #所有这些请求处理完成所花费的时间 
Complete requests:      150000 #完成请求数 
Failed requests:        0 #失败请求数 
Write errors:           0
Total transferred:      40950000 bytes
HTML transferred:       18450000 bytes
Requests per second:    3098.17 [#/sec] (mean) #QPS-每秒请求数 
Time per request:       4841.572 [ms] (mean)
Time per request:       0.323 [ms] (mean, across all concurrent requests)
Transfer rate:          825.98 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0 1792 1722.4   1394   32126
Processing:     1 2796 1533.7   2515   10268
Waiting:        1 2499 1484.1   2200    9987
Total:          3 4588 2199.0   4632   34177

Percentage of the requests served within a certain time (ms)
  50%   4632
  66%   5381
  75%   5975
  80%   6317
  90%   6778
  95%   7562
  98%   9299
  99%   9355
 100%  34177 (longest request)

最后这一项

Percentage of the requests served within a certain time (ms)

代表50%的请求在4.6秒内完成了,99%的请求在9.3秒内完成,所有请求完成需要34秒。说明最后的1%的请求消耗了大量的时间,对于正常的用户响应来说,这是不行的,所有的并发请求应该控制在5秒内完成,再长的时间等待对于用户来说是不可接受的。

 

通过把这行数据(longest request)控制在5秒内,我们可以得出一台服务器适当的并发能力到底是多少。

 

 

高并发测试的注意点:

 

1、Mysql数据库并发调整

如果需要连接mysql数据库,先把mysql的并发连接数提高,my.cnf里面:

[mysqld]

thread_cache_size = 256

max_connections = 10000

 

否则在高并发时,mysql就会报错:

Error 1040: Too many connections

 

 

2、ab错误:apr_socket_recv:Connection reset by peer (104)

解决方法一:使用参数 -r,如 ab -r -n 10000 -c 1000 http://localhost:9090/hello

 

解决方法二:

apr_socket_recv这个是操作系统内核的一个参数,在高并发的情况下,内核会认为系统受到了SYN flood攻击,会发送cookies(possible SYN flooding on port 80. Sending cookies),这样会减慢影响请求的速度,所以在应用服务武器上设置下这个参数为0禁用系统保护就可以进行大并发测试了:

# vim /etc/sysctl.conf

net.ipv4.tcp_syncookies = 0

# sysctl -p

然后就可以超过1000个并发测试了。

 

解决方法三:

重新编译ab,修改ab.c文件,大约1380行处:

    }else { 

       //apr_err("apr_socket_recv", status);   // 从这开始 

       bad++; 

       close_connection(c); 

       return;      // 到这里 

    }

 

3、ab错误:apr_socket_recv:Connection timed out (110)

vi /etc/sysctl.conf

在kernel2.6之前的添加项:

net.ipv4.netfilter.ip_conntrack_max =655360

net.ipv4.netfilter.ip_conntrack_tcp_timeout_established= 180

kernel2.6之后的添加项:

net.nf_conntrack_max = 655360

net.netfilter.nf_conntrack_tcp_timeout_established= 1200

[long@longhao etc]# sysctl -p/etc/sysctl.conf

如果报错:error: “net.nf_conntrack_max” is an unknown key 则需要使用modprobe载入ip_conntrack模块,lsmod查看模块已载入。

[long@longhao etc]# modprobe ip_conntrack

 

4、ab错误:apr_poll: Thetimeout specified has expired (70007)

由于某些框架太大(比如laravel框架),超时了,可以增加 -k 参数,保持连接进行测试。

 

5、 ab的-c选项的参数最大到20000,如果想再大,只能修改源码再安装

 

6、-c选项的参数不能大于-n的参数

 

7、Failed requests(失败的请求)

在用ab测试的时候,只要出现Failed requests(失败的请求),就会出现三种失败的类型统计:Connect、Length、Exception。

Concurrency Level:      1000
Time taken for tests:   2.629 seconds
Complete requests:      100000
Failed requests:        10018
   (Connect: 0, Receive: 0, Length: 10018, Exceptions: 0)
Write errors:           0
Non-2xx responses:      7

 

Connect:向服务器发送请求失败;服务器连接失败;请求过程连接中断等。

Length:服务器返回的数据长度不一致,一般是对比Content-Length的值。

Exception:与服务器连接过程中发生意外错误。

 

这里主要说明一下Length,ab会把第一次成功返回的content-length作为基准,如果后面的请求返回的content-length跟第一次的不一样,它就会把这次请求当成是失败了。对于动态类型(如PHP)的网站,每次服务器返回的数据都不一定相同,所以如果ab提示的是Length错误,基本都可以忽略掉。

 

8、gzip压缩功能

默认情况下,ab没有启用gzip压缩功能,所以压力测试的结果会跟实际情况有很大的偏差。要想让ab使用gzip压缩功能,得添加参数 -H 'Accept-Encoding: gzip'

ab -H 'Accept-Encoding: gzip' www.xxx.com/

 

9、带参数的压力测试示例

ab 'www.xxx.com/?a=1&b=2&c=3'

与[转帖]Apache的ab进行并发性能测试的注意点相似的内容:

[转帖]Apache的ab进行并发性能测试的注意点

http://www.piaoyi.org/linux/Apache-ab-test.html 正 文: ab命令原理 Apache的ab命令模拟多线程并发请求,测试服务器负载压力,也可以测试nginx、lighthttp、IIS等其它Web服务器的压力。 ab命令对发出负载的计算机要求很低,既不会

[转帖]AB压力测试工具在LINUX下的安装和使用

https://www.freesion.com/article/75371454707/ 一、AB的安装 ab的安装非常简单,如果是源码安装apache的话,那就更简单了。apache安装完毕后ab命令存放在apache安装目录的bin目录下。如下: /usr/local/apache2/bin

[转帖]CentOS7 ab压力测试安装与解释

#背景 Apache Benchmark(简称ab) 是Apache安装包中自带的压力测试工具 ,简单易用在此提供 ab 在 centOS7 下的安装和使用方法注:个人发现,之前安装的centos6.5 默认已安装了ab,具体原因不明 ①.ab(apache benchmark)安装 命令:# yu

[转帖]apr_socket_recv: Connection reset by peer 错误

用ab做性能测试. 并发请求量稍微高一点(200,300以上)就会报apr_socket_recv: Connection reset by peer 的错. 刚开始以为apache服务器设置有问题. 网上一顿找, 结果你也懂的. 按照咱国家特殊国情惯例, 都是同一篇文章考来考去. 最后还是找到一个

[转帖]Redis压测工具(redis-benchmark)

目录 1、简介 2、参数 3、操作 1、简介 Redis 自带了一个叫 redis-benchmark 的工具来模拟 N 个客户端同时发出 M 个请求。(类似于 Apache ab 程序)。 Redis下载地址: https://redis.io/download 2、参数 redis-benchm

[转帖]Nginx 性能测试

https://plantegg.github.io/2022/10/10/Nginx%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/ 压测工具选择 wrk ,apache ab压nginx单核没问题,多核的话 ab 自己先到瓶颈。另外默认关闭 access.log 避免

[转帖]Nginx之proxy_redirect详解

今天在做nginx反向代理apache的时候出了一点点问题,原来后端apache用的端口是8080通过反向代理后,使用wireshark抓包发现location头域数值为http://192.168.1.154:8080/wuman/ 如果把这个返回给客户端肯定是不可以的,看起来别扭而且还暴露了ap

[转帖]容器监控实践-Grafana

容器监控实践-Grafana https://www.jianshu.com/p/cdda94e5b9e2 概述 Grafana 是一个开源的,可以用于大规模指标数据的可视化项目,甚至还能对指标进行报警。基于友好的 Apache License 2.0 开源协议,目前是prometheus监控展示的

[转帖]nginx源码编译及优化

Apache与nginx的区别 apache: 进程,稳定模块超多,基本想到的都可以找到少bug ,nginx 的bug 相对较多 nginx: 线程,快,不稳定。多线程是共享的,一个线程出问题,其他的也会受牵连。7层调度,反向代理能力强。CDN这块nginx也用的多轻量级,同样起web 服务,比a

[转帖]对比测试:Apache Pulsar 与 Kafka 在金融场景下的性能分析

https://baijiahao.baidu.com/s?id=1680081990582501220&wfr=spider&for=pc Apache Pulsar 是下一代分布式消息流平台,采用计算存储分层架构,具备多租户、高一致、高性能、百万 topic、数据平滑迁移等诸多优势。越来越多的企