我有一台服务器,它接收大型 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 形式发布。
有人能想到这儿吗?
感谢您的帮助。
麦克·鲁西埃洛