我们有一个 Web 服务器,它使用 curl 向自身发出大量 http(实际上是 https)请求。(这是因为我们在同一台服务器上运行多个网站,并且它们使用彼此的 API。)
我们发现,当有大量其他网络流量流向服务器时(尤其是当我们正在下载大型文件时,但由于数据库复制或其他原因,这种情况也可能发生在网络流量激增期间),这些请求偶尔会被丢弃;我们的请求会立即失败(IE 在 0 秒内),没有返回任何响应。(没有 http 代码,什么都没有。)
虽然这些故障与网络流量激增有关,但此时的流量水平似乎仍然只有 60Mb/s 左右;这比我们的基准水平高得多,但应该远低于网络接口可以处理的水平。而且由于失败的请求来自和发往同一台服务器,因此似乎不应该涉及任何其他网络设备。
失败的请求不会出现在 Apache domlogs 或错误日志中,因此它们在到达 Apache 之前就被丢弃了。
我们还测试了不同服务器上的发送端和接收端,并确认问题出在接收端,与接收服务器的高网络带宽使用有关。因此,我们怀疑失败的不仅仅是我们内部发出的这些请求。有可能,而且我认为很有可能,服务器也会间歇性地丢弃其他传入请求,但由于我们没有发出这些请求,所以我们无法知道。
理想情况下,寻找这些请求为何会立即失败的可能解释。在高网络负载下,某些请求立即被丢弃而不是仅仅被延迟,这正常吗?并且考虑到我们正在向同一服务器上的另一个域发出 curl 请求,在这种情况下是否有任何流量需要离开服务器?(即瓶颈是否可能在其他地方?)DNS 应该被缓存,因此服务器基本上将向其自己的外部 IP 地址发出 http 请求。我认为 NIC 会参与其中,但我对网络的理解非常基础。某种 TCP/IP 限制?这不是连接限制,因为它是由单个高带宽传输触发的,而不是大量单独的连接。更一般地说,考虑到它早于 Apache,它可能达到的限制是什么?
该服务器运行 CentOS 7.6 和 Apache 2.4。