Apache 进程在 EC2/RHEL/Glassfish4 上随机进入高 CPU 状态持续 25 分钟

Apache 进程在 EC2/RHEL/Glassfish4 上随机进入高 CPU 状态持续 25 分钟

我有一台服务器,它接收大型 POST(最多 100,000 个字符)请求,并使用 mod_jk 将它们传回 Glassfish4 应用服务器。这些请求是 POST 请求,内容类型为 application/x-www-form-urlencoded。其中一个参数是在托管网页上准备的大型 XML 文档。我在页面上使用 encodeURIComponent() 对 xml 进行编码,然后将其添加到参数中,然后使用 XmlHttpRequest 发送 POST。

在具有足够资源的 Amazon EC2 机器上使用 RHEL 7。

Free Command:
            total        used        free      shared  buff/cache   available
Mem:        3689604     2564636      712168       16992      412800      946260

ps -aux:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
apache    8276  1.6  1.6 293492 62228 ?        S    14:51   1:08 /usr/sbin/httpd
postfix   8326  0.0  0.1  91168  3868 ?        S    14:59   0:00 pickup -l -t un
apache    8372  0.0  0.1 237408  5896 ?        S    15:05   0:00 /usr/sbin/httpd
apache    8575  0.0  0.1 237504  6160 ?        S    15:24   0:00 /usr/sbin/httpd
apache    8595  6.5  3.3 354720 122936 ?       S    15:26   2:23 /usr/sbin/httpd
apache    8649  6.4  2.8 335576 103624 ?       S    15:32   1:57 /usr/sbin/httpd
apache    8655  7.0  2.9 342236 110316 ?       S    15:32   2:07 /usr/sbin/httpd
apache    8698  0.0  0.1 237400  5600 ?        S    15:37   0:00 /usr/sbin/httpd
apache    8700  0.0  0.1 237404  5512 ?        S    15:37   0:00 /usr/sbin/httpd
apache    8711  0.0  0.1 237408  5912 ?        S    15:41   0:00 /usr/sbin/httpd
apache    8714  0.0  0.1 237404  5384 ?        S    15:46   0:00 /usr/sbin/httpd
root      8716  0.0  0.0      0     0 ?        S    15:48   0:00 [kworker/0:1]
root      8719  0.0  0.0      0     0 ?        R    15:53   0:00 [kworker/0:0]

在低负载下一切运行良好,但是一旦负载适度增加(每秒大约 1 个请求),一些 apache 进程就会跳转到高 CPU,并且 VM CPU 会达到 100%。

我尝试了很多方法——将 apache 从 2.2 升级到 2.4.16、关闭 SSL、在干净的 VM 上重新编译 apache、尝试关闭浏览器上的连接,但问题仍然存在。

我的 mod_status 和 ps -aux 显示了有问题的进程,当我运行 strace 时,我会不断重复以下内容:

read(18, "\6\37\372", 3)                = 3
write(18, "\0224\0\0", 4)               = 4
read(18, "AB\0\3", 4)                   = 4
read(18, "\6\37\372", 3)                = 3
write(18, "\0224\0\0", 4)               = 4
read(18, "AB\0\3", 4)                   = 4
read(18, "\6\37\372", 3)                = 3
write(18, "\0224\0\0", 4)               = 4
read(18, "AB\0\3", 4)                   = 4
read(18, "\6\37\372", 3)                = 3
write(18, "\0224\0\0", 4)               = 4
read(18, "AB\0\3", 4)                   = 4
read(18, "\6\37\372", 3)                = 3
write(18, "\0224\0\0", 4)               = 4
read(18, "AB\0\3", 4)                   = 4
read(18, "\6\37\372", 3)                = 3
write(18, "\0224\0\0", 4)               = 4
read(18, "AB\0\3", 4)                   = 4
read(18, "\6\37\372", 3)                = 3
write(18, "\0224\0\0", 4)               = 4
read(18, "AB\0\3", 4)                   = 4
read(18, "\6\37\372", 3)                = 3
write(18, "\0224\0\0", 4)               = 4
read(18, "AB\0\3", 4)                   = 4

我还没有尝试过的唯一方法是将 XML 文本以不带任何参数的 text/plain 形式发布。

有人能想到这儿吗?

感谢您的帮助。

麦克·鲁西埃洛

相关内容