我正在研究批处理系统(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"
编辑:这些实际上是单独的运行,但输出始终完全相同。
答案 0 :(得分:1)
由于这似乎是套接字接收端的超时,您可以尝试在发送端设置TCP_NODELAY
套接字选项。
答案 1 :(得分:0)
我不确定,但似乎有一些相关的here。显然,
这是一个长期存在的错误报道 经常但到目前为止没有人 跟踪它。这主要是因为 大多数人无法真正重现 它
与耗尽资源相关的东西,触发传递给用户空间的信号(应该在内核级别捕获)。
这可能与superuser.com有关,但这是我最好的提示:
另见here
答案 2 :(得分:0)
您是否正在检查read
的返回值?你应该。如果失败,请检查errno
。如果是EINTR
,则需要重试读取。 (或者,如果它是lorenzog's answer中链接中的一个值。
write
也是如此,请检查返回值和errno
。
您还应该检查短读/写并处理这种情况。 (即,获得的字节数比预期的少。)