C_and_CPP 板


LINE

我遭遇到一個很奇怪的問題,希望有經驗的人可以給我一點建議。 敝人服務的單位現在有個程式,讓我們叫他 master 好了。 這個 master 會透過 lsf/grid 在內部網路上的其他機器建立 slave 程式執行。 有點像 client/server 架構(根本就是嘛)。 這中間,master 跟 slave 需要交換資料, 交換的資料,我們都是透過 data 檔案的讀寫來完成。 而 master 跟 slave 的同步化,也是透過檔案來完成。 當 master 要告訴 slave 可以開始的時候,就會寫一個特殊的 flag 檔案, 這段時間 slave 就是不斷的 polling 去看那個檔案能不能讀了。 當然 slave 中間每一次會 sleep(1) 以避免 CPU 一直在工作。 當需要接受資料的那一方,發現一個特殊檔案已經存在了, 那表示他需要讀取的檔案已經備妥了,他就會去開啟那個檔案來讀取需要的資料。 以時間軸來畫圖的話大概就是這樣 Master Slave(s) 可能有好幾個 --------------------------------------------------------- 寫資料檔 (polling檢查flag檔案) 寫 flag ↓ (polling) 發現 flag 檔案 ↓ 開啟 data 檔案讀取資料 ↓ (進行計算...) ↓ 寫 data 檔案 ↓ 寫 flag 檔通知 master 發現 flag 檔案 (polling) 開檔,讀取 ↓ (計算) ↓ sync 的時候我們可以說平均每次會浪費掉 0.5 秒在等待, 因為中間的 sync 次數不少,所以累積起來就是一段時間, 為了改善這個部份,所以 sync 的部份就想改成用 socket 來做。 這部分我已經完成了。 果然省掉 pooling 的等待時間,效率就上升了, Master Slave(s) 可能有好幾個 --------------------------------------------------------- 寫資料檔 (block read() 接封包) 送封包 ↓ (polling) 收到封包 (block read() 接封包) 開啟 data 檔案讀取資料 ↓ (進行計算...) ↓ 寫 data 檔案[1] ↓ 送封包 收到封包 (block read() 接封包) 開檔,讀取[2] ↓ (計算) ↓ (只有把用檔案做同步化的地方改成用 socket) 問題是現在遇到一個超奇怪的問題。 當 [1] 的地方,已經把檔案寫好了,而且也 fclose() 關閉檔案了。 在 [2] 的地方,fopen 有拿到東西,不是 NULL,但是當我要讀取的時候,卻什麼也讀不到。 我呼叫 perror(),系統給的錯誤訊息是「No such file or directory.」 問題是我開檔的時候明明開到了! 事情真的很奇怪, 這個現象不是永遠都發生,只有「有時候」發生。 如果我在 [2] 之前 sleep() 一段時間, 那我就可以順利讀取到檔案。 又, 我發現這個現象只有在我的 slave 是透過 system() 啟動的時候才會發生, (因為我要派到那台機器上的 slave 可能有好幾個, 所以會有一個主要的 slave 去用 system("... %") 把其他的叫起來) 我曾經想過是不是沒有 flush() 的關係, 但是 flush() 的也沒用。 我也懷疑過是不是 fork() 導致導致兩個人搶同一個封包, 導致同步失敗,後來想一想根本不會,因為本來的程式碼用的是 system("... %")。 回頭再看看,問題真的很奇怪, fp = fopen(...) ; if (fp) { fread() // 這邊竟然就死了 } 而且竟然只要等久一點,這邊就會過, 是不是我哪邊觀念有不對,或是忽略了什麼東西? 我想了兩天已經想破頭了,但是還是想不到原因。 有沒有人有類似的經驗,或是有任何建議, 任何建議都是受到歡迎的,因為我真的想不到啦 O_Q 如果我有哪邊描述的不夠清楚,也請告訴我。 謝謝。 我的 OS: 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:56:44 EST 2007 x86_64 x86_64 x86_64 GNU/Linux Compiler: gcc version 3.4.6 20060404 (Red Hat 3.4.6-9) PS. 大概有的人會問:你為什麼不把傳資料的部份改成用 socket? 1. 因為已經有很多既有的程式碼,傳送資料的部份太多了, 同步化的程式碼被封裝起來,只需要改很少地方。 2. 交換的資料量大約是 100~200 MB, 實際存取需要的時間大概是 1~2 秒, 但是整個程式的執行時間超過十分鐘, 所以修改這邊不符合效益。 -- To iterate is human, to recurse, divine. 遞迴只應天上有, 凡人該當用迴圈.   L. Peter Deutsch --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.160.254.105 yoco315:轉錄至看板 LinuxDev 04/13 14:27 yoco315:轉錄至看板 Programming 04/13 14:27
1F:推 ledia:沒什麼概念.... 有沒有類似 sync(2) 的東西可用 04/13 14:45
2F:推 sunneo:也許把開檔屬性改成共享或者用mutex包起來看看? 04/13 15:19
3F:→ sunneo:可以觀察看看在fopen後 寫入前 會不會檔案已經出現了 04/13 15:21
4F:推 richardhesid:你是用nfs共享檔案的吧。nfs的server端是在master上 04/13 16:03
5F:→ richardhesid:還是在slave上? 04/13 16:04
6F:→ yoco315:對對!!是nfs共享檔案!用來sync的檔案是在master上面 04/13 16:13
7F:→ yoco315:也就是說slave要透過nfs去寫在master機器上面.. 04/13 16:13
8F:推 richardhesid:會不會是因為網路延遲的問題? 04/13 16:18
9F:→ yoco315:有可能?我以為透過nfs寫檔案關檔都會動作做完才return 04/13 16:23
10F:→ yoco315:我這方面不太懂 orz 不知道有沒有api可以force nfs sync的 04/13 16:24
11F:推 richardhesid:不竟然吧,你用的是NFSv2還是NFSv3 ? 04/13 16:38
12F:推 richardhesid:你在client中打開server上的文件是是否有使用O_SYNC 04/13 16:46
13F:推 richardhesid:O_SYNC能夠保證server在wirte返回之前把所有數據都 04/13 16:49
14F:→ richardhesid:寫到disk上。 04/13 16:49
15F:→ richardhesid:可能你的master在讀檔案的時候,數據還在cache上 04/13 16:50
16F:推 richardhesid:還不行的話,看看/usr/sbin/exportfs -v 04/13 17:09
17F:→ richardhesid:是否有async,如果有把它改為sync 04/13 17:10
18F:推 cobrasgo:不要用system吧,改用popen試試,我猜是system()造成的 04/18 11:47







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP