Wednesday, June 1, 2011

apache 2 web server prefork? or worker?

worker가 2배 더 빠르다는 결과가 나왔군. 흥미로운데..

I compiled 2 different versions of apache 2.2.4 on Solaris 10 (06/06, on a crappy U10, but...) one using the prefork MPM (compile --with-mpm=prefork) and the other using the worker MPM (compile --with-mpm=worker). Prefork is supposed to generally be better for single or dual cpu systems, and worker is supposed to be generally better for multi-CPU systems. The following are the Apache Bench results run against each build on an old Sun Ultra 10 with a single 440mhz CPU and 512m RAM. The server isn't impressive, but it works for bench-testing the MPMs...
I used the default settings for each MPM:
-------------------------------------------------------------
<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

<IfModule mpm_worker_module>
    StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadsPerChild      25
    MaxRequestsPerChild   0
</IfModule>
-------------------------------------------------------------
and the siege tests were run with the following settings:
-------------------------------------------------------------
concurrent = 10
time = 5M
benchmark = true
-------------------------------------------------------------



Apache Bench results for prefork:
-------------------------------------------------------------
% ./ab -n 10000 -c 10 http://192.168.1.80/index.html

...

Server Software:        Apache/2.2.4
Server Hostname:        192.168.1.80
Server Port:            80

Document Path:          /index.html
Document Length:        44 bytes

Concurrency Level:      10
Time taken for tests:   478.185521 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      3160000 bytes
HTML transferred:       440000 bytes
Requests per second:    20.91 [#/sec] (mean)
Time per request:       478.185 [ms] (mean)
Time per request:       47.819 [ms] (mean, across all concurrent requests)
Transfer rate:          6.45 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2  95.4      0    3380
Processing:     1  472 1178.0      2   10139
Waiting:        0   41 389.2      0   10138
Total:          1  475 1182.0      2   10139

Percentage of the requests served within a certain time (ms)
  50%      2
  66%      2
  75%      3
  80%      4
  90%   3372
  95%   3377
  98%   3379
  99%   3381
 100%  10139 (longest request)
-------------------------------------------------------------
Siege results for prefork:
-------------------------------------------------------------
Lifting the server siege...      done.                                                    
Transactions:                   6045 hits
Availability:                 100.00 %
Elapsed time:                 300.38 secs
Data transferred:               0.25 MB
Response time:                  0.50 secs
Transaction rate:              20.12 trans/sec
Throughput:                     0.00 MB/sec
Concurrency:                    9.97
Successful transactions:        6045
Failed transactions:               0
Longest transaction:           10.13
Shortest transaction:           0.00
-------------------------------------------------------------
Apache Bench results for worker:
-------------------------------------------------------------
% ./ab -n 10000 -c 10 http://192.168.1.80/index.html

...

Server Software:        Apache/2.2.4
Server Hostname:        192.168.1.80
Server Port:            80

Document Path:          /index.html
Document Length:        44 bytes

Concurrency Level:      10
Time taken for tests:   244.283673 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      3160000 bytes
HTML transferred:       440000 bytes
Requests per second:    40.94 [#/sec] (mean)
Time per request:       244.284 [ms] (mean)
Time per request:       24.428 [ms] (mean, across all concurrent requests)
Transfer rate:          12.63 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1  75.4      0    3378
Processing:     1  239 870.1      1   11898
Waiting:        0   16 229.6      0    3388
Total:          1  241 872.9      1   11898

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      2
  75%      2
  80%      2
  90%      4
  95%   3373
  98%   3379
  99%   3380
 100%  11898 (longest request)
-------------------------------------------------------------
Siege results for worker:
-------------------------------------------------------------
Lifting the server siege...      done.                                                      
Transactions:                  11024 hits
Availability:                 100.00 %
Elapsed time:                 300.24 secs
Data transferred:               0.46 MB
Response time:                  0.27 secs
Transaction rate:              36.72 trans/sec
Throughput:                     0.00 MB/sec
Concurrency:                    9.91
Successful transactions:       11024
Failed transactions:               0
Longest transaction:           11.92
Shortest transaction:           0.00
-------------------------------------------------------------

So for this setup, the worker MPM was almost twice as fast as the prefork.
I'm going to run these same tests on a multi-cpu server and see what the results look like.

No comments:

Post a Comment