У меня есть сервер Apache, на котором размещено несколько json API.
Этот сервер работает под управлением Ubuntu 16.04.4 LTS с Apache и Mysql.
Время отклика у всех API очень хорошее, кроме одного! Для получения ответа json от конкретного API требуется около 5 секунд, тогда как для других API требуется миллисекунды.
Я безуспешно проверил несколько вещей:
1) SQL-запросы выполнялись почти мгновенно (с кешем и без - я пробовал оба)
2) наш разработчик добавил настраиваемый заголовок, чтобы узнать, сколько времени требуется API для генерации ответа json: 2-3 мс
3) вызов API с удаленного компьютера или локально на сервере с помощью wget дает тот же результат: получение ответа занимает 5 секунд. Согласно режиму разработчика браузера, 5 секунд тратятся на «ожидание». Гугл Хром говорит: «Ожидание первого байта». Тогда передача данных кажется быстрой в соответствии с режимом разработки (несколько мс)
4) apache, похоже, не перегружен https-запросами, см. Снимок экрана, отображающий страницу состояния сервера Статус сервера
5) доступ к https API осуществляется через несколько брандмауэров, но обратный прокси-сервер отсутствует.
В рамках процесса отладки я попытался улучшить производительность сервера:
Я переместил виртуальную машину на наименее загруженный хост VMware.
Я переместил эту виртуальную машину в хранилище данных на SSD.
Вы хоть представляете, почему Apache так медленно отвечает? Вы знаете, как решить эту проблему?
Спасибо за помощь
Томас
Несколько дней назад я нашел следующую тему: Apache долго не отвечает Эта проблема была похожа на мою, но, похоже, относилась к IPv6. Поскольку IPv6 отключен на моих серверах, я подумал, что это решение не подходит для решения моей проблемы.
В последней отчаянной попытке решить эту проблему я все же попробовал описанное решение: я просто добавил «options single-request-reopen» в /etc/resolv.conf, а затем 5-секундная задержка исчезла.
На данный момент я не совсем понимал, почему этот параметр решает мою проблему с производительностью, поскольку IPv6 отключен на моих серверах.
Кроме того, поиск имени хоста отключен в Apache.
После более тщательного расследования….
1) Этот новый Json API использует Google Firebase для аутентификации, что означает, что для доступа к службам Google требуется разрешение DNS. Я забыл об этом в своем предыдущем расследовании ... Я думал, что DNS здесь не может быть проблемой. Я ошибался.
2) Запросы IPv6 на сервере только IPv4
Обычно сервер Linux полагается на getaddrinfo для разрешения DNS. Согласно странице руководства (gai.conf, который является файлом конфигурации getaddrinfo):
«Вызов getaddrinfo (3) может вернуть несколько ответов. Согласно RFC 3484 эти ответы должны быть отсортированы так, чтобы ответ с наибольшей вероятностью успеха был первым в списке. RFC предоставляет алгоритм сортировки ».
Согласно RFC 3484:
«Еще один эффект таблицы политик по умолчанию - предпочтение связи с использованием адресов IPv6 вместо связи с использованием адресов IPv4»,
Вернуться к «повторному открытию по одному запросу»:
«Резольвер использует один и тот же сокет для запросов A и AAAA. Некоторое оборудование по ошибке отправляет только один ответ. Когда это произойдет, клиентская система будет ждать второго ответа. Включение этой опции изменяет это поведение так, что если два запроса от одного и того же порта обрабатываются некорректно, он закроет сокет и откроет новый перед отправкой второго запроса ».
Я думаю, что мой сервер ждал второго ответа… который занял 5 секунд. «Повторное открытие с одним запросом» позволило мне обойти эту проблему.
3) Приоритет DNS-запросов IPv4:
Я также изменил поведение getaddinfo, чтобы обеспечить предпочтение связи IPv4, см. /Etc/gai.conf
# For sites which prefer IPv4 connections change the last line to
#
precedence ::ffff:0:0/96 100
Томас