Проблема, которая у меня была
У меня возникла проблема, когда некоторые сайты загружались долго (под «долгим временем» я имел в виду до 16 секунд). Иногда они могли полностью истечь по таймауту, что приводило к ошибке Nginx 504. Обычно, когда время ожидания сайта истекало, я мог перезагрузить сайт снова, и он загружался быстро. Сайт, с которым у меня возникли проблемы, получает очень низкий объем трафика. Я тестирую сайт, загружая страницу индекса администратора Django, чтобы попытаться устранить любую медлительность, которая может быть вызвана плохим кодом. Также следует отметить, что этот конкретный сайт использует только администратора Django, потому что это сайт интранет-типа только для персонала.
Настройка хостинга
Все сайты, которые я размещаю, находятся на двух облачных серверах Rackspace. Первый сервер - это мой сервер приложений с 1024 МБ ОЗУ, а второй - мой сервер базы данных с 2048 МБ ОЗУ. Сервер приложений обслуживает каждый сайт с помощью Nginx, который обслуживает все статические файлы и передает все остальное рабочим Django Gunicorn для каждого сайта.
Если посмотреть на загрузку ОЗУ и ЦП серверов баз данных, кажется, что на сервере базы данных все в порядке.
$ free -m
total used free shared buffers cached
Mem: 1999 1597 402 0 200 1007
-/+ buffers/cache: 389 1610
Swap: 4094 0 4094
Top shows a CPU load average of: 0.00, 0.01, 0.05
Чтобы попытаться выяснить, что происходит, я написал небольшой скрипт, который распечатывает использование памяти на сервере приложений.
Пример распечатки с анонимными доменами сайта:
Celery: 23 MB
Gunicorn: 566 MB
Nginx: 8 MB
Redis: 684 KB
Other: 73 MB
total used free shared buffers cached
Mem: 993 906 87 0 19 62
-/+ buffers/cache: 824 169
Swap: 2047 828 1218
Gunicorn memory usage by webste:
site01.example.com 31 MB
site02.example.com 19 MB
site03.example.com 7 MB
site04.example.com 9 MB
site05.example.com 47 MB
site06.example.com 25 MB
site07.example.com 14 MB
site08.example.com 18 MB
site09.example.com 27 MB
site10.example.com 15 MB
site11.example.com 14 MB
site12.example.com 7 MB
site13.example.com 18 MB
site14.example.com 18 MB
site15.example.com 10 MB
site16.example.com 25 MB
site17.example.com 13 MB
site18.example.com 18 MB
site19.example.com 37 MB
site20.example.com 30 MB
site21.example.com 23 MB
site22.example.com 28 MB
site23.example.com 80 MB
site24.example.com 15 MB
site25.example.com 5 MB
Пример файла конфигурации Gunicorn:
pidfile = '/var/run/gunicorn_example.com.pid'
proc_name = 'example.com'
workers = 1
bind = 'unix:/tmp/gunicorn_example.com.sock'
Пример конфигурации Nginx:
upstream example_app_server {
server unix:/tmp/gunicorn_example.com.sock fail_timeout=0;
}
server {
listen 80;
server_name example.com;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
location = /favicon.ico {
return 404;
}
location /static/ {
root /srv/sites/example/;
}
location /media/ {
root /srv/sites/example/;
}
location / {
proxy_pass http://example_app_server;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
}
}
Как видите, много памяти заменяется местами, поэтому для решения своих проблем я обновил оперативную память на сервере приложений, что полностью устранило медлительность сайтов. Несмотря на то, что мне удалось решить проблему, это заняло у меня намного больше времени, чем хотелось бы, и я все еще чувствую, что в основном угадываю, что вызывает медленную работу сайта. Все это подводит меня к моим вопросам ...
Вопросы
- Как узнать, что медленность сайта на сайте с низким трафиком не вызвана его бездействием, которое приводит к тому, что сайт становится неактивным, что затем заставляет Gunicorn снова загружать сайт после того, как сайт стал неактивным? Есть ли настройка, предотвращающая отключение сайта?
- Похоже, у меня есть сайты, которые занимают слишком много памяти. Какие инструменты я могу использовать, чтобы уменьшить объем памяти, используемый сайтом? Стоит ли мне использовать некоторые инструменты профилирования Python?
- Какие инструменты и шаги необходимо предпринять, чтобы определить, на каком уровне стека возникает узкое место?
- Как лучше всего определить, заменяются ли ваши процессы Gunicorn или другие процессы?
- Большинство сайтов, которые я размещаю, не получают большого количества трафика, поэтому я использую только одного работника Gunicorn. Есть ли более научный способ определения и настройки количества рабочих Gunicorn на вашем сайте?
- Есть ли способы настроить использование меньшего объема памяти при размещении нескольких сайтов на одном сервере?