本文是 Unix/Linux系統管理自動化系列中的一篇,主要講述如何實現自動化監控 CPU 的使用狀態。
在 Unix/Linux 系統日常管理和系統維護的過程中,隨時可能需要查看 CPU 的使用狀態,並根據相應信息分析系統狀況,判斷系統的資源使用情況和系統負載情況。本文在介紹 Unix/Linux 系統中 CPU 相關機制和工具的基礎上,對各工具進行了分析比較,並給出了自動化監控系統環境和 CPU 利用率的例子代碼供讀者參考。在 AIX 系統的 CPU 使用狀態監控部分,我們將介紹 lparstat,mpstat 等工具。而在 Linux 系統 CPU 使用狀態監控部分,我們將重點介紹 /proc 文件系統和 ps 等命令。
了解 AIX 系統中的可用 CPU 資源
AIX 系統中每個處理器在低位內存中有著對應的全局數據結構 PPDA (Per-processor Data Area),其中存儲了處理器的各種配置信息和運行狀態,比如時鐘頻率和 CPU 運行時間。AIX 系統介面查詢 PPDA 中的數據並提供給終端用戶或者應用程序使用。但在進行 CPU 監控之前,系統用戶首先需要了解當前的系統環境和可用的計算資源。對於不同的系統環境,用戶需要不同的監控策略。首先,對於沒有劃分微分區 (Micro Partition) 的伺服器,系統用戶可以通過很多操作系統介面得到機器實際可用的資源種類和數量。
硬體和操作系統沒有使用虛擬化技術的系統
$ prtconf | grep Processor Processor Type: PowerPC_POWER6 Processor Implementation Mode: POWER 6 Processor Version: PV_6 Number Of Processors: 4 Processor Clock Speed: 4005 MHz Model Implementation: Multiple Processor, PCI bus + proc0 Processor + proc2 Processor + proc4 Processor + proc6 Processor |
Processor Type 表示了處理器的類型屬於 Power 6 系列。這裡同樣可以知道本機的處理器個數為 4,並且時鐘運行頻率為 4G。運用類似的命令介面,比如 lsdev -Cc processor,也可以得到其他與 CPU 相關的配置信息。
使用微分區的系統
虛擬化作為一項成熟的技術,在 IBM eServer pSeries 伺服器和 BladeCenter JS 刀片伺服器中已經得到廣泛的應用。所以我們有必要簡單說明用戶在常見的虛擬化環境,微分區 (Micro Partition) 中如何得到可用的資源狀態。AIX 的命令介面在虛擬化環境下仍然可以使用,但是通常得到的結果是分配給當前虛擬機的虛擬處理器 (Virtual CPU) 的信息,而不是物理處理器 (Physical CPU) 的。
# prtconf | grep Processor Processor Type: PowerPC_POWER5 Processor Implementation Mode: POWER 5 Processor Version: PV_5 Number Of Processors: 1 Processor Clock Speed: 1654 MHz Model Implementation: Multiple Processor, PCI bus + proc0 |
以上輸出表示本機當前被分配了一個虛擬處理器,及其硬體類型和運行頻率。為了獲得該虛擬機獲得的物理處理器的數量,通常需要訪問對應的 HMC (Hardware Management Console) 或者 AMM (Advanced Management Module) 來獲得詳細的信息和配置。下面的實例運行於 HMC。
hscroot@hmc:~> lssyscfg -r prof -m Server-9117-MMA-SN060DD72 --filter "lpar_ids=p6ml4n05" name=p6ml4n05,lpar_name=p6ml4n05,lpar_id=6,lpar_env=aixlinux, all_resources=0,min_mem=2048,desired_mem=3072,max_mem=4096, min_num_huge_pages=0,desired_num_huge_pages=0, max_num_huge_pages=0,mem_mode=ded,proc_mode=shared,min_proc_units=0.1, desired_proc_units=0.2,max_proc_units=0.3,min_procs=1,desired_procs=1, max_procs=1,sharing_mode=cap,uncap_weight=0,shared_proc_pool_id=0, shared_proc_pool_name=DefaultPool,io_slots=none,lpar_io_pool_ids=none, max_virtual_slots=10, "virtual_serial_adapters=0/server/1/any//any/1,1/server/1/any//any/1", virtual_scsi_adapters=2/client/1/vioserver/16/0,virtual_eth_adapters=none, hca_adapters=none,boot_mode=norm,conn_monitoring=0,auto_start=0, power_ctrl_lpar_ids=none,work_group_id=none,redundant_err_path_reporting=0, bsr_arrays=0,lhea_logical_ports=23000000/2/1/5/none, lhea_capabilities=23000000/0, lpar_proc_compat_mode=default,electronic_err_reporting=null, virtual_fc_adapters=none |
此處跟 CPU 相關的重要欄位有:
使用負載分區的系統
從 AIX 6.1 開始,用戶可以創建並使用負載分區 (Workload Partition,簡稱 WPAR)。負載分區可以模擬一個 AIX 6.1 用戶環境,但在預設情況下,CPU 資源不會被以 dedicated 方式劃分給負載分區。所以 AIX 的系統命令,比如 lsdev 在負載分區下的輸出結果會是當前系統沒有處理器。負載分區中的用戶,在系統響應不夠及時的情況下,通常有如下幾種可能:
後面的段落會具體介紹如何確定和解決負載分區中跟 CPU 相關的系統瓶頸。
獲得 AIX 系統中處理器資源的代碼示例
本段的最後給出一段基於 Perl 的例子代碼,在 AIX5.3 和 6.1 上測試通過,可以偵測當前的系統環境和 CPU 的類型和數量。這段代碼首先運行系統命令 oslevel 得到當前系統的版本,如果是 AIX6.1 則運行命令 lparstat 判斷當前系統是否為 WPAR。無論 AIX 系統的版本如何,都加參數 -i 運行命令 lparstat 來獲得分區的個數,並以此判斷是否使用了微分區技術。最後調用命令 prtconf 輸出 CPU 的一些參數。
該段代碼可以幫助用戶快速了解當前環境,尤其適用於工作環境複雜或頻繁變更的場景。需要指出的是對於使用了微分區技術的系統,代碼的最後輸出的是虛擬處理器的數量。需要了解系統中物理處理器和邏輯處理器狀態的用戶,可以參閱本文其他段落加以補充。
# WPAR僅存在於AIX 6.1系統 my $oslevel = `oslevel`; if ($oslevel =~ m/6\.1/) { # 在WPAR中不帶參數運行lparstat命令只返回警告信息 my $output = `lparstat`; if ($output =~ m/The output is applicable only to the Global Environment/) { print "This machine is one WPAR with following CPU assigned.\n"; system ("prtconf | grep Processor"); exit 0; } } # 使用–i參數列出詳細的配置信息 my @outputs = `lparstat -i`; foreach my $line (@outputs) { # 解析命令輸出並得到分區個數 if ($line !~ m/Partition Number/) {next;} my ($blank, $partition_num) = split /Partition Number\s+:\s/, $line; chomp $partition_num; if ($partition_num eq '-') # full system環境沒有劃分微分區 { print "This machine is one full system without LPARs. The system has following physical CPUs installed.\n"; }elsif ($partition_num > 1) # 如果存在多於一個的分區,該系統使用了微分區技術 { print "This machine is one LPAR with virtual following CPUs installed. To check the assignment of physical CPU, please log on HMC or AMM.\n"; }else { print "Can not decide whether current environment is one LPAR or not. Please check HMC or AMM to decide this.\n"; } } # 列印處理器本身的參數 system ("prtconf | grep Processor"); exit 0; |
使用 AIX 系統工具分析處理器的工作狀態
在了解當前環境的可用 CPU 資源以後,可以對系統監控的對象和方法進行規劃。多數情況下,操作系統提供的命令輸出提供邏輯處理器 (Logical CPU) 的信息。在 IBM eServer pSeries 伺服器和 BladeCenter JS 刀片伺服器中,邏輯處理器通常通過并行多線程技術實現。下文是對該技術在 AIX 系統中應用的介紹。
并行多線程的查詢和設置
并行多線程 (Simultaneous Multi-threading,簡稱 SMT) 是一種基於超標量 (superscalar) 體系結構處理器的技術,允許多個獨立的線程在一個時鐘周期內對多個功能處理單元 (Functional Unit) 發出指令。通常情況下,線程和功能處理單元的綁定是完全動態的。使用這項技術可以較明顯的提高處理器的的實際利用率,進而表現出更強的運算性能。在 AIX 操作系統上,我們可以通過 smtctl 命令來查詢和設置并行多線程的運行狀態。
$ smtctl This system is SMT capable. SMT is currently enabled. SMT boot mode is not set. SMT threads are bound to the same physical processor. proc0 has 2 SMT threads. Bind processor 0 is bound with proc0 Bind processor 1 is bound with proc0 proc2 has 2 SMT threads. Bind processor 2 is bound with proc2 Bind processor 3 is bound with proc2 proc4 has 2 SMT threads. Bind processor 4 is bound with proc4 Bind processor 5 is bound with proc4 proc6 has 2 SMT threads. Bind processor 6 is bound with proc6 Bind processor 7 is bound with proc6 |
[火星人 ] Unix/Linux 系統自動化管理: CPU 管理篇已經有1009次圍觀