最新消息:

Wheatserver与Gevent作为WSGI服务器的性能评测

python admin 3043浏览 0评论

Wheatserver是通用的C实现的通用服务器以及框架,更多的请参考Wheatserver

WSGI应用服务器众多,较为出色的有uWSGI,Gunicorn,gevent和Apache mod_wsgi。性能评测参考http://nichol.as/benchmark-of-python-web-servers

为了比较Wheatserver的性能并且为了省事,我选取了在该评测中性能最为出色的gevent实现的WSGI应用服务器,主要考查了内存消耗,简单App下相应速度,带数据库连接的相应速度和带搜索的服务访问能力。Http测试客户端使用Apache ab。

由于Wheatserver是多工作进程模式,而gevent是单进程单线程模式,所以为了避免Wheatserver多进程的干扰,我们同样只使用一个进程的Wheatserver。

同样是Hello world应用

#!/usr/bin/python
def application(env, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return ["<b>hello world</b>"]
Server Software: gevent Server Hostname: 127.0.0.1 Server Port: 8088 Document Path: / Document Length: 18 bytes Concurrency Level: 50 Time taken for tests: 0.056 seconds Complete requests: 100 Failed requests: 0 Write errors: 0 Total transferred: 13800 bytes HTML transferred: 1800 bytes Requests per second: 1773.33 [#/sec] (mean) Time per request: 28.196 [ms] (mean) Time per request: 0.564 [ms] (mean, across all concurrent requests) Transfer rate: 238.98 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 1 1.2 1 7 Processing: 2 21 10.3 21 50 Waiting: 2 21 10.5 21 50 Total: 3 23 10.7 23 50 Percentage of the requests served within a certain time (ms) 50% 23 66% 30 75% 31 80% 32 90% 35 95% 39 98% 49 99% 50 100% 50 (longest request)
Server Software:        wheatserver
Server Hostname:        127.0.0.1
Server Port:            10828

Document Path:          /
Document Length:        13 bytes

Concurrency Level:      50
Time taken for tests:   0.021 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      15500 bytes
HTML transferred:       1300 bytes
Requests per second:    4704.55 [#/sec] (mean)
Time per request:       10.628 [ms] (mean)
Time per request:       0.213 [ms] (mean, across all concurrent requests)
Transfer rate:          712.12 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.7      1       2
Processing:     1    7   2.4      8      10
Waiting:        1    7   2.4      8      10
Total:          2    8   1.9      8      11

Percentage of the requests served within a certain time (ms)
  50%      8
  66%      9
  75%      9
  80%      9
  90%      9
  95%     10
  98%     10
  99%     11
 100%     11 (longest request)

简单App下,平均相应时间是gevent的二分之一,主要是没有IO操作,C实现的Wheatserver自然更快。

Server Software:        wheatserver
Server Hostname:        127.0.0.1
Server Port:            10828

Document Path:          /
Document Length:        11995 bytes

Concurrency Level:      5
Time taken for tests:   0.709 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      1226700 bytes
HTML transferred:       1199500 bytes
Requests per second:    141.08 [#/sec] (mean)
Time per request:       35.441 [ms] (mean)
Time per request:       7.088 [ms] (mean, across all concurrent requests)
Transfer rate:          1690.05 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:     9   35   3.8     35      42
Waiting:        9   34   3.8     35      42
Total:         10   35   3.7     35      42

Percentage of the requests served within a certain time (ms)
  50%     35
  66%     36
  75%     36
  80%     37
  90%     38
  95%     39
  98%     41
  99%     42
 100%     42 (longest request)
Server Software:        gevent
Server Hostname:        127.0.0.1
Server Port:            8088

Document Path:          /
Document Length:        11995 bytes

Concurrency Level:      5
Time taken for tests:   0.779 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      1224600 bytes
HTML transferred:       1199500 bytes
Requests per second:    128.39 [#/sec] (mean)
Time per request:       38.944 [ms] (mean)
Time per request:       7.789 [ms] (mean, across all concurrent requests)
Transfer rate:          1535.43 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:     8   38   5.3     38      51
Waiting:        8   38   5.3     38      51
Total:          9   38   5.3     38      51

Percentage of the requests served within a certain time (ms)
  50%     38
  66%     39
  75%     39
  80%     40
  90%     42
  95%     48
  98%     51
  99%     51
 100%     51 (longest request)

在带有数据库连接的访问中,我们可以发现两者相差不多,响应时间主要以IO为主,Wheatserver略微占优。

Server Software:        wheatserver
Server Hostname:        127.0.0.1
Server Port:            10828

Document Path:          /result/love/
Document Length:        15461 bytes

Concurrency Level:      5
Time taken for tests:   2.556 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      1573300 bytes
HTML transferred:       1546100 bytes
Requests per second:    39.12 [#/sec] (mean)
Time per request:       127.814 [ms] (mean)
Time per request:       25.563 [ms] (mean, across all concurrent requests)
Transfer rate:          601.04 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       1
Processing:    24  125  16.2    124     158
Waiting:       24  125  16.2    124     158
Total:         25  125  16.2    124     158

Percentage of the requests served within a certain time (ms)
  50%    124
  66%    125
  75%    131
  80%    135
  90%    141
  95%    150
  98%    157
  99%    158
 100%    158 (longest request)
Server Software:        gevent
Server Hostname:        127.0.0.1
Server Port:            8088

Document Path:          /result/love/
Document Length:        15461 bytes

Concurrency Level:      5
Time taken for tests:   2.556 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      1571200 bytes
HTML transferred:       1546100 bytes
Requests per second:    39.12 [#/sec] (mean)
Time per request:       127.806 [ms] (mean)
Time per request:       25.561 [ms] (mean, across all concurrent requests)
Transfer rate:          600.28 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:    25  125  15.8    125     157
Waiting:       25  125  15.7    125     157
Total:         26  125  15.8    125     157

Percentage of the requests served within a certain time (ms)
  50%    125
  66%    126
  75%    128
  80%    129
  90%    143
  95%    146
  98%    155
  99%    157
 100%    157 (longest request)

在带搜索服务的对比上,可以发现两者更为一致,基本不分伯仲。

最后看一下两者在内存上对比,gevent在同样App下保持37MB的内存,而Wheatserver同样以35MB差不多。值得注意的是Wheatserver的内存消耗量多是因为Python应用的运行和预分配内存机制的存在,在实际运行中,Wheatserver的内存量会比gevent略低。考虑到gevent依赖libevent,greenlet等库,内存量应该稍多于Wheatserver。但gevent以Python实现的服务器能达到如此低的内存也令人惊讶。

Wheatserver在作为Http服务器方面由于IO比重大,主要CPU时间在应用上,因此优势比之Gevent不大。在静态文件发送上,Wheatserver可以做到与Nginx媲美的响应速度和能力,并且是在Wheatserver并没有使用缓存的基础上。

转载请注明:爱开源 » Wheatserver与Gevent作为WSGI服务器的性能评测

您必须 登录 才能发表评论!