slav0nic's blog

Заметки о python, linux и других занимательных вещах

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к запросов (последовательных)

  1. FCGI, ab -n2000 localhost/
    Requests per second: 564.05

  2. CherryPy/3.0.1 (то что в web.py встроено) ab -n2000 localhost:8080/
    Requests per second: 898.09

  3. SCGI, /usr/sbin/ab -n2000 localhost/
    Document Length: 2104 bytes
    Requests per second: _ 674.35_
    Transfer rate: 1503.80 [Kbytes/sec] received

  4. lighttpd static, /usr/sbin/ab -n2000 localhost/static/
    Document Length: 2455 bytes
    Requests per second: 3053.12

5 конкурирующих запросов:

  1. FCGI, /usr/sbin/ab -n2000 -c5 localhost/
    Failed requests: 741
    Requests per second: 537.87
    Transfer rate: 1196.75 [Kbytes/sec] received

  2. CherryPy/3.0.1, /usr/sbin/ab -n2000 -c5 localhost:8080/
    Failed requests: 3
    Requests per second: 880.78
    Transfer rate: 1540.49 [Kbytes/sec] received

  3. SCGI, sl:/etc/lighttpd# /usr/sbin/ab -n2000 -c5 localhost/
    Requests per second: 764.70
    Transfer rate: 1705.28 [Kbytes/sec] received

  4. lighttpd static, /usr/sbin/ab -n2000 -c5 localhost/static/
    Requests per second: 3301.76
    Transfer rate: 8449.20 [Kbytes/sec] received

25 конкурирующих запросов:

  1. FCGI, /usr/sbin/ab -n2000 -c25 localhost/
    Failed requests: 718
    Requests per second: 500.37
    Transfer rate: 1112.56 [Kbytes/sec] received

  2. CherryPy/3.0.1 /usr/sbin/ab -n2000 -c25 localhost:8080/
    Requests per second: 664.86
    Transfer rate: 1163.18 [Kbytes/sec] received

  3. SCGI, /usr/sbin/ab -n2000 -c25 localhost/static/
    Requests per second: 716.10
    Transfer rate: 1596.89 [Kbytes/sec] received

  4. lighttpd 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 (чтоб сервер сам это делал при старте) - не вышло.

py post on 2008-07-19 02:55:17
Спасибо, интересный расклад сил. У меня FastCGI тоже при тестах с большим количеством одновременных запросов нестабилен. Жаль что CherryPy тоже пару запросов отбросила.

web.py