2010-09-14 69 views
0

我正在处理批处理系统(转矩),现在重要的部分是这样的:当一个交互式作业运行时,提交工具将与执行主办。这在其中一台机器上失败。中断系统调用的奇怪错误,我无法调试

这里是strace的输出:

透过工具:

16:18:36.219925 fcntl(4, F_GETFL)  = 0x2 (flags O_RDWR)                           
16:18:36.219925 read(4, "610.torque1.ics.muni.cz\0\0\0\0\0\0\0\0\0\0"..., 16385) = 1046                    
16:18:36.219925 write(4, "TERM=xterm\0\0\0\0\0\0\220\5\377\377\377\177\0\0\214\303u\310\277\177\0\0\26"..., 80) = 80             
16:18:36.219925 write(4, "\3\34\177\25\4\32"..., 6) = 6                            
16:18:36.219925 write(4, "WINSIZE 46,166,0,0\0\0\0\0\0\0\[email protected]\0\0\0\0\0\0\0"..., 80) = 80                    
16:18:36.219925 write(1, "qsub: job 610.torque1.ics.muni.cz"..., 41qsub: job 610.torque1.ics.muni.cz ready ) = 41 
16:18:36.219925 rt_sigaction(SIGINT, {SIG_IGN}, NULL, 8) = 0 
16:18:36.219925 rt_sigaction(SIGTERM, {SIG_IGN}, NULL, 8) = 0 
16:18:36.219925 rt_sigaction(SIGALRM, {SIG_IGN}, NULL, 8) = 0 
16:18:36.219925 rt_sigaction(SIGTSTP, {SIG_IGN}, NULL, 8) = 0 
16:18:36.219925 clone(Process 20724 attached child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fbfc9a2d770) = 20724 

执行主机部分:

[pid 8778] 15:59:16.371145 getsockopt(3, SOL_SOCKET, SO_ERROR, [4294967296], [4]) = 0                     
[pid 8778] 15:59:16.371145 fcntl(3, F_GETFL) = 0x802 (flags O_RDWR|O_NONBLOCK)                      
[pid 8778] 15:59:16.371145 fcntl(3, F_SETFL, O_RDWR) = 0                            
[pid 8778] 15:59:16.371145 write(3, "609.torque1.ics.muni.cz\0\0\0\0\0\0\0\0\0\0"..., 1046) = 1046                 
[pid 8778] 15:59:16.371145 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)                          
[pid 8778] 15:59:16.375144 read(3, 0x717ae0, 80) = ? ERESTARTSYS (To be restarted)                     
[pid 8778] 15:59:21.367024 --- SIGALRM (Alarm clock) @ 0 (0) ---                          
[pid 8778] 15:59:21.367024 rt_sigreturn(0x8) = -1 EINTR (Interrupted system call)                      
[pid 8778] 15:59:21.367024 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0               
[pid 8778] 15:59:21.367024 write(2, "pbs_mom: LOG_ERROR::Interrupted s" 

编辑:这些其实都是独立运行,但输出始终完全相同。

+0

你打算编辑代码,还是你在做一个行政调查? – atk 2010-09-14 15:08:31

+0

@atk我打算编辑代码(我实际上可以在这里发布,但它只是一些读/写)。我需要修复这个错误。 – 2010-09-14 15:14:36

回答

1

因为这似乎是一个插座recieving侧超时,你可以尝试设置在发送侧的TCP_NODELAY套接字选项。

+0

不幸的是,我不能那样做。超时需要保持原样。即使在网络中断的情况下,系统也需要保持响应。另外我试图摆脱造成执行主机超时的任何事情。 – 2010-09-15 09:37:00

+0

其实非常感谢你把我踢向正确的方向。它实际上是一个链超时。执行主机在等待提交工具时超时,因为提交工具正在等待服务器。我仍然需要找到为什么提交工具正在等待服务器,但是这个秘密已经解决了。 – 2010-09-15 12:15:11

+0

@Let_Me_Be:'TCP_NODELAY'不会摆脱超时 - 它只是确保数据一经写入就在网络上发送。 – caf 2010-09-15 23:29:12

0

我不确定,但似乎有一些相关的东西here。显然,

这是定期报告 但至今没有人 跟踪它一个长期的错误。这主要是因为 大多数人不能真正重现 它。

某些与耗尽资源有关的东西会触发一个传递给userland的信号(应该在内核级捕获)。

这可能与superuser.com,但这里是我最好的提示:

  • 它总是在同一台机器上触发?
  • 如果您更改了整理顺序,会发生什么情况?
  • 如果您尝试使用较小的窗口大小?或更大?

另见here

+0

整理顺序?是的,它总是在机器上触发,只有这一个。重新启动不会改变任何东西,系统会完全更新(Debian Lenny在两边)。感谢您的链接,但修改内核不是我可以轻松完成的事情。 – 2010-09-14 15:18:53

+0

我明白了,我只是说它可能是一些计时问题,即接收端无法应付流量或无法及时关闭足够的TCP端口以获取新数据或打开文件描述符过多等。另外,您是否还有其他补丁? SELinux的? – lorenzog 2010-09-14 17:07:11

0

你检查从read的返回值?你应该。当它失败时,检查errno。如果是EINTR,则需要重试读取。 (或者,如果是在lorenzog's answer中的链接中的一个值。

write同样的事情,检查返回值和errno

您也应该检查短读/写和处理这种情况。(即获得比预期更少的字节)。

+0

检查返回值,这就是为什么在strace输出的末尾写入日志的原因。 Errno未被检查,该软件仅记录系统错误。重试读取不是可能的(这是一个巨大的软件)。我需要摆脱中断。再加上中断本身似乎是由超时引起的(SIGALRM),真正的问题在于读取似乎并不奏效。 – 2010-09-14 16:43:09