Назад | Перейти на главную страницу

Диагностика медленного веб-приложения / веб-приложения с задержкой

Я вижу среднее время загрузки load average: 12.41, 11.94, 11.59 на машине под управлением Linux, обслуживающей веб-приложение. У него 16 ядер, поэтому средняя нагрузка не слишком высока.

Однако это веб-приложение часто отключается, когда я пытаюсь подключиться к нему в данный момент. Что может быть причиной этого? Это немного круто.

Загрузка ЦП колеблется в районе ~ 50% для всех ЦП (согласно top). Ценности для wa находятся между 0.0 и 3.0. Память подкачки вообще не используется, и есть тонна свободной памяти.

iostat показывает %iowait значение 0.51. Другая статистика:

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               4.88         1.02      2136.25   12365497 25895371840
sdb               0.00         0.00         0.00       9456          0
sdc               0.95         0.00       452.44       4781 5484405440

Количество операций записи в секунду велико - это приложение с тяжелыми операциями записи. iotop показывает записи, исходящие от pgbouncer процесс (пул соединений postgresql), из очередей асинхронных задач и из рабочих процессов nginx (возможно, запись в журнал доступа). Я не вижу ничего выше 6% в IO> столбец - и большинство строк имеют 0,00%. SWAPIN является 0.00% на протяжении.


Короче говоря, загрузка ЦП не зашкаливает, использование памяти не является проблемой, и нет никаких признаков чрезмерного ожидания, связанного с вводом-выводом. Почему веб-приложение будет бесконечно загружаться / отключаться, когда я пытаюсь получить к нему доступ? Может быть проблема в sysctl.conf или с моим веб-сервером? Здесь нужно экспертное мнение.


Речь идет о сервере Ubuntu 14.04 LTS. Nginx - это веб-сервер, используемый в качестве обратного прокси-сервера с Gunicorn (веб-приложением на основе Django). Серверная часть - это Postgresql 9.3, и Redis тоже в игре. БД находится в отдельной виртуальной машине.

Если вы работаете с большим объемом TCP-соединений и используете обратный прокси, например nginx, вы можете столкнуться с Исчерпание порта TCP. Короче, есть теоретически 65535 портов TCP. Если у вас есть один обратный прокси-сервер, поступающий с IP 192.168.1.1, подключающийся к вашему веб-серверу через порт 80 по адресу 192.168.1.2:80, вы можете сделать теоретическое максимальное количество одновременных подключений через обратный прокси-сервер 65535 к порту 80 в вашей сети. сервер. После этого у вас заканчиваются исходные порты (известные как временные порты) для использования.

Но это немного сложнее: Linux по умолчанию настроен на использование только около 30000 (меньше для старых ядер / дистрибутивов - всего 1024) этих портов, и даже тогда он использует алгоритм, который будет случайным образом пытаться найти бесплатный исходный порт для использования. Чем ближе вы подходите к отметке 30000, тем больше попыток ядро ​​делает для случайного выбора свободного порта и тем больше времени уходит на его поиск. Попробуйте использовать netstat, grep и wc чтобы подсчитать количество подключений, которые у вас есть, и если вы приближаетесь к 30 000, это, вероятно, причина ваших таймаутов. Ты можешь просмотрите предложения NGINX по решению этой проблемы, если это так.