記憶の底で、_beginthread()したらCloseHandle()しなきゃいねないと思い込んでいたんですが、どうやら_beginthread()じゃなくて_beginthreadex()の場合だけだった(参照)。_beginthread()の場合はスレッド終了時にリソース回収されるらしい。
他いろいろと修正してkeep-aliveが動くようになり、ベンチマーク取ってみた。
テストは「helloworld」と書かれたhello.txtをabでGETする物。
まずはconnection closeの場合
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)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software:
Server Hostname: localhost
Server Port: 8080
Document Path: /hello.txt
Document Length: 11 bytes
Concurrency Level: 10
Time taken for tests: 0.993 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 160000 bytes
HTML transferred: 11000 bytes
Requests per second: 1006.77 [#/sec] (mean)
Time per request: 9.933 [ms] (mean)
Time per request: 0.993 [ms] (mean, across all concurrent requests)
Transfer rate: 157.31 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 1
Processing: 1 10 13.0 6 128
Waiting: 0 10 12.9 6 128
Total: 2 10 13.0 6 129
Percentage of the requests served within a certain time (ms)
50% 6
66% 7
75% 7
80% 7
90% 15
95% 31
98% 59
99% 86
100% 129 (longest request)
そしてconnection keep-aliveの場合
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)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software:
Server Hostname: localhost
Server Port: 8080
Document Path: /hello.txt
Document Length: 11 bytes
Concurrency Level: 10
Time taken for tests: 0.559 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Keep-Alive requests: 1000
Total transferred: 185472 bytes
HTML transferred: 11088 bytes
Requests per second: 1789.60 [#/sec] (mean)
Time per request: 5.588 [ms] (mean)
Time per request: 0.559 [ms] (mean, across all concurrent requests)
Transfer rate: 324.14 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 1
Processing: 0 6 19.7 1 263
Waiting: 0 5 19.0 0 262
Total: 0 6 19.8 1 263
Percentage of the requests served within a certain time (ms)
50% 1
66% 4
75% 4
80% 4
90% 11
95% 22
98% 46
99% 80
100% 263 (longest request)
ちなみに同じマシン(Ubuntu9.10 on CeleronM 1.5GHz 500M)で取ったapache2のベンチ。
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)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: Apache/2.2.11
Server Hostname: localhost
Server Port: 80
Document Path: /~mattn/hello.txt
Document Length: 11 bytes
Concurrency Level: 10
Time taken for tests: 0.771 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Keep-Alive requests: 1000
Total transferred: 464920 bytes
HTML transferred: 11000 bytes
Requests per second: 1297.49 [#/sec] (mean)
Time per request: 7.707 [ms] (mean)
Time per request: 0.771 [ms] (mean, across all concurrent requests)
Transfer rate: 589.09 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.5 0 7
Processing: 6 8 3.3 7 28
Waiting: 6 7 3.1 6 27
Total: 6 8 3.3 7 28
Percentage of the requests served within a certain time (ms)
50% 7
66% 7
75% 7
80% 7
90% 12
95% 16
98% 18
99% 27
100% 28 (longest request)
あまりパフォーマンスは意識してなかった割には、まぁまぁな速度(Request per secondでapache2の1.5倍速くらい?)が出たんじゃないかと思います。ただ機能も小さいですしapacheにも幾らかモジュールが入っちゃってますから参考値にしかすぎませんが...とりあえずmingw32で不意に落ちる問題が解決したのでこれからパフォーマンスも気にしながらやって行こうかなーと思います。