Solaris Resource Manager 1.3 系統管理指南

範例

本節中的範例可以說明 Solaris Resource Manager 用來控制系統資源及配置,以及顯示資訊的各項功能。

伺服器結合

第一個範例將說明下列這些指令:

liminfo

在一個終端機視窗中列印一或多位使用者的使用者屬性及限制資訊

limadm

變更一組使用者的限制屬性或是刪除限制資料庫的項目

srmadm

顯示或設定操作模式及擴及整個系統的 Solaris Resource Manager 可調參數

srmstat

顯示 lnode 活動資訊

考慮在單一機器之上結合兩個伺服器的情況,每個伺服器執行一個資料庫應用程式。在單一機器上同時執行兩個應用程式將形成一個工作系統。不使用 Solaris Resource Manager,Solaris 系統會以同等使用為基礎,將資源分配給應用程式,並且不會保護應用程式不受其他應用程式的需求競爭。不過,Solaris Resource Manager 卻提供了一種防止應用程式資源匱乏的有效機制。有了 Solaris Resource Manager 之後,可先啟動與對應的 lnode 結點相連接的每個資料庫 db1db2。要這麼做,必須建立三個新的管理位置保留符號使用者。例如: databasesdb1db2。將它們新增至限制資料庫;因為 lnode 與 UNIX UID 對應,這些也必須被新增至 passwd 檔案(或如果系統使用一個如 NIS 或 NIS+ 的名稱服務,則是密碼映射)中。假設 UID 被新增至 passwd 檔案或密碼對映中,位置保留符號使用者 db1db2 會被以下列指令指派給 databases lnode 群組:

# limadm set sgroup=0 databases
# limadm set sgroup=databases db1 db2

其中假設 /usr/srm/bin 位於使用者的路徑當中。

圖 10-1 伺服器結合

圖表說明兩個伺服器(各執行一個資料庫應用程式)結合到在單一機器上的情況。

因為沒有其他定義的群組,databases 群組目前可以完全自由使用機器。與資料庫有關的兩個 lnode 會被執行,而執行資料庫應用程式的處理會被附加至正確的 lnode,以 srmuser 指令在資料庫實例的啟動指令集之中。

# srmuser db1 /usr/bin/database1/init.db1
# srmuser db2 /usr/bin/database2/init.db2

當您啟動資料庫 db1 或是 db2 時,請使用 srmuser 指令以確保資料庫附加至正確的 lnode 之上並且正確地計費 (srmuser 這麼做不會影響處理的所有權) 。要執行上述指令,使用者必須擁有執行 init.db1 所需的 UNIX 權限以及管理權限才能將處理附加至 lnode db1 之上。當使用者登入並使用資料庫時,資料庫所進行的活動會累積到 lnode db1db2 之上。

藉由在每個 lnode 上使用一個配分的預設配置,databases 群組中的用量會在一段時間之後平均下來以確保資料庫 db1db2 都能收到相等的機器配置。特別是 databases 群組有一個尚未使用的配分,而且 databases 擁有它。每一個 lnode db1db2 也都被賦予一個配分的預設配置。在 databases 群組中,有兩個尚未使用的配分,因此 db1db2 都取得 databases 資源之相等分配(在此簡單範例中,並沒有競爭分配的情況,所以 databases 可使用整個系統)。

如果後來發現 Database1 上的活動需要機器百分之 60 的 CPU 功率而 Database2 需要百分之 20 的話,管理員可以藉由增加配置給 db1cpu.shares 數目,以指定系統提供至少這麼多的資源 (假設應用程式提出要求):

# limadm set cpu.shares=3 db1

現在 databases 群組中有四個尚未使用的配分;db1 有三個,而 db2 有一個。這個變更會在執行上述指令之後立即受到影響。當 lnode db1 (Database1) 實際收到多於其應得的百分之 60 之機器資源之前,會有一段適應期,因為 Solaris Resource Manager 必須在一段時間內平均用量。不過視消減全球參數而定,此時期不會持續太久。

要隨時監控此活動,請在分開的視窗當中使用 liminfo (請參見 一個典型的應用程式伺服器) 及 srmstat 指令。請注意,srmstat 會提供一個定期更新的顯示畫面。欲知更多有關 srmstat 的額外資訊,請參見 srmstat(1SRM)

