Linux内核:传出networking数据包停滞?

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也logging了一切都很好,很快。

CPU备份期间显示40%的I / O等待,40%的用户有10%的空闲。

磁盘读取操作在那个时候达到峰值,但是磁盘读取时间并没有太多上升。

我在备份期间对httpd进程运行strace,并且幸运地捕获了一个这样的失败的监视器探测器的踪迹。 奇怪的是,跟踪显示请求已经在大约1.3秒内完成了…但是客户端在等待它的30秒内从未收到响应数据。

在这个探测过程中,我并没有使用tcpdump,但是之前做过,并且确实注意到,系统只需要10秒,20秒和更多秒就可以发送数据包,而apache会logging下它的响应。

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, 

我的问题是如何进一步debugging呢? 响应卡在哪里? 更多的vCPU可能是这个系统需要处理I / O操作增加的原因吗? 这是I / O操作的问题?

另外,当客户端从未收到数据并最终主动closuresTCP连接时,apache如何以200个状态码完成日志logging? 事实可能并非如此。 可能是Apache根本没有login请求。

你可能希望看看网卡上的环形缓冲区。 由于您正在进行networking备份,因此可能会产生影响。 以下是RH知识库中的一篇文章: 当我看到我的networking接口丢弃数据包时,首先尝试的是什么 。

总结文档:多次丢包是由于networking缓冲区已满,通常是接收缓冲区。 使用ifconfig检查有问题的接口,看看数据包是否被丢弃。 如果他们考虑使用ethtool增加环形缓冲区的大小。

此外,由于您将系统作为访客虚拟机运行,请将您的IO计划程序更改为“noop”。 这是运行虚拟客户时使用的最佳调度程序。 noop调度程序不会尝试优先考虑IO操作,这也降低了CPU开销。 通常这会导致一些拥塞,但是在这种情况下,IO调度将更好地交给pipe理程序,从而更适合为所有客户安排IO操作。