elb/apache 服务器延迟

elb/apache 服务器延迟

我在 AWS 的 ELB 后面的 m4.larges 上运行 Apache/2.4.7。我的流量绝大多数都是来自简单客户端的一次性请求,而不是网页。配置很旧,经过时间考验,但两周前我将部署迁移到 VPC,对 Apache 配置、ELB 配置或应用程序本身没有进行实质性更改。

从那时起,我在 Apache 和 ELB 级别遇到了一些问题。

1) 延迟出现周期性峰值——有时甚至会导致 ELB 删除“不健康主机”。ELB 延迟图通常约为 20 毫秒,但会在一两分钟内飙升至 5 秒或更长时间。激增队列长度和 504 都出现了。

2)每个服务器上都有一个监控进程,每分钟请求一次服务器状态页面(仅向本地主机公开);大约每十五分钟,对服务器状态页面的简单请求就会超时(读取超时为 0.5 秒,但对于这样一个简单的请求来说,这似乎已经足够了)。

3) 记分板中充满了保持活动,写入速度非常快。上述某个超时时间附近的记分板示例:

400 requests currently being processed, 0 idle workers

KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKWKKKKKKKKKKK
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
KKKKKKKKKKWKKKKKKKKKKKKKKKKKKKKKKKKKWKKKKKKKKKKKKKKKKKKKKKKKKKKK
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
KKKKKKKK

4) tomcat 的 RUNNABLE 线程也会出现峰值,并且会一直传播到数据库层。

尽管 (2) 影响是最小的,但也许是最让我担心的 —— Apache 竟然无法处理未进入应用程序的自身状态请求,这似乎很疯狂。

经过所有这些,硬件相对来说没有那么紧张——网络服务器上的 CPU 使用率很少超过 50%。在我看来,这是一个与线程相关的配置问题,但配置基本保持不变——这让我不知所措。

相关配置:

ELB(SSL 终止的地方)的空闲超时为 60 秒。

每个 Apache 的配置大致如下:

Timeout 600
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 60

我使用 mpm_worker 模块:

StartServers             2
MinSpareThreads      100
MaxSpareThreads      300
ThreadLimit          64
ThreadsPerChild      50
MaxRequestWorkers     400
MaxConnectionsPerChild   0

tomcat servlet 通过 AJP 转发,每个 servlet 都监听 300 个线程,并最多补充 300 个 db 连接。

这个设置到底是什么导致了我的问题?

相关内容