現在您有一部執行兩個資料庫應用程式的機器,其中一個收到百分之 75 的資源,而另一個則收到百分之 25。請記住,root 是最高階的群組標頭使用者。因此作為 root 執行的處理,如果想要的話,便可取得整個系統的存取權。因此,應該建立額外的 lnode 以便執行備份、常駐程式及其他指令集,而讓 root 處理不可能佔用整個機器的資源。這是如依照傳統方式來執行的話很可能會發生的狀況。

新增一個計算批次應用程式使用者

本範例將對下列指令加以介紹:

srmkill

殺掉附加至一個 lnode 所有使用中的處理

財務部門擁有資料庫系統,但 Joe 是一位工程部的使用者,必須執行一個計算批次工作,而且想要在下班時間系統通常被閑置時,利用財務部的機器來工作。財務部認為 Joe 工作的重要性不如資料庫,因此同意只要他的工作不會干擾系統的主要工作就可以進行。要實施這個政策,必須新增一個群組 (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

圖 10-2 新增一個計算批次應用程式

圖表顯示將名為「批次」的新群組新增到資料庫與 lnode 伺服器階層,以及將使用者 Joe 新增到新批次群組。

此指令序列會變更配分的配置,使 databases 群組擁有 20 個配分,而 batch 群組則只有一個配分。這會指定 batch 群組的成員 (只有 Joe 一人) 會使用至少 1/21 的機器,這時 databases 群組必須正在使用中。 databases 群組收到 20/21 或百分之 95.2 ,遠比先前決定足夠處理資料庫工作的 60% + 20% = 80% 還多。如果 databases 不需要其完全的配置資源,Joe 就會收到較其百分之 4.8 的配置還多的資源。如果 databases 處於完全停用中的狀態,則 Joe 的配置可能會達到百分之 100。當配置給 databases 尚未使用的配分數目從 1 增為 20 時,沒有必要對 db1db2 配分的配置做任何變更。在 databases 群組之中,仍然有四個尚未使用的配分,依照 3:1 的比率配置。排程樹的不同層級彼此是互相獨立的,重要的是同層群組之間的配分比率。

儘管有了這些保證,財務部還是要進一步確保 Joe 無法在日間顛峰工作時間登入系統。要這麼做,就必須對 batch 群組加以某種登入控制。因為這些控制要視一天的時間而定,請執行一個只允許 batch 群組在特定時間登入的指令集。舉例來說,您可以採用 crontab 項目來實行這個限制,例如:

0 6 * * * /usr/srm/bin/limadm set flag.nologin=set batch 
0 18 * * * /usr/srm/bin/limadm set flag.nologin=clear batch

在早晨 6 時,batch 沒有登錄的許可,爾在 18 時(下午 6 時),限制被移除。

您也可以實行更為嚴厲的政策,請新增另一行至 crontab 項目中:

01 6 * * * /usr/srm/bin/srmkill joe

這會使用 srmkill(1MSRM) 指令在上午 6:01 時殺掉任何附加至 lnode Joe 的處理。如果工作所需的唯一資源都由 Solaris Resource Manager 所控制的話,就不需要這麼做。此動作只有在 Joe 的工作有可能會佔用其他資源因而影響到正常工作時才派得上用場。例如一項握有關鍵性資料庫鎖定或是掌控一個 I/O 管道的重要工作。

那麼現在 Joe 就只能在夜間登入並且執行他的工作。因為 Joe (和整個 batch 群組) 比其他應用程式所得的配分要少許多,他的應用程式將會以少於百分之 5 的機器資源來執行。同樣地,可以使用 nice(1) 來降低附加至此工作的處理優先順序,使它以低於其他擁有相等 Solaris Resource Manager 配分的工作之順序來執行。

這時財務部已經確保了其資料庫應用程式對此系統有足夠的存取權,並且不會互相影響到對方的工作。財務部同時也在滿足 Joe 的隔夜批次處理工作量的同時,確保了他的工作也不會干擾到與該部門任務息息相關的重要處理。

放置一個網路 (Web) 前端處理

假設您決定要在 Database1 之上放置一個網路前端處理,但又要限制這個應用程式一次不超過 10 位使用者。請使用處理限制功能來達成此目的。

首先,建立一個稱為 ws1 的新 lnode。藉由啟動 ws1 lnode 之下的 Webserver 應用程式,您便可控制可用的處理數目,因此而控制使用中的 http 作業階段數目。

圖 10-3 新增一個網路前端處理

圖表顯示將網路前端處理新增到 db1 lnode 之下。

因為 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 之下的一個節點。要在使用中的雙親及子 lnode 之間分配 CPU 資源,請使用 cpu.myshares 來將某部份的可用資源配置給雙親,以及某部份給子 lnode 。程序限制可用來限制一個 lnode 之上正使用中的作業階段的數目。

新增更多有特殊記憶體需求的使用者

此範例將實施資源控制機制 CPU 共享、處理限制及登入控制,並且會說明用來列印 lnode 與顯示使用中 lnode 的顯示工具。

srmadm

管理 Solaris Resource Manager

limreport

輸出有關選定使用者的資訊

limdaemon

指示常駐程式在達到任何限制時傳送訊息

另一位使用者 Sally,也要求晚間使用機器來執行她的應用程式。因為她的應用程式需要大量的 CPU,為了確保不影響到 Joe 的應用程式,就必須限制 Sally 對虛擬記憶體的使用,包括她的總用量以及"每次處理"的用量:

# limadm set memory.limit=50M sally
# limadm set memory.plimit=25M sally

圖 10-4 新增更多使用者

圖表顯示新增具備特定記憶體限制的更多使用者。

如果當 Sally 的應用程式試著超出其總虛擬記憶體限制或是處理記憶體的限制, limdaemon 指令就會透過主控台來通知 Sally 及系統管理員,告知他們已經超出限制範圍。

使用 limreport 指令來生成一份報告,說明誰在使用系統及其到目前為止的使用情況。最典型的 limreport 使用方法是隨時查看使用機器的人以及他們屬於使用者階層的何處:

% limreport 'flag.real' - uid sgroup lname cpu.shares cpu.usage |sort +1n +0n


註解 -

limreport 有數個參數。在此範例中,核選「flag.real」(僅查看「真實」的 lnodes/UIDs);破折號 ( -) 用於標示輸出格式應該是使用的預設最佳猜測,而「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

跨部門共享一部機器

有另一個開發群組希望購買這部機器的升級 (更多處理機和記憶體),以便交換系統閒置時的存取權。這樣一來兩個群組都會受益。如要進行設定,需再建立一個名為 development 的新群組,而且是在與 databasesbatch 的相同級別上。配置給 development 百分之 33 的機器,因為原始系統上已經新增了百分之 50 的 CPU 功能及記憶體。

圖 10-5 共享一部機器,步驟 1

圖表顯示共享的機器。內容相關文字會在包圍的文字中提供。

開發群組擁有上百位使用者。為避免涉及其資源的分配,請使用管理 Solaris Resource Manager 的旗標功能,好讓開發系統管理員能夠配置其資源。您可以依照雙方的同意來設定操作及開發層級的限制,然後各自設法控制機器屬於您自己的部份。

要為階層新增新的層級,請將群組 operations 新增為一個新的 lnode,並且將 batchdatabases 的雙親群組變更為 operations

# limadm set sgroup=operations batch databases

要設定管理旗標:

# limadm set flag.admin=set operations development

在一般狀況之下,所有的伺服器都必須執行常駐程式及備份處理,它們應被新增至另一個高階的 lnode。


註解 -

請勿使用 root lnode,因為它沒有任何限制。


圖 10-6 共享一部機器,步驟 2

圖表繼續說明共享機器的範例。內容相關文字會在包圍的段落中提供。

如例中所述,您可以使用 Solaris Resource Manager 來整合相同的機器上數種不同類型的使用者及應用程式。您可以明智地使用 CPU 配分控制、虛擬記憶體限制、處理限制及登入控制等功能,確保這些不同的應用程式只接收它們所需的資源。這些限制可以防止應用程式或使用者對任何其他的使用者或使用者群組的應用程式產生不良的影響。Solaris Resource Manager 支援某些簡單的報告製作工具,以讓使用者及系統管理員瞭解在任何一刻和一段時間之內所發生的實際狀況。報告生成的功能可以用來顯示應用程式及群組的資源分割利用,以達到功能規劃及計費目的。