fcgi vs scgi vs cherrypy (web.py dev server)
Приспичило посмотреть что есть scgi и чем он лучше. Тестил на lighttpd 1.49, возможно по этому результаты немного отличается от предыдущих тестов
Тестил при помощи ab на локалхосте. На простом приложении на web.py 0.23 для scgi:
slav0nic@sl:~$ cat /var/www/test/code.fcgi
#!/usr/bin/python2.5
import web, sys
urls = (
'/', 'index'
)
class index:
def GET(self):
web.header("Content-Type","text/html; charset=utf-8")
print web.ctx
web.wsgi.runwsgi = lambda func, addr=("127.0.0.1", 4000): web.wsgi.runscgi(func, addr)
if __name__ == '__main__':
sys.stderr = open("/dev/null", "a") #не выводим в консоль инфу о коннектах
web.run(urls, globals())
конфиг для mod_scgi:
scgi.server = ( "/code.fcgi" => ((
"host" => "127.0.0.1",
"port" => 4000,
"max-procs" => 1,
"bin-environment" => ("REAL_SCRIPT_NAME" => ""),
"check-local" => "disable")
))
для mod_fcgi:
fastcgi.server = ".fcgi" =>
(("bin-path"=>"/var/www/test/code.fcgi",
"socket" => "/tmp/python.socket",
"bin-environment" => (
"REAL_SCRIPT_NAME" => "",
"check-local" => "disable"),
"max-procs" => 1,
))
SCGI-приложение запускалось как простой файл ./code.fcgi c lighttpd общалось через tcp socket (через unix-socket оно похоже и не умеет, увы с доками к mod_scgi полная ж@#$). stderr редиректил в /dev/null, без этого на ~30-50 запросов в секунду меньше (при запусуке в gnome-terminal) Длина документа примерно 2Кб.
Максимальное число запросов в секунду выделено жирным, 2й - курсив, выдача статики приведена просто для сравнения и интеерса не представляет =)
Итакс результаты:
1 конкурирующий запрос, 2к запросов (последовательных)
FCGI, ab -n2000 localhost/
Requests per second: 564.05CherryPy/3.0.1 (то что в web.py встроено) ab -n2000 localhost:8080/
Requests per second: 898.09SCGI, /usr/sbin/ab -n2000 localhost/
Document Length: 2104 bytes
Requests per second: _ 674.35_
Transfer rate: 1503.80 [Kbytes/sec] receivedlighttpd static, /usr/sbin/ab -n2000 localhost/static/
Document Length: 2455 bytes
Requests per second: 3053.12
5 конкурирующих запросов:
FCGI, /usr/sbin/ab -n2000 -c5 localhost/
Failed requests: 741
Requests per second: 537.87
Transfer rate: 1196.75 [Kbytes/sec] receivedCherryPy/3.0.1, /usr/sbin/ab -n2000 -c5 localhost:8080/
Failed requests: 3
Requests per second: 880.78
Transfer rate: 1540.49 [Kbytes/sec] receivedSCGI, sl:/etc/lighttpd# /usr/sbin/ab -n2000 -c5 localhost/
Requests per second: 764.70
Transfer rate: 1705.28 [Kbytes/sec] receivedlighttpd static, /usr/sbin/ab -n2000 -c5 localhost/static/
Requests per second: 3301.76
Transfer rate: 8449.20 [Kbytes/sec] received
25 конкурирующих запросов:
FCGI, /usr/sbin/ab -n2000 -c25 localhost/
Failed requests: 718
Requests per second: 500.37
Transfer rate: 1112.56 [Kbytes/sec] receivedCherryPy/3.0.1 /usr/sbin/ab -n2000 -c25 localhost:8080/
Requests per second: 664.86
Transfer rate: 1163.18 [Kbytes/sec] receivedSCGI, /usr/sbin/ab -n2000 -c25 localhost/static/
Requests per second: 716.10
Transfer rate: 1596.89 [Kbytes/sec] receivedlighttpd static, /usr/sbin/ab -n2000 -c25 localhost/static/
Requests per second: 3643.83
Transfer rate: 9311.81 [Kbytes/sec] received
PS: из результатов не понял что есть failed connection при использвоании FCGI, возможно это баг ab, возможно таки fascgi при нагрузке захлёбывался (аналогичное было при scgi, когда я не делал редирект stderr с консоли в /dev/null), хотя при попытках загрузки страницы браузером всё было ок, по результатам ab 40% запросов вернули ошибки... От cherry не ожидал такой скорости (при этом я не делал редирект коннектов в /dev/null, а stdio неплохо тормозит работу программы...), scgi выиграл только при значительной нагрузке, думаю при кластеризацие цифра будет ещё больше. ЗЫ: для проектов, с большой нагрузкой - fcgi в топку, из недостатоков scgi отмечу лишь "сложность" запуска, софтину надо запускать как демон, при этом прописать bin-path как в mod_fcgi (чтоб сервер сам это делал при старте) - не вышло.