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

Медленное время отклика apache для json api (решено)

У меня есть сервер 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 осуществляется через несколько брандмауэров, но обратный прокси-сервер отсутствует.

В рамках процесса отладки я попытался улучшить производительность сервера:

Вы хоть представляете, почему 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

Томас