Apache:“服务器似乎很忙”,但有很多空闲进程

Apache:“服务器似乎很忙”,但有很多空闲进程

我应该指出,我不是系统管理员。您很快就会明白这一点。:)

简而言之: Apache 在负载过大时会暂停,所有进程都会处于空闲状态。这是应用程序使用的轮询服务器。轮询来自很多不同端点。如果我观察 top,HTTPD 进程会不时(每 4-5 分钟一次)同时处于空闲状态,导致流量停滞 10 秒左右。然后恢复。延迟是有问题的。

  • 服务器正在处理大量流量。这些是通过 HTTPS 进行的应用程序轮询,而不是网页(尽管我怀疑 Apache 是否知道其中的区别)
  • 上述暂停导致流量不平衡:一段时间后,我收到一大堆流量,然后是平静期,然后又是一大堆流量
  • 每次投票都需要进行少量数据库查询

Apache 日志

有时,但并非总是如此(主要是在重启后),我会在 error_log 中收到这些消息。大多数情况下,当这种情况发生时,我在 error_log 中看不到任何内容。

[2014 年 6 月 30 日星期一 17:55:17] [信息] 服务器看起来很忙(您可能需要增加 StartServers 或 Min/MaxSpareServers),生成 8 个子进程,有 31 个空闲,总共 98 个子进程
[2014 年 6 月 30 日星期一 17:55:18] [信息] 服务器看起来很忙(您可能需要增加 StartServers 或 Min/MaxSpareServers),生成 16 个子进程,其中有 14 个处于空闲状态,总共有 98 个子进程
[2014 年 6 月 30 日星期一 17:55:44] [信息] 服务器看起来很忙(您可能需要增加 StartServers 或 Min/MaxSpareServers),生成 8 个子进程,有 74 个空闲,总共 99 个子进程
[2014 年 6 月 30 日星期一 17:55:54] [信息] 服务器看起来很忙(您可能需要增加 StartServers 或 Min/MaxSpareServers),生成 8 个子进程,有 61 个空闲,总共 99 个子进程
[2014 年 6 月 30 日星期一 17:56:00] [信息] 服务器看起来很忙(您可能需要增加 StartServers 或 Min/MaxSpareServers),生成 8 个子进程,有 0 个空闲,总共 97 个子进程
[2014 年 6 月 30 日星期一 17:56:02] [信息] 服务器看起来很忙(您可能需要增加 StartServers 或 Min/MaxSpareServers),生成 16 个子进程,其中有 36 个处于空闲状态,总共有 99 个子进程
[2014 年 6 月 30 日星期一 17:56:03] [信息] 服务器看起来很忙(您可能需要增加 StartServers 或 Min/MaxSpareServers),生成 32 个子进程,其中有 39 个处于空闲状态,总共有 99 个子进程
[2014 年 6 月 30 日星期一 18:08:17] [信息] 服务器看起来很忙(您可能需要增加 StartServers 或 Min/MaxSpareServers),生成 8 个子进程,有 18 个空闲,总共 99 个子进程
[2014 年 6 月 30 日星期一 18:08:18] [信息] 服务器看起来很忙(您可能需要增加 StartServers 或 Min/MaxSpareServers),生成 16 个子进程,其中有 63 个处于空闲状态,总共有 98 个子进程
[2014 年 6 月 30 日星期一 18:08:19] [信息] 服务器看起来很忙(您可能需要增加 StartServers 或 Min/MaxSpareServers),生成 32 个子进程,其中有 74 个处于空闲状态,总共有 97 个子进程

Apache 配置(旧配置已注释掉)

仅显示我怀疑相关的配置项

#超时 60
超时 20
启用 KeepAlive
最大KeepAliveRequests 1000
KeepAliveTimeout 2

IfModule prefork.c
        启动服务器 85
        最小备用服务器 85
        最大备用服务器数 100
        服务器限制 100
        最大客户数 100
        #启动服务器 60
        #MinSpareServers 60
        #MaxSpareServers 85
        #服务器限制 85
        #MaxClients 85
        每个子项的最大请求数 1000
/IfModule

请注意,新旧配置在行为上没有区别。

环境 EC2、c1.medium、mod_perl、持久数据库连接、单独的 RDS 服务器、MySQL 错误日志中未显示任何错误,Apache 日志中也未显示任何错误

顺便说一句,我看到过安装 mod-status 的建议,但我还没有弄清楚如何安装,而且如果安装了的话我也不知道要寻找什么。

答案1

谜团已揭开。

以防其他人也遇到这种情况:Apache 和数据库服务器之间的网络连接(通过 LAN 接口在 VPC 内)变得拥塞。将数据库服务器升级到更大的实例可以解决该问题(暂时)。

背景:Amazon 每 5 分钟会为您的数据库拍摄一次快照,以实现其时间点恢复功能。它会下载 RDS 实例上的二进制日志来执行此操作。

每 5 分钟,二进制日志就会被传输一次(大概是传输到另一个 EBS),而在我的例子中,该传输会堵塞 LAN 接口。Apache 每隔五分钟就会等待网络连接,并且连接会堆积起来,最终导致某些连接中止。

答案2

我将 MaxClients 设置提高到大约 200...

.另外,我很好奇为什么最小和最大备用服务器数量这么高。我可能会将 MinSpareServers 设置为 20 左右,将 MaxSpareServers 设置为 30 左右。这些是剩余的基本空闲进程数,apache 将根据需要创建更多进程,直至达到 MaxClients 设置,并随着需求减少而减少备用进程数。

最后,为什么最初要创建这么多初始服务器?我建议先将 StartServers 设置为大约 50 个。

答案3

我遇到了同样的问题,结果发现这是由于 RDS 实例规模过小造成的。CPU 和内存始终低于 15%,所以直到读到 OP 的回答后我才开始升级它。

将 RDS 实例从 t2.micro 更改为 t2.medium 解决了我的问题。

排除故障确实非常困难,因为从实例统计数据来看不是那么明显,我唯一能注意到的是输入和输出带宽图上的小峰值。

相关内容