這一節的實例說明用來控制系統資源及配置,以及用來顯示資訊的 Solaris Resource Manager 功能。
第一個實例說明以下這些指令﹕
將一或多位使用者的密碼屬性及限制資訊列印至一個終端機視窗
變更一組使用者的限制屬性或刪除限制資料庫登錄
顯示或設定操作模式及系統 Solaris Resource Manager 的可調式參數
顯示 lnode 活動資訊
如果將兩個伺服器整合至一個單一機器之上,每個伺服器都執行一個資料庫應用程式。只要在單一機器上執行兩個應用程式便可形成一個工作系統;不需要 Solaris Resource Manager,Solaris 作業系統也能根據公平使用的基礎來為應用程式配置資源,但是無法保護應用程式不與其他應用程式爭取資源需求。相反地,Solaris Resource Manager 可以提供防止應用程式嚴重缺乏資源的一種機制,其方法是啟始每個附加至參考 databases、db1 和 db2 的 lnode 資料庫,。為達此目的,必須建立三個新管理位置保留符號使用者。例如, databases、db1以及 db2。這些使用者被新增至 lnode 資料庫。既然 lnode 對應 UNIX UID,它們也必須新增人 passwd 檔(或密碼映射,如果系統使用一個命名服務,如 NIS 或 NIS+)。假設 UID 被新增至 passwd 檔或密碼映射,位置保留符號使用者 db1 和 db2 會被指派給 databases lnode 群組,其指令為﹕
% limadm set sgroup=0 databases % limadm set sgroup=databases db1 db2 |
假設 /usr/srm/bin 位於使用者的路徑。
因為沒有其他定義的群組,databases 群組目前可以使用整個機器。會執行與資料庫有關的兩個 lnode,而執行資料庫應用程式的處理會利用資料庫實例啟始指令集中的 srmuser 指令,附加至適當的 lnode 上。例如,
% srmuser db1 /usr/bin/database1/init.db1 % srmuser db2 /usr/bin/database2/init.db2 |
啟始db1 或 db2 其中任何一個資料庫時,使用 srmuser 指令以確保資料庫附加至正確的 lnode,而且收費正確(srmuser 這麼做不會影響處理的所有權)。要執行上述指令,一位使用者必須擁有執行 init.db1 的 UNIX 權限以及管理權限,才能將處理附加至 lnode db1 之上。當使用者登入並使用 databases 時,databases 所執行的活動都被累計至 lnode db1 和 db2。
藉由使用每個 lnode 一個配分的內定配置,databases 群組的使用量經過一段時間之後會取得平均,以確保 databases、db1 和 db2 都能接收到相等的機器配置。尤其是 databases 群組-有一個可用的-配分,而且 databases 擁有它。每一個 lnode db1 和 db2 都被賦予一個配分的內定配置。在 databases 群組之內,有兩個可用的配分,因此 db1 和 db2 可以取得 databases 資源的相等配置(在這個簡單例子中並無相爭的配置,所以 databases 可以存取整個系統)。
如果發現 Database1 上的活動需要百分之 60 的機器的 CPU 功率,而 Database2 需要百分之 20 的功率,那麼管理員可以增加配置給 db1 的 cpu.shares 數來指定系統至少可以提供這麼多(假設應用程式需要)﹕
% limadm set cpu.shares=3 db1 |
在 databases 群組中有四個可用的配分;db1 中有三個,而 db2 中有一個。這個變更在一執行上述指令之後便馬上受到影響。在這一段過渡期當中,lnode db1 (Database1) 實際上會收到比其有權使用的百分之 60 還要多的機器資源,因為 Solaris Resource Manager 要花一點時間來平均使用量。不過當然視消減全域參數而定,這段時間不會太長。
要隨時監控此活動,請在不同的視窗中使用 liminfo 和 srmstat指令﹕
% liminfo -c db1 # limit information shows all the data and # settings for the lnode db1. |
請參閱 "一個典型的應用程式伺服器"。
此外,srmstat 還提供一種定期更新的顯示﹕
% srmstat -ac # srmstat shows the server activity and the # flag -ac sets a screen default update period # of 4 seconds to display the results. |
有一部執行兩個資料庫應用程式的機器,一個接收資源的百分之 75,另一個則接收百分之 25。請牢記,超級使用者 (root) 是最高層的群組 header 使用者。因此作為 root 的處理會在需要時擁有整個系統的存取權。那麼如果建立一些額外的 lnode 以執行備份、精靈及其他指令集的話,root 處理便無法像傳統的執行方式一樣佔用整個機器。
此例說明下列指令﹕
取消所有附加至一個 lnode 的作用中處理
財務部門擁有資料庫系統,但是一位工程部的使用者 (Joe) 必須執行一項電腦計算工作,所以想要利用系統閑置的離峰時間來使用財務部的機器。但財務部認為 Joe 的工作不如 databases 來得重要,因此只同意讓他在不干擾系統主要任務的條件下使用機器。要實施這個規定,必須新增一個群組(batch)到 lnode 資料庫中,然後將 Joe 新增至伺服器 lnode 階層的新的 batch 群組中。
% limadm set cpu.shares=20 databases % limadm set cpu.shares=1 batch % limadm set cpu.shares=1 joe % limadm set sgroup=batch joe |
這個指令序列會變更配分的配置,而讓 databases 群組擁有 20 個配分,batch 群組卻只有 1 個。這說明了如果 databases 群組是啟動的話,batch 群組(只有 Joe)的成員最多可以使用機器的 1/21。databases 群組接收 20/21 或百分之 95.2 的資源,比先前決定充份處理資料庫工作的 60% + 20% = 80% 還要來得多。如果 databases 不需要其總配置,Joe 將接收到超過他原本的百分之 4.8 的配置。如果databases 完全沒有作用,Joe 的資源配置可能會高達百分之百。當配置給 databases 的可用配分數 從 1 增加到 20 的時候,就沒有必要變更配置給 db1 和 db2 的配分。在 databases 群組之內,仍然有四個可用的配分,依照 3:1 的比率來配置。排程樹的各個層級彼此不相干;有關係的是配分在同層群組之間的比率。
儘管有上述這些保證,財務部還是要進一步確定 Joe 無法在白天最忙碌的黃金時段登入。要做到這一點,就必須對 batch 群組進行一些登入控制。要想讓控制因一天當中的時段而不同,可以執行一個指令集,變更每天開始和結束時允許登入 batch 群組的計數。例如,可以利用 crontab 登錄來實施﹕
0 6 * * * /usr/srm/bin/limadm set logins=0 batch 0 18 * * */usr/srm/bin/limadm set logins=100 batch |
上午 6:00 的時候,batch 的登入限制被降至 0,而晚上 6 的時候,限制則會被提升到最多 100 次登入。
您也可以新增另一行至 crontab 登錄中以實施更嚴格的策略﹕
01 6 * * * /usr/srm/bin/srmkill joe |
使用 srmkill 指令在上午 6:01 時取消附加至 lnode Joe 的任何處理。如果工作所需的唯一資源是由 Solaris Resource Manager 所控制的話,這個指令就沒有必要。如果 Joe 的工作會佔用其他干擾正常工作的資源,那麼這個動作就很有用。一個可以鎖定關鍵性資料庫,或是主控一個 I/O 管道的工作就是一例。
Joe 現在便只能在晚間登入以執行他的工作。因為 Joe(和整個 batch 群組)比其他應用程式所擁有的配分要少得多,他的應用程式會運用少於機器的百分之 5。同樣地,nice(1) 可以用來降低附加至此工作的處理優先順序,那麼它便會以低於其他擁有同等 Solaris Resource Manager 配分的工作的優先順序來執行。
這時財務部已經完全確保了他們的資料庫應用程式擁有其系統充分的存取權,而且不會互相干擾。他們不但設法讓 Joe 能夠隔夜進行批次處理的工作,也同時確保了他的工作不會干擾與他們的任務息息相關的處理。
假設您決定要在 Database1 上放置一個全球資訊網前端處理,但限制此應用程式一次只能接受 10 位使用者。這時請使用處理限制功能。
首先,建立一個稱為 ws1 的新 lnode。藉由啟始 ws1lnode 之下的 Webserver 應用程式,您可以控制可用的處理計數,以及作用中 http 階段作業的計數。
因為 Webserver 是 Database1 應用程式的一部分,最好為它配分 db1 lnode 並使它與 Database1 互相爭取資源。配置百分之 60 的計算資源給 Webserver 以及百分之 40 給 Database1 應用程式本身﹕
# limadm set cpu.shares=6 ws1 # limadm set sgroup=db1 ws1 # limadm set cpu.myshares=4 db1 # srmuser ws1 /etc/bin/Webserver1/init.webserver |
最後一行文字會啟動 Webserver 並將應用程式變更為 ws1 lnode。請注意,Database1 的cpu.myshares 配置為 4,因而將 db1 與其子處理 Webserver 相爭的配分比率設定為 4:6。
cpu.shares 顯示一個階層的同層層級資源配置比率,而 cpu.myshares 則顯示雙親積極執行應用程式時親子層級的資源配置比率。Solaris Resource Manager 會依照在其個別層級的所有作用中 lnode 的可用配分比率來進行資源的配置;其中"個別層級"包括群組雙親以及其所有子的 my.shares。
要控制 Webserver 可以執行的處理計數,對 ws1 lnode 採用一個處理限制。此例使用 20,因為一個 Webserver 查詢通常會產生 2 個處理,因此實際上將作用中 Webserver 查詢的數目限制為 10﹕
# limadm set process.limit=20 ws1 |
現在已有另一個應用程式新增至排程樹中,作為一個作用中 lnode 之下的葉片節點。要在作用中的雙親和其子之間分配 CPU 資源,請使用 cpu.myshares 來將某部份的可用資源配置給雙親以及某些給子。採用處理限制以限制 lnode 上作用中作用階段的計數。
在此以實例說明資源控制機制,包括 CPU 分享、處理限制及登入控制;並說明可以用來列印 lnode 並且顯示作用中 lnode 的顯示工具。
管理 Solaris Resource Manager
輸出有關選定使用者的資訊
在到達任何限制時要求精靈遞送訊息
另一位使用者,Sally,也要求晚間使用機器來執行她的應用程式。因為她的應用程式需要大量的 CPU,為了確保不影響到 Joe 的應用程式,就必須限制 Sally 對虛擬記憶體的使用,包括她的總使用量以及"每次處理"的使用量。
% limadm set memory.limit=50M sally % limadm set memory.plimit=25M sally |
如果當 Sally 的應用程式嘗試要超出其總虛擬記憶體的限制或是處理記憶體的限制,limdaemon 指令就會透過主控台來通知 Sally 和系統管理員,告知他們已經超出限制範圍。
使用 limreport(1MSRM) 指令來生成一份報告,說明誰在使用系統及其到目前為止的使用情況。最典型的 limreport 使用方法是隨時查看使用機器的人以及他們屬於使用者階層的何處。
% limreport 'flag.real' - uid sgroup lname cpu.shares cpu.usage |sort +1n +0n |
limreport 有數個參數。在此例中,"flag.real"(僅查詢"真正的"lnodes/UID)上會出現一個勾號,然後以一個破折號 (-) 來指出最可能使用的內定輸出格式,而清單"uid sgroup lname cpu.shares cpu.usage"表示 limreport 應輸出這五個參數給每個"flag.real"設定為 TRUE 的 lnode。輸出會被導入第二欄的 UNIX 主要排序以及第一欄的次要排序,作出一份簡單的報告,說明使用伺服器的人是誰。
任何擁有正確路徑及權限的人都可以使用 srmadm show 指令來隨時檢查Solaris Resource Manager 的狀態。這會輸出 Solaris Resource Manager 及其主要的設置參數目前操作狀態的一份格式化報告。可以用來檢查 Solaris Resource Manager 以及所有的控制參數是否都在作用。它也顯示全域參數的值,例如消減率及內存 Solaris Resource Manager 資料的位置。
您可以在不啟用限制以及 CPU 排程的情況下執行 Solaris Resource Manager ;這對於啟始、除錯以及 Solaris Resource Manager 的初始設置而言都很重要﹕
# srmadm set share=n:limits=n, - |
一個不同的開發群組想要購買這部機器的升級(更多處理機及記憶體),好在系統閑置時可以存取它。這樣一來兩個群組都會得到好處。要這麼做,請在 databases 和 batch 相同的層級上建立一個稱為 development 的新群組。為 development 配置機器的百分之 33,因為原始系統上已經新增了百分之 50 的 CPU 功能及記憶體﹕
開發群組擁有上百位使用者。為避免涉及其資源的分配,請使用管理 Solaris Resource Manager 的旗標功能,好讓開發系統管理員能夠配置其資源。您可以依照雙方的同意來設定操作及開發層級的限制,然後各自設法控制機器屬於您自己的部份。
要為階層新增新的層級,請將群組 operations 新增為一個新的 lnode,並且將 batch 及 databases 的雙親群組變更為operations﹕
% limadm set sgroup=operations batch databases |
要設定管理旗標﹕
% limadm set flag.admin=set operations development |
在一般狀況之下,所有的伺服器都必須執行精靈及備份處理,它們應被新增至另一個高層的 lnode。
不要使用 root,因為 root 沒有任何限制。
如例中所述,您可以使用 Solaris Resource Manager 來整合相同的機器上數種不同類型的使用者及應用程式。您可以明智地使用 CPU 配分控制、虛擬記憶體限制、處理限制及登入控制等功能,確保這些不同的應用程式只接收它們所需的資源。這些限制可以防止應用程式或使用者對任何其他的使用者或使用者群組的應用程式產生不良的影響。Solaris Resource Manager 支援某些簡單的報告製作工具,以讓使用者及系統管理員瞭解在任何一刻和一段時間之內所發生的實際狀況。報告生成的功能可以用來顯示應用程式及群組的資源分割利用,以達到功能規劃及收費目的。