シンプルなWSGIサーバ picows
WSGIサーバの勉強がてらシンプルなWSGIサーバを書き始めした。
まだ全然できてませんけど。
特徴
- シングルスレッド
- 非同期
- WSGIのみサポート
これだけです。シンプルです。
呼び出しもシンプルでひとつのwsgi appしか載せられません。
他にもシンプルな理由は「全部Cで書いてある」って点もあるかも知れません。
ファイルもpicows.soのみです。
技術要素
- picoevベース
- ragelで吐いたrequest parser
- 一部のObjectはヒープに直接のっける
- cStringIOのAPIを直接使用
一応少しはパフォーマンスに気を使っています。
ragelベースの簡易HTTPパーサーなのでチャンクとかそういうのできません。
パフォーマンス
まだ細かい部分はできてないです、びみょーですけど。
まだロギングしてないので、同様なfapws3と単純なhello worldで比較してみます。
(それでも平等ではないですが。。。fapws3はlibevベースのWSGIサーバ)
picows
import picows def simple_app(environ, start_response): status = '200 OK' response_headers = [('Content-type','text/plain')] start_response(status, response_headers) return ['Hello world!\n'] picows.listen("0.0.0.0", 8000) picows.run(simple_app)
picows ab
Benchmarking 0.0.0.0 (be patient)
Server Software:
Server Hostname: 0.0.0.0
Server Port: 8000Document Path: /
Document Length: 13 bytesConcurrency Level: 100
Time taken for tests: 2.863 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 780078 bytes
HTML transferred: 130013 bytes
Requests per second: 3492.37 [#/sec] (mean)
Time per request: 28.634 [ms] (mean)
Time per request: 0.286 [ms] (mean, across all concurrent requests)
Transfer rate: 266.05 [Kbytes/sec] receivedConnection Times (ms)
min mean[+/-sd] median max
Connect: 0 4 3.5 3 33
Processing: 12 25 5.7 24 86
Waiting: 7 23 5.4 23 86
Total: 23 28 5.7 26 87Percentage of the requests served within a certain time (ms)
50% 26
66% 28
75% 30
80% 30
90% 32
95% 34
98% 48
99% 59
100% 87 (longest request)
fapws3
import fapws._evwsgi as evwsgi from fapws import base def hello(environ, start_response): start_response('200 OK', [('Content-Type','text/html')]) return ["hello world!!"] evwsgi.start("0.0.0.0", 8000) evwsgi.set_base_module(base) evwsgi.wsgi_cb(("/", hello)) evwsgi.run()
fapws3 ab
Benchmarking 0.0.0.0 (be patient)
Server Software: fapws3/0.3
Server Hostname: 0.0.0.0
Server Port: 8000Document Path: /
Document Length: 13 bytesConcurrency Level: 100
Time taken for tests: 6.899 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 1140000 bytes
HTML transferred: 130000 bytes
Requests per second: 1449.51 [#/sec] (mean)
Time per request: 68.989 [ms] (mean)
Time per request: 0.690 [ms] (mean, across all concurrent requests)
Transfer rate: 161.37 [Kbytes/sec] receivedConnection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 5.2 0 55
Processing: 10 67 15.4 65 128
Waiting: 4 65 15.4 63 126
Total: 27 68 13.8 65 128Percentage of the requests served within a certain time (ms)
50% 65
66% 67
75% 69
80% 72
90% 90
95% 98
98% 108
99% 115
100% 128 (longest request)
Tornadoはロギングが入ってるので平等ではないのですが、一応のせておきます。
使用したのはdemoのhello worldです。
TornadoServer
Benchmarking 0.0.0.0 (be patient)
Server Software: TornadoServer/0.1
Server Hostname: 0.0.0.0
Server Port: 8888Document Path: /
Document Length: 12 bytesConcurrency Level: 100
Time taken for tests: 18.469 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 1680000 bytes
HTML transferred: 120000 bytes
Requests per second: 541.46 [#/sec] (mean)
Time per request: 184.687 [ms] (mean)
Time per request: 1.847 [ms] (mean, across all concurrent requests)
Transfer rate: 88.83 [Kbytes/sec] receivedConnection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 3.0 2 58
Processing: 108 181 26.5 173 374
Waiting: 107 180 26.5 172 374
Total: 116 183 27.0 175 375Percentage of the requests served within a certain time (ms)
50% 175
66% 180
75% 187
80% 192
90% 202
95% 227
98% 265
99% 322
100% 375 (longest request)