![Apache 基准测试 Keep-Alive](https://linux22.com/image/544979/Apache%20%E5%9F%BA%E5%87%86%E6%B5%8B%E8%AF%95%20Keep-Alive.png)
我在 Apache 2.2(几乎是默认配置)上运行了一个简单的 PHP 脚本。当运行命令时ab -n 1 <address>
,其中地址是本地 IP 或域名,在第一秒左右收到所有数据后,我收到大约 15 秒的套接字保持打开状态的窗口。
当使用浏览器访问同一页面时,我得到的响应时间不到 100 毫秒。我知道大多数现代浏览器都支持 Keep-Alive 标头并使用某种 TTL 计时器存储持久连接。因此,当我运行该ab -kn <whatever>
命令时,我开始得到更接近我通过浏览器获得的性能预期的结果。
这是正常现象吗?我的服务器配置有问题吗?
[编辑]
ab
我再次使用该标志运行-v 2
,这是输出:
Benchmarking localhost (be patient)...INFO: POST header ==
---
GET <PATH> HTTP/1.0
Host: localhost
User-Agent: ApacheBench/2.3
Accept: */*
---
LOG: header received:
HTTP/1.1 200 OK
Date: Sat, 02 Apr 2011 05:09:42 GMT
Server: Apache/2.2.16 (Ubuntu)
Vary: Accept-Encoding
Content-Length: 86
Content-Type: text/html
<html><head><title>Dynamic</title><body><h1>This is another action!</h1></body></html>
..done
Server Software: Apache/2.2.16
Server Hostname: localhost
Server Port: 80
Document Path: <PATH>
Document Length: 86 bytes
Concurrency Level: 1
Time taken for tests: 15.076 seconds
Complete requests: 1
Failed requests: 0
Write errors: 0
Total transferred: 242 bytes
HTML transferred: 86 bytes
Requests per second: 0.07 [#/sec] (mean)
Time per request: 15075.916 [ms] (mean)
Time per request: 15075.916 [ms] (mean, across all concurrent requests)
Transfer rate: 0.02 [Kbytes/sec] received
Content-Encoding: gzip
然而,浏览器也接受97来自 php 的 zlib 压缩 - 也可能是 Apache 2.2 deflate 功能。15 秒的暂停发生在发送整个正文之后,之前..done
。
答案1
ab -n 1
我想您问的是,“即使服务器立即发送所有数据,等待连接断开(15 秒)后再返回是否正常?”
这不正常。
使用 verbosity = 2 ( ) 运行ab -v 2 <url>
,并检查返回的标头。服务器是否发送了 Connection: close?是否发送了错误的 Content-Length?
[编辑]
我现在看到您的正文只有一行,所以 ab 可能对在实体正文后没有获得 CR LF 感到不高兴。我无法使用 apache 和文本文件重现这种输出 - apache 在正文后添加 CR LF,而 ab 立即返回。您是如何生成此输出的?
答案2
在我将这些标头添加到服务器的响应后,它对我有用
连接:保持活动内容长度:xxx
奇怪的是,如果我不添加“Connection”标头,ab 会在“-k”模式下超时。看起来是实现中存在一些错误。