4.2 併行模擬
4.2.4 產生及分配模擬子工作
Dispatcher 收到 Manager 的模擬工作要求後會做一些簡單處理,接著依據變 數設定產生可各自獨立執行的模擬子工作,最後將模擬子工作分配給模擬機器。
以下說明前述各步驟的設計與實作。
首先,Dispatcher 解開打包的模擬設定檔,將模擬設定檔放在此工作所屬使 用者於 NFS 上的暫存目錄,模擬引擎讀取模擬設定檔會從掛載 NFS 的目錄讀取。
接著,Dispatcher 從資料庫中查詢此模擬工作的「雲端憑證」,用於分配模擬子工 作時傳送給 Coordinator,此認證於章節 4.6 說明。
Dispatcher 依據使用者的參數變化設定產生模擬子工作。首先依據使用者參 數變化的設定,組合出所有變數值的組合。接著依照組合的數量,產生相應數量 的模擬子工作,並為每個子工作產生一物件記錄此工作之相關資訊。再從模擬工 作的設定檔複製出多份設定檔、分別放到各子工作的目錄,模擬引擎進行模擬時 便會到該子工作的目錄讀取設定檔。最後 Dispatcher 修改每個模擬子工作的設定 檔,將要改變的網路參數寫入模擬描述檔(.tcl 檔)。
模擬描述檔會描述網路拓撲中,節點使用的協定模組之間的關係(即協定堆 疊),以及拓譜中的節點的連接關係。模擬描述檔中亦會指定各種網路參數,如 亂數種子(random number seed)等全域變數,以及節點中網路協定模組的參數 值。此檔案於使用者以 GUI 繪製網路拓撲後,由 GUI 產生。模擬描述檔有自訂 格式及指令,模擬引擎中有對應各指令的處理函式(function)。執行模擬時模擬 引擎會讀取此檔案,依其中的指令建立物件、設置變數值,建立出各節點的協定
39
堆疊。模擬引擎讀取完整份模擬描述檔後,各節點協定堆疊的相關物件及關連便 建立完成,之後模擬引擎便可以這些物件開始模擬。因此我們透過修改模擬描述 檔,讓模擬子工作得以不同的網路參數進行模擬。
實作上,Dispatcher 會在模擬描述檔最後、RUN 指令前加入 CloudSet 指令,
用來修改全域變數及節點中網路協定模組的參數值。由於 CloudSet 指令在模擬 描述檔的最後,模擬引擎處理完前面的指令、要處理 CloudSet 時,所有網路模 擬物件皆以建立,此時便可直接修改模擬物件中的變數值,達到修改的目的。
CloudSet 指令分成兩種格式,分別修改全域變數與修改各節點各項變數,其 格式與意義說明如下:
1. CloudSet <Global Variable Name> = <Value>
此格式用於修改全域變數。
<Global Variable Name>是全域變數名稱。
<Value>是欲給予的值。
2. CloudSet Node <Node ID> Port <Port ID> <Module Name>.<Variable Name> =
<Value>
此格式用於修改節點協定模組中的參數值。
<Node ID>為欲修改節點的 ID。
<Port ID>為該節點中欲修改 Port 的 ID。
<Module Name>為該 Port 上欲修改之協定模組名稱。
<Variable Name>則為該模組中欲修改之變數名稱。
<Value>為欲給予的值。
40
以上設定表示亂數種子為 1 到 3,節點 2 的 Port1 的 FIFO 模組中最大佇列長 度為 10、20、30、40、50。此設定會產生 15 個模擬子工作。
經 Dispatcher 組合變數值,並修改模擬子工作的模擬描述檔,於第一個模擬 子工作的模擬描述檔會加上:
第二個模擬子工作的模擬描述檔會加上:
第七個模擬子工作的模擬描述檔會加上:
由例一可看到,Dispatcher 將節點 ID、Port ID、模組名稱、參數名稱套入 CloudSet 指令,參數值則是依照組合的結果設置。
經 Dispatcher 組合變數值,並修改模擬子工作的模擬描述檔,於第一個模擬 子工作的模擬描述檔會加上:
CloudSet RandomNumberSeed = 1
CloudSet Node 2 Port 1 FIFO.max_qlen = 10
CloudSet RandomNumberSeed = 1
CloudSet Node 2 Port 1 FIFO.max_qlen = 20
CloudSet RandomNumberSeed = 2
CloudSet Node 2 Port 1 FIFO.max_qlen = 20
G,RandomNumberSeed,R,1,3,1 N,1,*,Phy,Bw,V,10,100,1000
CloudSet RandomNumberSeed = 1 CloudSet Node 1 Port * Phy.Bw = 10
41
第二個模擬子工作的模擬描述檔會加上:
第六個模擬子工作的模擬描述檔會加上:
由例二可看到,Dispatcher 僅負責參數變化的組合,對於未指明 ID 的節點 及 Port 不會加以展開,保留「*」並將此部分的展開交由模擬引擎處理。
此是由於我們希望分析模擬描述檔的程式僅在整體系統中的一個軟體元件 上,即模擬引擎,避免模擬描述檔未來若修改格式需維護多份分析程式。
Dispatcher 不會對模擬描述檔進行分析,無法知道網路拓撲中有哪些節點及 Port。
所以在使用者未明確指定節點或 Port 時,Dispatcher 無足夠資訊將「*」轉為多 個指明節點及 Port 的 CloudSet 指令。如例二中 Dispatcher 對於第六個模擬工作 無法產生以下指令:
CloudSet RandomNumberSeed = 1 CloudSet Node 1 Port * Phy.Bw = 100
CloudSet RandomNumberSeed = 2 CloudSet Node 1 Port * Phy.Bw = 1000
CloudSet RandomNumberSeed = 2 CloudSet Node 1 Port 1 Phy.Bw = 1000 CloudSet Node 1 Port 2 Phy.Bw = 1000 CloudSet Node 1 Port 3 Phy.Bw = 1000
42
由於模組皆繼承 NslObject,因此在做各種節點模組搜尋、協定模組搜尋時,
皆可使用 NslObject 指標存取不同模組。
我們在模擬引擎中加入處理 CloudSet 指令的函式(function)。模擬引擎自模 擬描述檔讀取 CloudSet 指令時會修改各項參數值,其實作方式如下。
在類別(class)CmdProcessor 增加 cmdCloudSet()函式,用以處理 CloudSeet 指令。修改 Command_Dispatch(),使之能認得 CloudSet 為一合法指令並呼叫 CmdProcessor 的 cmdCloudSet()指令。
修 改 全 域 變 數 直 接 使 用 模 擬 引 擎 中 已 有 的 函 式 GetVariableBinder()->setVarValue() 設 定 , 呼 叫 此 函 式 的 參 數 為 一 NULL 的 NslObject 指標、全域變數名稱、欲賦予的值。此函式在指定的 NslObject 指標為 NULL 時表示設定全域變數,NslObject 為模擬引擎架構中的基本模組類別,所 有協定模組的類別皆須繼承此類別。
修改節點的協定模組參數,有以下步驟:
首先分析節點 ID 及 Port ID,區分 N、N*、*,接著依照不同組合有不同的處理。
1 如果節點 ID 包含數值(N 或 N*),取得此 ID 的節點物件。
1.1 若節點 ID 是 N*,表示要設置所有跟節點 N 相同類型的節點。以節點 ID 由小到大搜尋所有節點,找到跟節點 N 類型相同的節點,再看是否 指定 Port。
1.1.1 有指定 Port 則設定該節點的模組變數。
1.1.2 無指定 Port 則搜尋此節點上所有與欲設置模組相符的模組設置變 數。
1.2 若節點 ID 是 N,表示設置某個節點的模組變數。看是否指定 Port。
1.2.1 有指定 Port 則設定該節點的模組變數。
1.2.2 無指定 Port 則搜尋此節點上所有與欲設置模組相符的模組設置變
43
數。
2 若節點 ID 為*,表示要設定所有節點。
2.1 以節點 ID 由小到大搜尋所有節點,並以節點 ID 取得節點物件。
2.2 有指定 Port 則設定該節點的模組變數。
2.3 無指定 Port 則搜尋此節點上所有與欲設置模組相符的模組設置變數。
在模擬引擎中,一個節點上所有 Port 的協定模組是串在一個串列中,每個 協定模組會記錄它在哪個 Port 上,但無資料結構記錄一個節點有哪些 Port。因為 要設置節點上所有 Port 的 A 模組等同要設置此節點上所有的 A 模組,所以我們 只須搜尋整個模組串列,找出我們要設置的模組 A 再加以設置變數。
在 變 數 設 置 的 實 作 上 , 先 以 節 點 ID 、Port ID 、模 組名 稱為 參 數呼叫 InstanceLookup()取得模組物件,再使用 GetVariableBinder()->setVarValue()以模組 物件指標、變數名稱、變數值作為參數設定模組變數。
除 了 產 生 模 擬 子 工 作 外 , Dispatcher 另 一 個 主 要 工 作 為 分 配 子 工 作 。 Dispatcher 在特定事件發生時才進行子工作的分配,如此可避免不斷檢查可否分 配子工作的額外負擔。Dispatcher 在以下三個時機會嘗試分配子工作給模擬機 器:
1 產生完模擬子工作後,因為如果此時已有模擬機器則應開始進行模擬。
2 Coordinator 註冊時,因為此時表示有空閒的模擬機器。
3 有模擬機器的狀態由忙碌轉為空閒時,因為此時表示有空閒的模擬機器。
Dispatcher 分配子工作給模擬機器時,會要求 Coordinator 設置執行模擬的環 境。Coordinator 會設置工作目錄(work directory),此目錄之後會成為模擬引擎 的工作目錄。在雲端系統中,工作目錄即為該模擬子工作設定檔所在的目錄,其 位於 NFS 中。
44