ESX VM:2 个 vCPU。RedHat Ent 5.6。Apache 2.2.3/python cgi 和 J2EE 应用程序。
我们有一个监视脚本,每分钟从这个 Apache 中提取一个页面,该页面调用一个简单的 python cgi 脚本,使用 curl,最大时间设置为 30 秒。
每天上午 9 点,NetBackup 软件就会启动,这会增加系统的 CPU 和 I/O 负载大约 20 分钟左右......监视器经常会出现故障,说 30 秒内没有得到任何东西,大概每隔一天左右......
我想弄清楚到底问题是什么......
Apache 记录请求处理良好。调用的 cgi python 也记录一切顺利且快速。
备份期间的 CPU 显示 40% I/O 等待、40% 用户、10% 空闲。
磁盘读取操作在那时确实达到峰值,但是磁盘读取时间并没有增加太多。
在备份期间,我对 httpd 进程运行 strace,幸运地捕获了一次此类失败的监控探测的踪迹。奇怪的是,踪迹显示请求在大约 1.3 秒内完成...但客户端在等待的 30 秒内从未收到响应数据。
我在这次 straced 探测期间没有进行 tcpdump,但之前进行过,并且确实注意到系统只需 10、20 秒甚至更多的时间来发送数据包,而 apache 会记录它已完成响应。
strace 看起来像这样:
28259 09:25:01.617226 accept(6, {sa_family=AF_INET, sin_port=htons(34106), sin_addr=inet_addr("192.168.151.84")}, [17179869200]) = 24 <0.000045>
...
18130 09:25:01.670991 execve("/var/path/to/script.py",
...
28259 09:25:01.661924 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x2b8bf4a3c3d0) = 18130 <0.003602>
...
18130 09:25:02.965223 write(1, "content-type: text/html\n\n1001 Missing Required Parameter \r\n", 88) = 88 <0.000084>
28259 09:25:02.965408 <... epoll_wait resumed> {{EPOLLIN, {u32=261317976, u64=47880556733784}}}, 2, 300000) = 1 <1.297266>
18130 09:25:02.966161 exit_group(0) = ?
28259 09:25:02.966299 read(29, "content-type: text/html\n\n1001 Missing Required Parameter \r\n", 8000) = 88 <0.002616>
28259 09:25:02.969791 epoll_wait(27,
我的问题是如何进一步调试?响应卡在哪里?该系统是否需要更多 vCPU 来应对 I/O 操作的增加?这是 I/O 操作问题吗?
另外,当客户端从未收到数据并最终主动关闭 TCP 连接时,apache 如何记录以 200 状态代码完成的请求?
实际上可能并非如此。可能是 Apache 根本没有记录该请求。
答案1
您可能希望查看网卡上的环形缓冲区。由于您正在进行网络备份,因此它可能会产生影响。以下是 RH 知识库中的一篇文章: 当我看到我的网络接口丢弃数据包时,首先要尝试什么。
总结一下文档:很多时候丢包都是因为网络缓冲区已满,通常是接收缓冲区已满。使用 ifconfig 检查相关接口,看看是否丢包。如果是,请考虑使用 ethtool 增加环形缓冲区的大小。
此外,由于您正在将系统作为客户虚拟机运行,请将 IO 调度程序更改为“noop”。这是运行虚拟化客户机时使用的最佳调度程序。noop 调度程序不会费心尝试优先处理其 IO 操作,这也会降低 CPU 开销。通常这可能会导致一些拥塞,但在这种情况下,IO 调度将更好地移交给虚拟机管理程序,从而允许它更适当地为所有客户机调度 IO 操作。