Настройка gunicorn (с Django): Оптимизация для более параллельных соединений и более быстрых соединений

Я использую Django 1.5.3 с gunicorn 18.0 и lighttpd. Я передаю свой статический и динамический контент, используя lighttpd:

$HTTP["host"] == "www.mydomain.com" {
    $HTTP["url"] !~ "^/media/|^/static/|^/apple-touch-icon(.*)$|^/favicon(.*)$|^/robots\.txt$" {
            proxy.balance = "hash"
            proxy.server = ( "" => ("myserver" =>
                       ( "host" => "127.0.0.1", "port" => 8013 )
            ))
    }

    $HTTP["url"] =~ "^/media|^/static|^/apple-touch-icon(.*)$|^/favicon(.*)$|^/robots\.txt$" {
            alias.url = (
                    "/media/admin/" => "/var/www/virtualenvs/mydomain/lib/python2.7/site-packages/django/contrib/admin/static/admin/",
                    "/media" => "/var/www/mydomain/mydomain/media",
                    "/static" => "/var/www/mydomain/mydomain/static"
            )
    }

    url.rewrite-once = (
            "^/apple-touch-icon(.*)$" => "/media/img/apple-touch-icon$1",
            "^/favicon(.*)$" => "/media/img/favicon$1",
            "^/robots\.txt$" => "/media/robots.txt"
    )
}

Я уже пытался запустить gunicorn (через supervisord) разными способами, но не могу оптимизировать его лучше, чем он может обрабатывать около 1100 одновременных соединений. В моем проекте мне нужно около 10000-15000 подключений

command = /var/www/virtualenvs/myproject/bin/python /var/www/myproject/manage.py run_gunicorn -b 127.0.0.1:8013 -w 9 -k gevent --preload --settings=myproject.settings
command = /var/www/virtualenvs/myproject/bin/python /var/www/myproject/manage.py run_gunicorn -b 127.0.0.1:8013 -w 10 -k eventlet --worker_connections=1000 --settings=myproject.settings --max-requests=10000
command = /var/www/virtualenvs/myproject/bin/python /var/www/myproject/manage.py run_gunicorn -b 127.0.0.1:8013 -w 20 -k gevent --settings=myproject.settings --max-requests=1000
command = /var/www/virtualenvs/myproject/bin/python /var/www/myproject/manage.py run_gunicorn -b 127.0.0.1:8013 -w 40 --settings=myproject.settings

На том же сервере живут около 10 других проектов, но процессор и оперативная память в порядке, так что это не должно быть проблемой, верно?

Я запустил нагрузочный тест, и вот результаты:нагрузочный тест

Около 1100 соединений мой журнал ошибок lighttpd говорит что-то вроде этого, вот где нагрузочный тест показывает падение соединений:

2013-10-31 14:06:51: (mod_proxy.c.853) write failed: Connection timed out 110
2013-10-31 14:06:51: (mod_proxy.c.939) proxy-server disabled: 127.0.0.1 8013 83
2013-10-31 14:06:51: (mod_proxy.c.1316) no proxy-handler found for: /

... after about one minute
2013-10-31 14:07:02: (mod_proxy.c.1361) proxy - re-enabled: 127.0.0.1 8013

Эти вещи также появляются время от времени:

2013-10-31 14:06:55: (network_linux_sendfile.c.94) writev failed: Connection timed out 600
2013-10-31 14:06:55: (mod_proxy.c.853) write failed: Connection timed out 110
...
2013-10-31 14:06:57: (mod_proxy.c.828) establishing connection failed: Connection timed out
2013-10-31 14:06:57: (mod_proxy.c.939) proxy-server disabled: 127.0.0.1 8013 45

Так как мне настроить gunicorn / lighttpd, чтобы быстрее обслуживать больше соединений? Что я могу оптимизировать? Знаете ли вы другие / лучшие настройки?

Заранее большое спасибо за вашу помощь!

Обновление: немного больше информации о сервере

root @ django ~ # top

top - 15:28:38 up 100 days,  9:56,  1 user,  load average: 0.11, 0.37, 0.76
Tasks: 352 total,   1 running, 351 sleeping,   0 stopped,   0 zombie
Cpu(s): 33.0%us,  1.6%sy,  0.0%ni, 64.2%id,  0.4%wa,  0.0%hi,  0.7%si,  0.0%st
Mem:  32926156k total, 17815984k used, 15110172k free,   342096k buffers
Swap: 23067560k total,        0k used, 23067560k free,  4868036k cached

root @ django ~ # iostat

Linux 2.6.32-5-amd64 (django.myserver.com)   10/31/2013      _x86_64_        (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
      33.00    0.00    2.36    0.40    0.00   64.24

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda             137.76       980.27      2109.21  119567783  257268738
sdb              24.23       983.53      2112.25  119965731  257639874
sdc              24.25       985.79      2110.14  120241256  257382998
md0               0.00         0.00         0.00        400          0
md1               0.00         0.00         0.00        284          6
md2            1051.93        38.93      4203.96    4748629  512773952

root @ django ~ # netstat -an | grep: 80 | wc -l

7129

Настройки ядра:

echo "10152 65535" > /proc/sys/net/ipv4/ip_local_port_range
sysctl -w fs.file-max=128000
sysctl -w net.ipv4.tcp_keepalive_time=300
sysctl -w net.core.somaxconn=250000
sysctl -w net.ipv4.tcp_max_syn_backlog=2500
sysctl -w net.core.netdev_max_backlog=2500
ulimit -n 10240 

0 ответов

Другие вопросы по тегам