我有一个应用程序服务器,它只向上游服务发送请求,等待,然后用从上游服务接收的数据响应客户端。微服务需要X
ms 来响应,有时也需要Y
ms,where X<<Y
。客户端响应时间(在稳定状态下)基本上等于上游微服务处理请求所花费的时间——任何额外的延迟都可以忽略不计,因为客户端、应用程序服务器和上游微服务都位于同一个数据中心,并通过具有非常大网络带宽的私有 IP 进行通信。
当客户端开始以 0 的速率发送请求时N
,应用程序服务器会变得过载,并且响应时间会随着服务器变得不稳定而急剧增加。客户端和微服务的 CPU 使用率最低,应用服务器的 CPU 使用率最高。(应用服务器的裸机比其他两个服务要弱得多——这是一个测试环境,用于监控应用服务器在压力下的行为。)
直观地说,无论微服务响应需要多长时间,我都希望N
得到相同的值,但我发现当微服务花费 ms 时,稳定状态下的最大吞吐量明显低于Y
仅花费X
ms 时。发生这种情况时使用的临时端口的数量也大大低于限制。由于读取和写入的数量相同,内存使用量相同,我无法弄清楚为什么N
是微服务执行时间的一个因素。此外,不,无论执行时间如何,服务的输入/输出都是相同的,因此写入的字节数是相同的。由于唯一的区别是执行时间,它只需要在响应需要一段时间时使用更多的 TCP 连接,我不确定为什么最大吞吐量会受到影响?据我了解,一旦建立 TCP 连接,其成本可以忽略不计。
我错过了什么吗?
谢谢,
额外细节:
这些服务使用带有 keepalive 的 HTTP/1.1,没有流水线。还应该提到我正在使用 IO-Thread 模型。如果我每个请求都使用一个线程,我可以理解这种行为,但是每个核心只有一个线程,这很令人困惑。