系统调用中断的奇怪错误,我无法调试

时间:2010-09-14 14:53:56

标签: c sockets unix

我正在研究批处理系统(Torque),现在重要的部分是:当运行交互式作业时,提交工具将与执行主机通信。其中一台机器出现故障。

这是strace输出:

Sumbit工具:

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\1@\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"

编辑:这些实际上是单独的运行,但输出始终完全相同。

3 个答案:

答案 0 :(得分:1)

由于这似乎是套接字接收端的超时,您可以尝试在发送端设置TCP_NODELAY套接字选项。

答案 1 :(得分:0)

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

  

这是一个长期存在的错误报道   经常但到目前为止没有人   跟踪它。这主要是因为   大多数人无法真正重现   它

与耗尽资源相关的东西,触发传递给用户空间的信号(应该在内核级别捕获)。

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

  • 是否总是在同一台机器上触发?
  • 如果更改完成订单会怎样?
  • 如果您尝试使用较小的窗口大小?还是更大?

另见here

答案 2 :(得分:0)

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

write也是如此,请检查返回值和errno

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