Проблема я имела
У меня была проблема, когда некоторые сайты занимали много времени для загрузки ( "Долгое время" я имею в виду до 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
Чтобы попытаться устранить то, что происходит, я написал небольшую script, которая печатает использование памяти на сервере приложений.
Пример распечатки с анонимными доменами сайта:
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;
}
}
Как вы можете видеть, есть большая часть памяти, которая меняет местами, поэтому, чтобы исправить мои проблемы, я обновил ram на сервере приложений, что полностью устранило медлительность сайтов. Несмотря на то, что я смог решить проблему, мне потребовалось гораздо больше времени, чем хотелось бы, и я все еще чувствую, что, по сути, я догадываюсь о том, что заставляет сайт медлительность. Все это приводит меня к моим вопросам...
Вопросы
- Как вы можете сказать, что медленность сайта на сайте с низким трафиком не вызвана неактивностью сайта, которая приводит к тому, что сайт становится неактивным, что заставляет Gunicorn снова загружать сайт после того, как сайт неактивен? Есть ли параметр, запрещающий запуск сайта неактивным?
- Кажется, у меня есть сайты, которые занимают слишком много памяти. Какие инструменты я могу использовать для уменьшения объема памяти, которую использует сайт? Должен ли я использовать некоторые инструменты профилирования Python?
- Каковы некоторые инструменты и шаги для определения того, на каком уровне в стеке возникает узкое место?
- Каков наилучший способ определить, будут ли выполняться ваши процессы Gunicorn, если они заменяются другими процессами?
- Большинство сайтов, на которых я размещаю, не получают тонны трафика, поэтому я использую только одного сотрудника Gunicorn. Есть ли более научный способ определения и корректировки количества работников Gunicorn у вас на сайте?
- При размещении нескольких сайтов на одном и том же сервере существуют ли способы настройки содержимого для использования меньше памяти?