2010-09-14 95 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