У меня есть сервер приложений, который ничего не делает, кроме отправки запросов в вышестоящий сервис, ожидания, а затем ответа клиенту данными, полученными из вышестоящего сервиса. Микросервису для ответа требуется X
мс, а иногда Y
мс, где X<<Y
. Время отклика клиента (в устойчивом состоянии) по существу равно количеству времени, которое микросервис восходящего потока обрабатывает запрос - любая дополнительная задержка незначительна, так как клиент, сервер приложений и микросервис восходящего потока расположены в одном центре данных, и обмениваться данными по частным IP-адресам с очень большой пропускной способностью сети.
Когда клиент начинает отправлять запросы со скоростью N
, сервер приложений перегружается и время отклика резко возрастает, поскольку сервер становится неустойчивым. Клиент и микросервис имеют минимальную загрузку ЦП, а сервер приложений использует максимальную загрузку ЦП. (Сервер приложений работает намного слабее, чем другие две службы - это среда тестирования, используемая для мониторинга поведения сервера приложений в условиях стресса.)
Интуитивно, я бы ожидал, что N
будет таким же значение, независимо от того, сколько времени требуется микросервису для ответа, но я обнаружил, что максимальная пропускная способность в устойчивом состоянии значительно меньше, когда микросервис занимает Y
мс, тогда как когда он занимает только X
мс. Количество используемых эфемерных портов, когда это происходит, также значительно меньше предела. Поскольку количество выполняемых операций чтения и записи одинаково, а использование памяти одинаково, я не могу понять, почему N
является фактором времени выполнения микросервиса. Кроме того, нет, ввод / вывод сервисов одинаков независимо от времени выполнения, поэтому количество записываемых байтов одинаково независимо. Поскольку единственное отличие - это время выполнения, которое требует использования большего количества TCP-соединений, когда ответы занимают некоторое время, я не уверен, почему это влияет на максимальную пропускную способность? Насколько я понимаю, стоимость TCP-соединения ничтожна после того, как оно уже установлено.
Я что-то упустил?
Спасибо,
Дополнительные сведения:
Службы используют HTTP / 1.1 с поддержкой активности, без конвейерной передачи. Также должен был упомянуть, что я использую модель IO-Thread. Если бы я использовал поток для запроса, я мог бы понять это поведение, но только с потоком на ядро это сбивает с толку.