Производительность Django + lighttpd + fcgi - PullRequest
1 голос
/ 16 февраля 2010

Я использую 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-запросов (может длиться несколько минут каждый) одновременно?

1 Ответ

4 голосов
/ 16 февраля 2010

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

С manage.py runfcgi help:

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, тем больше будет использование вашей памяти. Кроме того, если ваши процессы связаны с ЦП, наличие большего количества процессов, чем число доступных ядер ЦП, не сильно поможет параллелизму.

...