Производительность django + lighttpd + fcgi

Я использую Django для обработки довольно длинных HTTP-запросов, и мне интересно, есть ли у моей настройки некоторые ограничения, когда я получал много запросов одновременно.

lighttpd.conf fcgi:

fastcgi.server = (
  "a.fcgi" => (
    "main" => (
      # Use host / port instead of socket for TCP fastcgi
      "host" => "127.0.0.1",
      "port" => 3033,
      "check-local" => "disable",
      "allow-x-send-file" => "enable"
  ))
)

Раздел запуска скрипта Django init.d:

start-stop-daemon --start --quiet \
  --pidfile /var/www/tmp/a.pid \
  --chuid www-data --exec /usr/bin/env -- python \
  /var/www/a/manage.py runfcgi \
  host=127.0.0.1 port=3033 pidfile=/var/www/tmp/a.pid

Запуск Django с использованием приведенного выше сценария приводит к созданию многопоточного сервера Django:

www-data   342  7873  0 04:58 ?        00:01:04 python /var/www/a/manage.py runfcgi host=127.0.0.1 port=3033 pidfile=/var/www/tmp/a.pid
www-data   343  7873  0 04:58 ?        00:01:15 python /var/www/a/manage.py runfcgi host=127.0.0.1 port=3033 pidfile=/var/www/tmp/a.pid
www-data   378  7873  0 Feb14 ?        00:04:45 python /var/www/a/manage.py runfcgi host=127.0.0.1 port=3033 pidfile=/var/www/tmp/a.pid
www-data   382  7873  0 Feb12 ?        00:14:53 python /var/www/a/manage.py runfcgi host=127.0.0.1 port=3033 pidfile=/var/www/tmp/a.pid
www-data   386  7873  0 Feb12 ?        00:12:49 python /var/www/a/manage.py runfcgi host=127.0.0.1 port=3033 pidfile=/var/www/tmp/a.pid
www-data  7873     1  0 Feb12 ?        00:00:24 python /var/www/a/manage.py runfcgi host=127.0.0.1 port=3033 pidfile=/var/www/tmp/a.pid

В журнале lighttpd error.log я вижу load = 10, который показывает, что я получаю много запросов одновременно, это происходит несколько раз в день:

2010-02-16 05:17:17: (mod_fastcgi.c.2979) got proc: pid: 0 socket: tcp:127.0.0.1:3033 load: 10

Правильна ли моя настройка для одновременной обработки множества длинных HTTP-запросов (каждый может длиться несколько минут)?


person Laurent Luce    schedule 16.02.2010    source источник


Ответы (1)


Я думаю, вы можете настроить своего воркера fastcgi для работы в многопроцессорном или многопоточном режиме.

От 1_:

method=IMPL          prefork or threaded (default prefork)
[...]
maxspare=NUMBER      max number of spare processes / threads
minspare=NUMBER      min number of spare processes / threads.
maxchildren=NUMBER   hard limit number of processes / threads

Итак, ваша команда запуска будет:

start-stop-daemon --start --quiet \
  --pidfile /var/www/tmp/a.pid \
  --chuid www-data --exec /usr/bin/env -- python \
  /var/www/a/manage.py runfcgi \
  host=127.0.0.1 port=3033 pidfile=/var/www/tmp/a.pid \
  method=prefork maxspare=4 minspare=4 maxchildren=8

При необходимости вы захотите отрегулировать количество процессов. Обратите внимание, что чем больше у вас процессов FCGI, тем линейно увеличивается использование памяти. Кроме того, если ваши процессы привязаны к ЦП, наличие большего количества процессов, чем количество доступных ядер ЦП, не очень поможет для параллелизма.

person Crast    schedule 16.02.2010