Оптимизация запросов nginx в секунду
Я пытаюсь оптимизировать одноядерный VGB Digital Ocean VPS для обработки большего количества запросов в секунду. После некоторой настройки (рабочие /gzip и т. Д.) Он обслуживает около 15 запросов в секунду. Мне не с чем сравнивать, но я думаю, что это число может быть выше.
Стек работает так:
VPS -> Docker-контейнер -> nginx (ssl) -> Лак -> nginx -> uwsgi (Django)
Мне известно о том, что это длинная цепочка и что Докер может вызвать некоторые накладные расходы. Тем не менее, почти все запросы могут быть обработаны Varnish.
Вот мои результаты тестов:
ab -kc 100 -n 1000 https://mydomain | grep 'Requests per second'
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Requests per second: 18.87 [#/sec] (mean)
У меня на самом деле 3 вопроса:
- Правильно ли я, что 18,87 запросов в секунду является низким?
- Для простого блогового приложения Varnished Django, что будет адекватным значением (показанием)?
- Я уже применил рекомендуемые настройки (настроенные для моей системы) из этого урока. Что я могу подправить больше и как я могу найти узкие места.
1 ответ
Сначала несколько заметок о Докере. Он не предназначен для запуска нескольких процессов в одном контейнере Docker. Докер не является заменой виртуальной машины. Это просто позволяет запускать процессы изолированно. Итак, схема докера должна быть:
VPS -> docker nginx container -> docker varnish container -> docker django container
Чтобы упростить вашу жизнь с использованием нескольких контейнеров Docker, я бы порекомендовал использовать Docker-compose. Это не идеально, но это отличное начало.
Старый, но все еще принципиально мягкий блог об этом. Обратите внимание, что некоторые предложения больше не актуальны, такие как nsenter
поскольку docker exec
Команда теперь доступна, но большая часть сообщения в блоге все еще верна.
Что касается проблем с производительностью, да, 18 запросов в секунду - это довольно мало. Однако проблема, вероятно, не имеет ничего общего с nginx и, скорее всего, связана с вашим приложением Django и, возможно, с лаком (хотя и очень маловероятно).
Для устранения проблем PA в Django, я бы порекомендовал использовать django-debug-toolbar. Большинство проблем в Django вызваны ненужными запросами SQL. Вы можете легко увидеть их на панели инструментов отладки. Чтобы решить большинство из них вы можете использовать select_related()
а также prefetch_related
, Для более подробного анализа я бы также рекомендовал профилировать ваше приложение. cProfile - отличное начало. Кроме того, некоторые IDE, такие как PyCharm, включают встроенные профилировщики, поэтому довольно легко профилировать ваше приложение, чтобы увидеть, какие функции занимают большую часть времени, а вы можете оптимизировать. Наконец, вы можете использовать сторонние инструменты для профилирования вашего приложения. Даже бесплатная новая учетная запись даст вам совсем немного информации. В качестве альтернативы вы можете использовать opbeat, который является новым крутым ребенком на блоке.