我正在运行一个 Web 服务器(Apache,但我认为两者并没有什么区别),它向移动设备提供大量请求(每秒数百个)。该服务器是纯 Web 服务器和 J2EE 应用服务器的前端服务器的混合体(通过 AJP 之类的东西进行连接)。
我注意到,我必须定期增加 Apache 工作进程的数量才能满足请求量。当瓶颈开始出现时,我看到大量 (~90%) 工作进程忙于“写入客户端”和“关闭连接”。
我理解这是正常的。考虑到客户端处于较慢的链接上,它将阻止 Apache 工作进程,直到工作进程能够处理单个客户端请求为止。但我想知道是否有专用的系统、硬件或软件可以缓冲请求和响应的流量。我听说过所有这些“流量加速”硬件,但我真的不知道从哪里开始寻找可以做到这一点的硬件。
谢谢你!
答案1
既然您提到了硬件,那么您可能想看看 F5 的 BigIP 之类的东西,它可以在这种情况下发挥巨大作用。它将终止那些移动(和其他)客户端连接,缓冲内容,并优化后端流程。不过,它很贵。
移动客户端的另一个问题是,它们经常会因为信号强度不理想(而不是链路拥塞)而丢失数据包。这会导致 TCP/IP 堆栈退缩,因此数据速率可能会很糟糕。BigIP 也可以帮助解决这种情况,因此值得研究。
在开源方面,您可以考虑使用 nginx 或其他异步 I/O 代理来前置您的系统,并可能稍微缓冲一下这些连接。这可能是值得尝试的第一步 - 您可以在 nginx 上启用代理缓冲,这样效果就是将连接卸载到 nginx,而不是 apache 及其背后的动态应用程序。
答案2
尝试Keepalive Off
在您的 Apache Vhost 配置中进行设置。
有时,移动连接由服务器代理,服务器会在重写数据包时人为地保持连接打开,以便移动用户比服务器实际确认数据包的速度更快地收到 ACK 数据包。
虽然这很狡猾,但有时移动网络就是很邪恶。