用apache的ab压测如果-c太大会很慢是怎么回事?

用ab压测接口,-c 100的话很快,300、500、800甚至1000就开始慢了,90%或95%的耗时都比较快,就是总有一小部分请求的耗时会偏高,导致QPS变低的很厉害,这是为什么呢。

补充下,是在linux下试的

____________________分割线

是在linux下对本机压测的,整体就nginx+phpfpm

就压一个php文件,里面就echo一句hello world。

c 100的时候QPS大概在1400-1500左右,请求都维持100ms内。
但c提升到300以上,90%的请求依然可以在80ms左右,但就是有极少数请求会在2000、3000ms以上,整个QPS均值就跌下来了,就只有五六百。

阅读 7.8k
3 个回答

这个要看具体情况。本机测试,还是测试某个远端服务器? 服务器是云服务器还是自己机房里面的?从测试机到服务器的路径上有没有防火墙?带宽多少?服务器架构和组网是什么样的?有作负载分担吗?如果做了的话是根据什么来分担的?...

此外,你说QPS变低得很厉害,到底多低?

百度的ab测试出的QPS也不是很高:

$ ab -c 300 -n 300 http://www.baidu.com/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.baidu.com (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Finished 300 requests


Server Software:        BWS/1.1
Server Hostname:        www.baidu.com
Server Port:            80

Document Path:          /
Document Length:        99397 bytes

Concurrency Level:      300
Time taken for tests:   3.470 seconds
Complete requests:      300
Failed requests:        287
   (Connect: 0, Receive: 0, Length: 287, Exceptions: 0)
Write errors:           0
Total transferred:      30179295 bytes
HTML transferred:       29886790 bytes
Requests per second:    86.46 [#/sec] (mean)
Time per request:       3469.888 [ms] (mean)
Time per request:       11.566 [ms] (mean, across all concurrent requests)
Transfer rate:          8493.64 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        3   20   1.7     20      23
Processing:    35 2082 1070.6   1986    3426
Waiting:        4  445 373.3    265    1445
Total:         38 2102 1070.4   2005    3447

Percentage of the requests served within a certain time (ms)
  50%   2005
  66%   3229
  75%   3290
  80%   3302
  90%   3357
  95%   3393
  98%   3417
  99%   3429
 100%   3447 (longest request)

-c 100 表示1次发出100个请求.
对于采用epoll等事件驱动的服务比如Nginx,能够开门把请求先放进来,谁先准备好就先处理谁,不用排队.
而没有事件驱动的服务比如prefork MPM下的Apache,则只能把请求堵在门口的backlog队列里排队,逐个处理.
这时你要增加Apache的吞吐量,你就应该把backlog队列配置得更大些(默认511),以及增开工作进程.
进程数不宜开太多,否则CPU在大量进程间来回切换分配资源也会产生开销导致性能不佳.

也要你本地的并发连接能到啊,太大本地就直接报错了,或是没响应了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题