4.5.1 模擬引擎異常結束之問題 模擬引擎異常結束之問題 模擬引擎異常結束之問題 模擬引擎異常結束之問題
在正常運作中,模擬引擎執行完模擬會正常結束執行,使用者可再次進行下 一個模擬工作。但當模擬引擎程式有錯誤或協定模組撰寫不當,會造成模擬引擎 異常結束且未正常釋放佔用的 Linux 系統資源。因有些系統資源只能被一程序使 用,前一次模擬工作未正常釋放這些資源時,將無法再次啟動模擬引擎,導致使 用者無法進行下一次模擬。
以單機模式運行 EstiNet 網路模擬器若模擬引擎發生上述錯誤,使用者可直 接重新啟動電腦。但在雲端系統中的模擬引擎發生錯誤、無法再次正常執行時,
使用者無法如單機模式中可直接介入、取得錯誤資訊並重新啟動機器,該模擬機 器便會進入無法執行模擬的狀態。因此我們需要針對模擬引擎於虛擬機器中異常
55
結束時做相關處理,使虛擬機器可再次正常執行模擬,並通知使用者此模擬子工 作發生錯誤、未正確完成。
模擬引擎異常結束可能是因為使用者在開發協定模組上的問題,開發者一般 希望在程式錯誤時有相關錯誤資訊協助除錯。因此,我們提供使用者模擬引擎異 常結束時產生的 coredump 檔案,方便使用者除錯。
4.5.2 處理方式 處理方式 處理方式 處理方式
Linux 的程序(process)從 main()返回(return)或呼叫 exit()時表示程序正 常結束(terminate normally)。程式開發者可以 atexit()向系統註冊一函式,使該 函式於程序正常結束時會被呼叫。模擬引擎向系統註冊 EstiNet_exit(),使其於模 擬引擎正常結束時清除佔用的系統資源。因此在正常運作下,模擬引擎完成模擬 後會正常釋放其佔用之資源。
在 Linux 中,系統在某些狀況下會送系統信號(signal)給正在執行的程序,
例如子程序(child process)結束時父程序(parent process)會收到 SIGCHLD 信 號。程序收到信號時,會執行信號處理函式(signal handler)。程式開發人員可 在程式以 signal()函式向系統註冊自行定義的信號處理函式。若程式無自行定義 信號處理函式,則會執行系統預設的信號處理函式及預設動作,如結束程序。若 程式自行定義信號處理函式則執行該處理函式。
Linux 中若程序有存取非法記憶體位置、運算錯誤(如除 0)等行為,系統 會傳送系統信號(signal)給程序,並強制中止程序,此時程序為異常結束
(terminate abnormally)。此狀況中 process 不會執行以 atexit()註冊的 function。
因此未修改的模擬引擎在異常結束時不會執行 EstiNet_exit(),即無法正常釋放佔 用資源。
我們為處理此問題,針對多數信號向系統註冊自行定義的信號處理函式。此 信號處理函式的運作如下:
1 以本節後面所述的通知機制通知 GUI。
56
2 執行 EstiNet_exit()釋放資源。
3 將信號處理函式設回系統預設。
4 把收到的信號再丟回給自己以產生 coredump。
需要上述第 3 及 4 兩個步驟,是因為在自行定義信號處理函式的狀況下收到 信號後,會無法產生 coredump 檔案。因此我們在釋放資源後將信號處理函式設 回 系 統 預 設 的 處 理 函 式 , 再 將 同 樣 的 信 號 送 給 模 擬 引 擎 本 身 , 藉 此 產 生 coredump。
如此一來,無論模擬引擎因何種問題收到系統信號而異常結束,皆可正常釋 放資源,便能解決未正常釋放資源而無法再次啟動的問題。
如章節 4.2.5 所述,模擬引擎由環境變數 ESTINET_MODE 得知要運行於單 機模式或雲端模式。在兩種模式中,模擬引擎異常結束時會以不同方式通知使用 者。
單機模式中,模擬引擎會傳送即時訊息(Runtime Message)給 GUI,GUI 會以一視窗顯示模擬引擎的訊息,此訊息內容為模擬引擎收到某個信號後異常結 束、未完成模擬工作。
在雲端模式中,模擬引擎與 GUI 間已無傳送即時訊息之管道,因此無法使 用即時訊息通知 GUI。另外 GUI 可於送出模擬工作後任何時間離開,使用即時 訊息傳送亦不恰當。因此我們改將此資訊存於資料庫中供 GUI 查詢。以下說明 雲端模式中,模擬引擎如何通知使用者異常結束、未正確完成模擬。
模擬引擎因收到系統信號而異常結束時,它會通知 Coordinator 它收到信號 而結束且模擬工作未正常完成。Coordinator 等待模擬引擎結束執行後,將 coredump 檔移至使用者家目錄中相應資料夾,最後通知 Dispatcher 這個子工作未 正常完成、模擬引擎收到哪個信號以及 coredump 的檔名。Dispatcher 將這些資訊 記錄至資料庫中,之後 GUI 可透過 File Manager 查詢相關資訊、下載 core dump 檔。流程如圖 4-5 所示:
57
圖 4-5、模擬引擎異常結束處理
模擬引擎異常結束時,為讓使用者能取得異常結束的資訊以便使用者修正程 式,我們將模擬引擎的 coredump 檔存在使用者家目錄中供使用者取得。
在 Linux 系統中,一般 coredump 會產生在程式所在的目錄。我們透過系統設定 將 coredump 先統一產生於/tmp 目錄中,再由 Coordinator 將 coredump 移到使用 者家目錄中的 file/coredump/目錄。以下說明系統設定。
Linux 系統中以 kernel.core_pattern 系統變數設定 coredump 檔案的產生位置,
因此我們修改此系統變數更改 coredump 的產生位置。但由於 Fedora 預設上使用 ABRT(Automated Bug Reporting Tool)為套件軟體偵錯,而 ABRT 會使用 kernel.core_pattern。由於我們需修改此變數且並不特別需要 ABRT 之功能,用以 下指令關閉 ABRT:
chkconfig abrtd off service abrtd stop
58
我們用 sysctl 修改 kernel.core_pattern 變數的值:
Linux 系統中另有一設置會影響程序異常結束時是否產生 coredump,此設置 以檔案大小限制產生出的 coredump。若 coredump 檔案大小超過它的限制,就不 會產生 coredump。我們希望不管 coredump 多大都會產生,所以將此設置設為不 限制。設定方式為修改/etc/security/limits.conf,將其中 coredump 限制改為: