本章將說明 Solaris Resource Manager 的操作原理以及關鍵性的概念。工作量設置 提供範例以加強說明並且解釋簡單的階層。(比較複雜的階層範例請參閱 第 10章, 進階用量。)
Solaris Resource Manager 是附建在 Solaris kernel 稱為 lnode(限制節點)的基礎之上。lnode 對應於 UNIX 使用者識別碼 (UID) 並且可以代表個別的使用者、使用者群組、應用程式和特殊要求。lnode 索引被 UID 參照;它們被用來記錄使用者、群組及應用程式層級的處理所用的資源配置政策和累積的資源使用資料。
雖然一個 lnode 由 UID 識別,卻和影響使用權限的證書不同。證書結構會決定是否處理可以讀取、寫入和修改一個檔案。lnode 結構是用來追蹤資源的限制與使用的。
在某些情況下,使用者可以使用不同組的限制。這是藉由使用 srmuser(1SRM) 以附加至不同的 lnode 來達成。請注意這個改變並不會影響證書結構,它仍然與原始的 UID 有關,而且處理仍然會保留相同的權限。
Solaris Resource Manager 管理模式可以將 lnodes 組織為階層式結構,稱為排程樹。此排程樹狀結構依照 UID 組織而成:每個 lnode 都參照 lnode 在樹中的雙親 UID。
每個排程樹的子結構都稱為排程群組,而位於排程群組 root 的使用者則稱為群組標頭。(root 使用者是整個排程樹的群組標頭。)設定旗標 flag.admin 委託能力去管理在排程群組裡的資源策略到群組標頭。
lnode 最初是由剖析 UID 檔案而建立。在安裝 Solaris Resource Manager 之後,lnode 管理指令 (limadm(1MSRM)) 會用來建立額外的 lnode 並且將它們指派給雙親 lnode。排程樹資料儲存在一個平面檔案資料庫中,必要時可以使用 limadm 來修改。
雖然 lnode 所用的 UID 並不需要與系統帳號對應,由於系統帳號在系統密碼對映圖中有一個項目,建議最好為每個 lnode 的 UID 建立一個系統帳號。若為非枝葉的 lnode(在階層中有附屬 lnode 在其下),帳號與 lnode 的關聯可能為純管理性;無人能夠登入其中。不過它也有可能是真正的使用者 lnode,可以登入與執行附加至此非枝葉 lnode 的處理。
請注意,Solaris Resource Manager 排程群組和群組標頭與 /etc/group 資料庫中定義的系統群組無關。排程樹中的每個 lnode,包括群組標頭,都對應至一個真正的系統使用者和獨特的 UID。
如果階層限制被指派給一個群組標頭,它可以套用在該使用者的使用量加上索引排程群組成員的總使用量。如此可以對整個群組以及個別成員施加限制。資源被配置給群組標頭,他可以將它們配置給屬於同一個群組的使用者或使用者群組。
每一個程序都附加在一個 lnode 之上。init 處理永遠附加到 root lnode。當處理由 fork(2) 系統呼叫建立時,它們被附加至與其雙親的相同 lnode 之上。處理可以使用 Solaris Resource Manager 系統呼叫來重新附加至任何 lnode 之上,只要權限許可。權限可由 中央系統管理員或是擁有正確管理權限的使用者來設定。
Solaris Resource Manager 軟體提供下列系統資源的控制功能:CPU(處理機速率)使用量、虛擬記憶體、實體記憶體(僅限於Solaris 8)、處理數量、使用者及/或排程群組同時登入的此數,以及終端機連線時間。
表 2-1 Solaris Resource Manager 功能
系統 資源 |
配置 政策 |
控制 |
衡量 |
使用量資料 |
---|---|---|---|---|
CPU 使用量 |
是的 (每位使用者識別碼) |
是的 |
是的 (每位使用者識別碼) |
是的 |
虛擬記憶體 |
是的 (每位使用者、每個處理) |
是的 (每位使用者、每個處理) |
是的 (每位使用者、每個處理) |
是的 |
實體記憶體(僅限於Solaris 8) |
是的 |
是的 |
是的 |
是的 |
處理數量 |
是的 |
是的 |
是的 |
是的 |
使用者/排程群組登入 |
是的 |
是的 |
是的 |
是的 |
連線時間 |
是的 |
是的 |
是的 |
是的 |
|
|
|
|
|
Solaris Resource Manager 可以追蹤每位使用者每種資源的使用量。除了 CPU 以外,可以對使用者指派所有資源的使用量硬限制。如果使用者讓使用量達到限制的話,硬限制可以使資源消耗的嘗試失敗。硬限制可以直接施行,藉由 kernel 或是負責管理個別資源的軟體。
限制值為零表示沒有設定任何限制。root lnode 的所有限制屬性都應為零。
一般而言,所有系統資源都可分為以下兩種類別之一:fixed(或不可更新)資源 與 可更新資源。然而,在 Solaris Resource Manager 1.3 用於 Solaris 8 環境,將會使用第三級別:軟性限制。常駐設定大小 (RSS) 軟性限制的方式是由資源運算強制常駐來間接執行,也就是說用量可暫時超出限制。如需其他資訊,請參閱 第 8章, 使用資源運算常駐程式的實體記憶體管理 。
Solaris Resource Manager 以不同方式管理固定與可更新資源。
固定或不可更新的資源指的是數量有限的資源。例如虛擬記憶體、處理數目、使用者及/或排程群組的同時登入以及連線時間等。固定資源可以消耗(配置)並且釋放(取消配置),但在所有者取消配置之前,沒有其他實體可以使用此資源。Solaris Resource Manager 採用一種使用量與限制模式來控制固定資源的使用量。使用量定義為目前被使用的資源,而限制則是 Solaris Resource Manager 所允許的最大程度使用量。
可更新資源是可以不斷供應的資源,例如 CPU 時間。可更新資源只能被消耗,而且一旦消耗之後便不會再回來。可更新資源會在任何時候有限供應,如果當時不用,它也不會再回來。(可以比喻為陽光。任何時刻都只有一部份陽光照射到地球上,未來幾百萬年還會持續下去。)因此可更新資源是可以重新指派給其他使用者而不需要明確重新配置來確保不浪費。
Solaris Resource Manager 採用一種使用量、限制和衰減率來控制一位使用者的可更新資源消耗率。使用量定義為所用的總資源,設定與群組中其他使用者比較的使用量率限制。 衰減率指的是歷史使用量被去除的期間。例如下一個資源量,時鐘轉動,會被配置給使用中的 lnode,與其最低的衰減總使用量值相對於其配置的配分。衰減使用量值是一段時間的總使用量的衡量減掉半壽命衰減模式所決定的歷史使用量某部份而得出。
可更新 CPU 資源的配置是利用一種稱為 Solaris Resource Manager SHR 排程器的公平分享排程器來控制。
每個 lnode 被指派幾個 CPU 配分。與每個 lnode 有關的處理被依照明顯使用中配分(使用中表示 lnode 有附加執行中的處理)的總數來配置 CPU 資源。只有使用中的 lnode 才能配置資源,因為只有它們會執行使用中的處理並且需要 CPU 時間。
當一個處理在消耗 CPU 時間時,其 lnode 的 CPU 使用量屬性就會增加。排程器會定期調整所有處理的優先順序,以迫使所有使用中的 lnode 就其個別程度的 CPU 使用量的相對率與 CPU 配分的相對率會集。這樣一來,使用者可以預期以後繼續收到至少其應得的 CPU 服務,無論其他使用者的行為如何。
排程器是屬於階層式的,因為它也能確保群組收到其應有的權利,不論其成員的行為如何。Solaris Resource Manager SHR 排程器是一種長期的排程器,確保所有的使用者和應用程式都能在排程器時段間收到公平的配分。這表示當輕量使用者開始要求 CPU 資源時,該使用者會收到比重量使用者較多的資源,直到其相對的使用量與其相對的 '公平' 配分配置相符為止。您現在收到越多應有的配分,以後就會收到較少的配分。
此外,Solaris Resource Manager 有一個衰減期,由系統管理員設定,不會追蹤過去的使用量。衰減模式是屬於半壽命式的,其中百分之 50 的資源會在一半壽命時被減去。這可以確保用量穩定平均的使用者不會受到短期大量使用者的傷害。半壽命衰減期會設定排程器的回應或時期。預設值為 120 秒。一個長半壽命喜愛平均用量,典型長期批次工作,同時,一個短半壽命喜愛互動式使用者。較短的數值容易在系統上供應平均的回應,不過在計算與維持系統資源配置時比較不精確。無論管理設定值為何,排程器都會試著防止資源匱乏並且確保合理的行為,甚至在極端的情況之下。
Solaris Resource Manager SHR 排程器和標準 Solaris 排程器比較的主要優點在於它可以排程使用者或應用程式,而非個別的處理。與 lnode 有關的每一個處理都會受到一組限制的控制。在只有一位使用者執行單一使用中處理的簡單例子中,這就和讓每個處理受到對應的 lnode 中所列的限制是一樣的。當有一個以上的處理附加到 lnode 上,當群組中的成員各自執行多個處理時,所有的處理都會受到列出的限制所控制。這表示使用者或應用程式無法比其應有的資源消耗更多的 CPU,不論它們在執行多少同時的處理。這個指派應有配分的方法非常簡單易懂,而且變更使用者配分的效果也顯而易見。
SHR 排程器的另一項優點是它會在管理個別執行緒的排程時(以 Solaris 的技術而言,排程的實體是一種輕量的處理 (LWP)),也在使用者之間分配 CPU 資源。
這些概念可由下列方程式來說明:
new_SRM_priority 便會被對映至系統優先順序。Solaris Resource Manager 的優先順序越高,系統的優先順序就越低。反之亦然。每一個衰減期中, CPU_usage 都被減少一半,以最近的使用量遞減。
每位使用者也有一組旗標,是布林式的變數,可用來啟用或停用特定的系統權限,如登入。可以為每位使用者設定個別的旗標,或從一個雙親 lnode 繼承。
任何使用者都可以讀取使用者的使用量、限制和旗標,但只有具有適當管理權限的使用者才能變更它們。
Solaris Resource Manager 從不浪費 CPU 的可用資源。不論使用者的配置多低,該用者總是會取得所有可用的 CPU,如果沒有其他競爭使用者的話。這樣的結果就是使用者可能會注意到執行效能沒有通常那麼平順。如果一位有效配分非常低的使用者在沒有競爭時執行互動式處理,工作會感覺得非常快。然而,只要另一位有較高有效配分的使用者要求 CPU 的時間,他就會優先取得資源,因此第一位使用者會注意到工作明顯變慢。不過 Solaris Resource Manager 會特別注意以確保合法的使用者都不會被剝奪資源而無法進行任何工作。Solaris Resource Manager 所排程的所有處理(除了有最大 nice 值的以外)都由排程器定期配置 CPU 資源。也有邏輯可以防止一位才登入的新使用者被賦予推演式的 '公平' 但超大量的 CPU 資源而傷害到現存的使用者。
虛擬記憶體是利用一個固定資源模式來管理的。虛擬記憶體限制也適用於附加至此 lnode 所有處理的記憶體大小總數。此外,這種每個-處理虛擬記憶體的限制,會限制處理的虛擬位址空間大小總數、包括所有代碼、資料、堆疊、檔案映射以及共用程式庫。這兩種限制都是階層式的。限制虛擬記憶體的使用可以有效地防止虛擬記憶體匱乏。例如 Solaris Resource Manager 會阻止一個外洩記憶體的應用程式佔用未保證的虛擬記憶體量而危害所有使用者。相反的,此類處理只會犧牲自己,或在最壞的情況下,犧牲其資源群組內部的其他成員。
如果您在 Solaris 8 作業環境中使用 Solaris Resource Manager 1.3,您可以透過收集附加到 lnode 或專案中的處理,來控制實體記憶體的資源用量。如需關於此功能的資訊,請參閱 第 8章, 使用資源運算常駐程式的實體記憶體管理 。
使用者可以同時執行的控制的計數是使用一個階層式限制的固定資源模式來控制。
系統管理員和群組標頭可以設定終端機登入權限、登入數目和連線時間限制,由 Solaris Resource Manager 依照階層實施。當一位使用者接近連線的時間限制時,會有警告訊息送至使用者的終端機。達到限制時,使用者會被通知,然後在短暫的寬限期之後被迫登出。
Solaris Resource Manager 會增強式地衰減過去的連線時間使用量,只保持最近的使用量可用。系統管理員會設定一個半壽命參數以控制衰減率。長的半壽命較適於平均的使用,而短的半壽命則適於互動式使用者。
中央系統管理員(或超級使用者)能建立和移除使用者 lnodes。中央系統管理員(或超級使用者)可以更改任何使用者的限制、使用量和旗標,包括其本身的。系統管理員也可以設定任何 lnode 的管理權限,包括對特定使用者指派管理權限。
sub-administrator 可以透過 flag.uselimadm flag旗標的設定,授予這些權限。一個下層管理員能像使用者一樣執行任何 limadm 指令 root, 也可被當成超級使用者的助理。
我們稱一個藉由設定 flag.admin 旗標而被給予階層式管理特權的使用者為群組管理員。群組管理員可以修改使用者所屬的群組標頭中子樹的 lnode,和管理群組的資源分配與排程策略。群組管理員通常無法修改他們自己的限制或旗標,而且無法修改其群組內部的旗標或使用量,以規避自己的旗標或限制。
系統管理員可以看見資源的使用量資訊,並且有兩種資源使用量資訊的檢視畫面:基於每位使用者的檢視,以及資源使用量工作量的檢視。
Solaris Resource Manager 系統維持的資訊(主要是目前和累積的資源使用量),可以由管理員用以控制全面性的系統資源會計。Solaris Resource Manager 並沒有包含任何的會計程式,但是其公用程式提供發展自訂資源會計系統的基礎。
欲知更多有關設定會計程序的資訊,請參見第 9章, 使用量資料。
使用 Solaris Resource Manager 有效管理資源的關鍵在於設計完善的資源階層。Solaris Resource Manager 使用 lnode 樹來實施資源階層。
lnode 樹中的每個節點都對映至密碼對映圖中的一個 UID,表示工作量必須對映以與密碼對映圖中的項目對齊。在某些時候,可能需要建立其他使用者以符合階層中的枝葉節點特殊需要。這些特殊使用者不會實際執行處理或工作,但可作為枝葉節點的管理點。
這個簡單階層是建立來控制兩位使用者 Chuck和 Mark 的資源處理。這兩位使用者在不同時間消耗大量的 CPU 資源,因此會在一天中不時影響對方。
要解決此問題,要建立單一層級的階層,並且將相等的 CPU 配分配置給每位使用者。
這個簡單階層是利用 limadm 指令使 Chuck 及 Mark 成為 root 配分群組的子代而建立的:
# limadm set sgroup=root chuck # limadm set sgroup=root mark |
要配置百分之 50 的資源給每位使用者,給予每位使用者相同的 CPU 配分數目。(為了簡單起見,在此例中已將 50 分的資源配置給每位使用者,但配置 1 分給每位使用者的效果相同。) limadm 指令是用來配置配分的:
# limadm set cpu.shares=50 chuck # limadm set cpu.shares=50 mark |
使用 liminfo 指令來檢視與 Chuck 有關的 lnode 變更:
# liminfo -c chuck Login name: chuck Uid (Real,Eff): 2001 (-,-) Sgroup (uid): root (0) Gid (Real,Eff): 200 (-,-) Shares: 50 Myshares: 1 Share: 41 % E-share: 0 % Usage: 0 Accrued usage: 0 Mem usage: 0 B Term usage: 0s Mem limit: 0 B Term accrue: 0s Proc mem limit: 0 B Term limit: 0s Mem accrue: 0 B.s Processes: 0 Current logins: 0 Process limit: 0 Last used: Tue Oct 4 15:04:20 1998 Directory: /users/chuck Name: Hungry user Shell: /bin/csh Flags: |
liminfo 指令顯示的欄位在 中有所解釋。同時請參閱 一個典型的應用程式伺服器liminfo1SRM( 線上援助頁中有關 ) liminfo 欄位的資訊。