problem with apachebench (ab) and transfer-encodin

2019-08-28 01:42发布

问题:

i am using apachebench (ab) to test a web server

this problem is similar to this question.

here is output from one request

 :: ab -c 1 -n 1 -v 5 -k http://localhost:8082/typealine
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 localhost (be patient)...INFO: POST header == 
---
GET /typealine HTTP/1.0
Connection: Keep-Alive
Host: localhost:8082
User-Agent: ApacheBench/2.3
Accept: */*


---
LOG: header received:
HTTP/1.1 200 OK
set-cookie: i=101203-012359.597-197269fc4;path=/;expires=Thu,31-Dec-2020 00:00:00 GMT;
content-type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: Keep-Alive

205
<html><head><link href=/default.css rel=stylesheet><script src=/default.js></script></head><body onload=ui.onload()><form onsubmit=return(false)><center>
<div style="text-align:center;border:1px dotted blue;padding:7px"><span id=__st> ڀ </span><input value="" title="s" id=_s name=_s type=text onkeypress="return ui._cr(event,this,'_ a')" size=32 onchange="this._changed=true"> <a id=_ href="javascript:ui.ax('_ a')">ᐖ</a><script>document.getElementById('_s').focus();</script><br>
<br>
<span id=disp></span></div>
0


LOG: Response code = 200
..done


Server Software:        
Server Hostname:        localhost
Server Port:            8082

Document Path:          /typealine
Document Length:        0 bytes

Concurrency Level:      1
Time taken for tests:   0.001 seconds
Complete requests:      1
Failed requests:        0
Write errors:           0
Keep-Alive requests:    1
Total transferred:      721 bytes
HTML transferred:       0 bytes
Requests per second:    1312.34 [#/sec] (mean)
Time per request:       0.762 [ms] (mean)
Time per request:       0.762 [ms] (mean, across all concurrent requests)
Transfer rate:          924.02 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:     1    1   0.0      1       1
Waiting:        0    0   0.0      0       0
Total:          1    1   0.0      1       1

here is sample output which fails

 :: ab -c 1 -n 5 -v 5 -k http://localhost:8082/typealine
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 localhost (be patient)...INFO: POST header == 
---
GET /typealine HTTP/1.0
Connection: Keep-Alive
Host: localhost:8082
User-Agent: ApacheBench/2.3
Accept: */*


---
LOG: header received:
HTTP/1.1 200 OK
set-cookie: i=101203-012711.490-1fdea5f58;path=/;expires=Thu,31-Dec-2020 00:00:00 GMT;
content-type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: Keep-Alive

205
<html><head><link href=/default.css rel=stylesheet><script src=/default.js></script></head><body onload=ui.onload()><form onsubmit=return(false)><center>
<div style="text-align:center;border:1px dotted blue;padding:7px"><span id=__st> ڀ </span><input value="" title="s" id=_s name=_s type=text onkeypress="return ui._cr(event,this,'_ a')" size=32 onchange="this._changed=true"> <a id=_ href="javascript:ui.ax('_ a')">ᐛ</a><script>document.getElementById('_s').focus();</script><br>
<br>
<span id=disp></span></div>
0


LOG: Response code = 200
LOG: header received:
HTTP/1.1 200 OK
set-cookie: i=101203-012711.490-10b9564e5;path=/;expires=Thu,31-Dec-2020 00:00:00 GMT;
content-type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: Keep-Alive


LOG: Response code = 200
LOG: header received:
205
<html><head><link href=/default.css rel=stylesheet><script src=/default.js></script></head><body onload=ui.onload()><form onsubmit=return(false)><center>
<div style="text-align:center;border:1px dotted blue;padding:7px"><span id=__st> ڀ </span><input value="" title="s" id=_s name=_s type=text onkeypress="return ui._cr(event,this,'_ a')" size=32 onchange="this._changed=true"> <a id=_ href="javascript:ui.ax('_ a')">ᐖ</a><script>document.getElementById('_s').focus();</script><br>
<br>
<span id=disp></span></div>
0


WARNING: Response code not 2xx (500)
apr_poll: The timeout specified has expired (70007)
Total of 2 requests completed

i am very keen on finding the bug in the web server or determine whether ab has problem

here is output from telnet session mimicking ab

 :: telnet localhost 8082
Trying ::1...
Connected to localhost.localdomain.
Escape character is '^]'.
GET /typealine HTTP/1.0
Connection: Keep-Alive
Host: localhost:8082
User-Agent: ApacheBench/2.3
Accept: */*

HTTP/1.1 200 OK
set-cookie: i=101203-030537.389-1d3d8c1cb;path=/;expires=Thu,31-Dec-2020 00:00:00 GMT;
content-type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: Keep-Alive

205
<html><head><link href=/default.css rel=stylesheet><script src=/default.js></script></head><body onload=ui.onload()><form onsubmit=return(false)><center>
<div style="text-align:center;border:1px dotted blue;padding:7px"><span id=__st> ڀ </span><input value="" title="s" id=_s name=_s type=text onkeypress="return ui._cr(event,this,'_ a')" size=32 onchange="this._changed=true"> <a id=_ href="javascript:ui.ax('_ a')">ᐖ</a><script>document.getElementById('_s').focus();</script><br>
<br>
<span id=disp></span></div>
0

GET /typealine HTTP/1.0
Connection: Keep-Alive
Host: localhost:8082
User-Agent: ApacheBench/2.3
Accept: */*

HTTP/1.1 200 OK
set-cookie: i=101203-030539.162-1d8b8c256;path=/;expires=Thu,31-Dec-2020 00:00:00 GMT;
content-type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: Keep-Alive

205
<html><head><link href=/default.css rel=stylesheet><script src=/default.js></script></head><body onload=ui.onload()><form onsubmit=return(false)><center>
<div style="text-align:center;border:1px dotted blue;padding:7px"><span id=__st> ڀ </span><input value="" title="s" id=_s name=_s type=text onkeypress="return ui._cr(event,this,'_ a')" size=32 onchange="this._changed=true"> <a id=_ href="javascript:ui.ax('_ a')">ᐖ</a><script>document.getElementById('_s').focus();</script><br>
<br>
<span id=disp></span></div>
0

GET /typealine HTTP/1.0
Connection: Keep-Alive
Host: localhost:8082
User-Agent: ApacheBench/2.3
Accept: */*

HTTP/1.1 200 OK
set-cookie: i=101203-030541.086-18be1706b;path=/;expires=Thu,31-Dec-2020 00:00:00 GMT;
content-type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: Keep-Alive

205
<html><head><link href=/default.css rel=stylesheet><script src=/default.js></script></head><body onload=ui.onload()><form onsubmit=return(false)><center>
<div style="text-align:center;border:1px dotted blue;padding:7px"><span id=__st> ڀ </span><input value="" title="s" id=_s name=_s type=text onkeypress="return ui._cr(event,this,'_ a')" size=32 onchange="this._changed=true"> <a id=_ href="javascript:ui.ax('_ a')">ᐛ</a><script>document.getElementById('_s').focus();</script><br>
<br>
<span id=disp></span></div>
0

回答1:

From that output it looks like there's an extra CRLF after the headers of the second response, whereas ab would expect to see the chunk length.



回答2:

So the problem is that the spec calls for a 0 CRLF CRLF as the end marker of chunked transfer-encoding. ab is broken because it wants 0 and CRLF.



标签: apachebench