亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問板塊 發(fā)新帖
查看: 27701 | 回復(fù): 10
打印 上一主題 下一主題

[系統(tǒng)管理] Unix/Linux 系統(tǒng)自動(dòng)化管理: CPU 管理篇 [復(fù)制鏈接]

論壇徽章:
8
亥豬
日期:2014-02-09 10:55:252015小元宵徽章
日期:2015-03-06 15:57:20數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2015-06-08 22:20:00綜合交流區(qū)版塊每日發(fā)帖之星
日期:2015-06-14 22:20:002015亞冠之阿爾沙巴布
日期:2015-09-01 20:23:45IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-09-04 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-11-04 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-12-04 06:20:00
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-05-03 21:52 |只看該作者 |倒序?yàn)g覽
在 Unix/Linux 系統(tǒng)日常管理和系統(tǒng)維護(hù)的過程中,隨時(shí)可能需要查看 CPU 的使用狀態(tài),并根據(jù)相應(yīng)信息分析系統(tǒng)狀況,判斷系統(tǒng)的資源使用情況和系統(tǒng)負(fù)載情況。本文在介紹 Unix/Linux 系統(tǒng)中 CPU 相關(guān)機(jī)制和工具的基礎(chǔ)上,對(duì)各工具進(jìn)行了分析比較,并給出了自動(dòng)化監(jiān)控系統(tǒng)環(huán)境和 CPU 利用率的例子代碼供讀者參考。在 AIX 系統(tǒng)的 CPU 使用狀態(tài)監(jiān)控部分,我們將介紹 lparstat,mpstat 等工具。而在 Linux 系統(tǒng) CPU 使用狀態(tài)監(jiān)控部分,我們將重點(diǎn)介紹 /proc 文件系統(tǒng)和 ps 等命令。

了解 AIX 系統(tǒng)中的可用 CPU 資源

AIX 系統(tǒng)中每個(gè)處理器在低位內(nèi)存中有著對(duì)應(yīng)的全局?jǐn)?shù)據(jù)結(jié)構(gòu) PPDA (Per-processor Data Area),其中存儲(chǔ)了處理器的各種配置信息和運(yùn)行狀態(tài),比如時(shí)鐘頻率和 CPU 運(yùn)行時(shí)間。AIX 系統(tǒng)接口查詢 PPDA 中的數(shù)據(jù)并提供給終端用戶或者應(yīng)用程序使用。但在進(jìn)行 CPU 監(jiān)控之前,系統(tǒng)用戶首先需要了解當(dāng)前的系統(tǒng)環(huán)境和可用的計(jì)算資源。對(duì)于不同的系統(tǒng)環(huán)境,用戶需要不同的監(jiān)控策略。首先,對(duì)于沒有劃分微分區(qū) (Micro Partition) 的服務(wù)器,系統(tǒng)用戶可以通過很多操作系統(tǒng)接口得到機(jī)器實(shí)際可用的資源種類和數(shù)量。

硬件和操作系統(tǒng)沒有使用虛擬化技術(shù)的系統(tǒng)

清單 1. 運(yùn)行 prtconf 獲得處理器的相關(guān)信息

                                  
$ 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 系列。這里同樣可以知道本機(jī)的處理器個(gè)數(shù)為 4,并且時(shí)鐘運(yùn)行頻率為 4G。運(yùn)用類似的命令接口,比如 lsdev -Cc processor,也可以得到其他與 CPU 相關(guān)的配置信息。

使用微分區(qū)的系統(tǒng)

虛擬化作為一項(xiàng)成熟的技術(shù),在 IBM eServer pSeries 服務(wù)器和 BladeCenter JS 刀片服務(wù)器中已經(jīng)得到廣泛的應(yīng)用。所以我們有必要簡(jiǎn)單說明用戶在常見的虛擬化環(huán)境,微分區(qū) (Micro Partition) 中如何得到可用的資源狀態(tài)。AIX 的命令接口在虛擬化環(huán)境下仍然可以使用,但是通常得到的結(jié)果是分配給當(dāng)前虛擬機(jī)的虛擬處理器 (Virtual CPU) 的信息,而不是物理處理器 (Physical CPU) 的。

清單 2. 在微分區(qū)上運(yùn)行 prtconf 獲得虛擬處理器的信息

                                  
# 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  


以上輸出表示本機(jī)當(dāng)前被分配了一個(gè)虛擬處理器,及其硬件類型和運(yùn)行頻率。為了獲得該虛擬機(jī)獲得的物理處理器的數(shù)量,通常需要訪問對(duì)應(yīng)的 HMC (Hardware Management Console) 或者 AMM (Advanced Management Module) 來獲得詳細(xì)的信息和配置。下面的實(shí)例運(yùn)行于 HMC。

清單 3. 在 HMC 上運(yùn)行 lssyscfg 獲得微分區(qū)的配置

                                  
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 相關(guān)的重要字段有:

    min_proc_units:為了啟動(dòng)該分區(qū)所需的最少的物理處理器個(gè)數(shù)
    desired_proc_units: 該分區(qū)運(yùn)行時(shí)通常需要的物理處理器個(gè)數(shù)
    max_proc_units: 該分區(qū)在運(yùn)行時(shí)允許獲得的最多的物理處理器個(gè)數(shù)

使用負(fù)載分區(qū)的系統(tǒng)

從 AIX 6.1 開始,用戶可以創(chuàng)建并使用負(fù)載分區(qū) (Workload Partition,簡(jiǎn)稱 WPAR)。負(fù)載分區(qū)可以模擬一個(gè) AIX 6.1 用戶環(huán)境,但在缺省情況下,CPU 資源不會(huì)被以 dedicated 方式劃分給負(fù)載分區(qū)。所以 AIX 的系統(tǒng)命令,比如 lsdev 在負(fù)載分區(qū)下的輸出結(jié)果會(huì)是當(dāng)前系統(tǒng)沒有處理器。負(fù)載分區(qū)中的用戶,在系統(tǒng)響應(yīng)不夠及時(shí)的情況下,通常有如下幾種可能:

    負(fù)載分區(qū)本身被分配的資源不足
    負(fù)載分區(qū)的其對(duì)應(yīng)的宿主機(jī)的負(fù)載過大,或者出現(xiàn)了 IO 瓶頸

后面的段落會(huì)具體介紹如何確定和解決負(fù)載分區(qū)中跟 CPU 相關(guān)的系統(tǒng)瓶頸。

獲得 AIX 系統(tǒng)中處理器資源的代碼示例

本段的最后給出一段基于 Perl 的例子代碼,在 AIX5.3 和 6.1 上測(cè)試通過,可以偵測(cè)當(dāng)前的系統(tǒng)環(huán)境和 CPU 的類型和數(shù)量。這段代碼首先運(yùn)行系統(tǒng)命令 oslevel 得到當(dāng)前系統(tǒng)的版本,如果是 AIX6.1 則運(yùn)行命令 lparstat 判斷當(dāng)前系統(tǒng)是否為 WPAR。無論 AIX 系統(tǒng)的版本如何,都加參數(shù) -i 運(yùn)行命令 lparstat 來獲得分區(qū)的個(gè)數(shù),并以此判斷是否使用了微分區(qū)技術(shù)。最后調(diào)用命令 prtconf 輸出 CPU 的一些參數(shù)。

該段代碼可以幫助用戶快速了解當(dāng)前環(huán)境,尤其適用于工作環(huán)境復(fù)雜或頻繁變更的場(chǎng)景。需要指出的是對(duì)于使用了微分區(qū)技術(shù)的系統(tǒng),代碼的最后輸出的是虛擬處理器的數(shù)量。需要了解系統(tǒng)中物理處理器和邏輯處理器狀態(tài)的用戶,可以參閱本文其他段落加以補(bǔ)充。

清單 4. 獲得當(dāng)前的系統(tǒng)環(huán)境和 CPU 的類型和數(shù)量的代碼示例

                                  
# WPAR 僅存在于 AIX 6.1 系統(tǒng)
my $oslevel =  `oslevel`;
if ($oslevel =~ m/6\.1/)
{
# 在 WPAR 中不帶參數(shù)運(yùn)行 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 參數(shù)列出詳細(xì)的配置信息
my @outputs = `lparstat -i`;
foreach my $line (@outputs)
{
    # 解析命令輸出并得到分區(qū)個(gè)數(shù)
    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 環(huán)境沒有劃分微分區(qū)
    {
        print "This machine is one full system without LPARs. The system has following
        physical CPUs installed.\n";
    }elsif ($partition_num > 1) # 如果存在多于一個(gè)的分區(qū),該系統(tǒng)使用了微分區(qū)技術(shù)
    {
        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";
    }
}

# 打印處理器本身的參數(shù)
system ("prtconf | grep Processor");
exit 0;

使用 AIX 系統(tǒng)工具分析處理器的工作狀態(tài)

在了解當(dāng)前環(huán)境的可用 CPU 資源以后,可以對(duì)系統(tǒng)監(jiān)控的對(duì)象和方法進(jìn)行規(guī)劃。多數(shù)情況下,操作系統(tǒng)提供的命令輸出提供邏輯處理器 (Logical CPU) 的信息。在 IBM eServer pSeries 服務(wù)器和 BladeCenter JS 刀片服務(wù)器中,邏輯處理器通常通過并行多線程技術(shù)實(shí)現(xiàn)。下文是對(duì)該技術(shù)在 AIX 系統(tǒng)中應(yīng)用的介紹。

并行多線程的查詢和設(shè)置

并行多線程 (Simultaneous Multi-threading,簡(jiǎn)稱 SMT) 是一種基于超標(biāo)量 (superscalar) 體系結(jié)構(gòu)處理器的技術(shù),允許多個(gè)獨(dú)立的線程在一個(gè)時(shí)鐘周期內(nèi)對(duì)多個(gè)功能處理單元 (Functional Unit) 發(fā)出指令。通常情況下,線程和功能處理單元的綁定是完全動(dòng)態(tài)的。使用這項(xiàng)技術(shù)可以較明顯的提高處理器的的實(shí)際利用率,進(jìn)而表現(xiàn)出更強(qiáng)的運(yùn)算性能。在 AIX 操作系統(tǒng)上,我們可以通過 smtctl 命令來查詢和設(shè)置并行多線程的運(yùn)行狀態(tài)。

清單 5. 運(yùn)行 smtctl 查詢處理器對(duì) SMT 技術(shù)的支持和當(dāng)前的設(shè)置

                                  
$ 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


命令的結(jié)果說明了當(dāng)前系統(tǒng)支持 SMT 技術(shù),而且當(dāng)前正在使用。后面的多行輸出中詳細(xì)說明了邏輯處理器和虛擬處理器之間的對(duì)應(yīng)關(guān)系。系統(tǒng)中有四個(gè)可用的虛擬處理器 (Virtual CPU),因?yàn)殚_啟了 SMT (Simultaneous MultiThreading) 功能,可以識(shí)別出八個(gè)邏輯上的虛擬處理器 (Logical CPU)。

在缺省情況下,系統(tǒng)中的 SMT 應(yīng)被使用以增強(qiáng)性能。當(dāng)用戶需要調(diào)整系統(tǒng)的 SMT 設(shè)置時(shí),同樣可以使用 smtctl 命令。具體參數(shù)請(qǐng)查閱命令說明。在負(fù)載分區(qū)情況下,SMT 設(shè)置不允許被直接修改。用戶需要對(duì)負(fù)載分區(qū)的宿主機(jī)修改 SMT 配置,這會(huì)對(duì)該系統(tǒng)中的所有負(fù)載分區(qū)生效。而在微分區(qū)環(huán)境下,用戶可以自主調(diào)整并行多線程的配置。

系統(tǒng)處理器負(fù)載的查詢和分析

在了解系統(tǒng)中并行多線程的設(shè)置以后,用戶需要得到不同時(shí)間段內(nèi)處理器的使用狀態(tài)。為此 AIX 系統(tǒng)提供了豐富的系統(tǒng)接口。用戶可以根據(jù)不同的情況選用他們,檢查和判斷系統(tǒng)中 CPU 的運(yùn)行狀態(tài)。本文僅以 lparstat 和 mpstat 為例進(jìn)行說明。

lparstat 命令

上文的例子代碼使用了 lparstat。這個(gè)命令可以在各種系統(tǒng)環(huán)境,如負(fù)載分區(qū)中使用,得到當(dāng)前系統(tǒng)的配置和部分運(yùn)行狀態(tài),其中的部分內(nèi)容與 CPU 直接相關(guān)。在 AIX 6.1 操作系統(tǒng)中,lparstat 也可以用來顯示負(fù)載分區(qū) (Workload Partition) 的信息,比如負(fù)載分區(qū)使用的 CPU 資源。用戶可以查閱手冊(cè)得到該命令的詳細(xì)說明。

lparstat 命令非常適合獲得當(dāng)前系統(tǒng)或分區(qū)的配置信息,但是用來監(jiān)控 CPU 負(fù)載有兩個(gè)主要的不足。首先這條命令不能得到單個(gè)處理器的負(fù)載情況,所以不能用來直接確定多處理器負(fù)載不均的問題;其次這條命令在 AIX 6.1 系統(tǒng)上的支持的參數(shù)與 5.3 相比變化較大。所以本文主要介紹 mpstat 命令,用于檢測(cè) AIX 系統(tǒng)中的 CPU 狀態(tài)。

mpstat 命令

與 lparstat 命令相似,mpstat 可以自動(dòng)識(shí)別當(dāng)前的系統(tǒng)設(shè)置,比如是否開啟了 SMT 功能。與 lparstat 不同的是,mpstat 可以得到詳細(xì)的單個(gè)處理器的運(yùn)行狀況。


圖 1. 在沒有微分區(qū) (Micro Partition) 的系統(tǒng)上運(yùn)行 mpstat 獲得處理器負(fù)載

該命令檢測(cè)系統(tǒng)中全部處理器的利用情況,并且給出各項(xiàng)的總和。下面是幾個(gè)常用的輸出項(xiàng)

    lcpu: 工作的邏輯處理器的個(gè)數(shù)
    us: 運(yùn)行的用戶程序所占用的 CPU 百分比
    sy: 運(yùn)行的內(nèi)核程序所占用的 CPU 百分比
    wa: CPU 用來等待 IO 所占用的百分比
    id: CPU 空閑且不等待 IO 所占用的百分比

通常情況下,CPU0 的負(fù)載會(huì)略高于其他處理器。在其他處理器負(fù)載相差不多而且 CPU0 的負(fù)載不太高的情況下,可以認(rèn)為是正常的情況。反之則可能存在系統(tǒng)或應(yīng)用程序上的分配問題。

在顯示的內(nèi)容中,如果 wa 的值過高,則表示應(yīng)用程序有過多的時(shí)間等待 IO 操作,外存的訪問存在性能瓶頸。如果 id 的值如果持續(xù)低于 30,而且 wa 不高,則表明 CPU 比較繁忙 , 可以考慮對(duì)應(yīng)用程序進(jìn)行優(yōu)化。如果是微分區(qū)或負(fù)載分區(qū)系統(tǒng)中,應(yīng)當(dāng)考慮是否需要分配更多的處理器資源。

mpstat 命令提供了參數(shù),可以周期性的檢測(cè)并匯報(bào)系統(tǒng)狀態(tài)。在 mpstat 命令的輸出滿足用戶需要的情況下,用戶可以指定合適的間隔并以后臺(tái)運(yùn)行 mpstat,以實(shí)現(xiàn)對(duì)系統(tǒng) CPU 的持續(xù)監(jiān)控。下面的命令會(huì)在一天的時(shí)間內(nèi)每隔半小時(shí)自動(dòng)搜集一次系統(tǒng)信息。

mpstat 1800 48 > /tmp/mpstat_output &

用戶可以有策略的檢查輸出文件中的內(nèi)容,以確定系統(tǒng)的運(yùn)行狀態(tài)。

捕捉處理器異常狀態(tài)的代碼示例

下面一段 Perl 代碼測(cè)試于 AIX5.3 和 6.1 系統(tǒng),首先運(yùn)行系統(tǒng)命令 smtctl 檢查并行多線程技術(shù)的開啟狀態(tài),然后依次檢查 mpstat 命令輸出文件中的每行內(nèi)容,并把可能表示異常情況的行存入一個(gè)數(shù)組。

清單 6. 捕捉處理器異常狀態(tài)的代碼示例

                                  
my $output = `smtctl`;
# 如果 SMT 技術(shù)沒有被激活,通常我們需要激活它
if ($output =~ m/This system is SMT capable.*SMT is currently disabled/)
{
    warn "This system can have SMT enabled, but has not. This means potential performance
     issue in some applications. Command smtctl can be used to enable SMT. Notice that
      change can NOT be directly done on workload partition.\n";
}

# 解析文本文件 /tmp/mpstat_output。用戶應(yīng)該先運(yùn)行 mpstat 并把輸出重定向來得到這個(gè)文件。
my $file = '/tmp/mpstat_output';
open (FILE, "<$file") or die "No mpstat output file available.
Please run mpstat first.\n";
my @output = <FILE>;
close FILE;
my @notice;
foreach my $line (@output)
{
    chomp $line;
# 跳過空行和提示行
if ($line !~ /\S+/) {next;}
    if ($line =~ m/System configuration/ || $line =~/cpu\s+min/) {next;}

    # 刪除每行起始的空格
    $line =~ s/^\s+//g;
    my ($cpu, $min, $maj, $mpc, $int, $cs, $ics, $rq, $mig, $lpa, $sysc, $us, $sy,
     $wt, $id, $pc);
        = split /\s+/, $line;
    # 通常系統(tǒng)中不應(yīng)有過長(zhǎng)的運(yùn)行隊(duì)列,過多的線程遷移,過長(zhǎng)的等待時(shí)間或過少的空閑時(shí)間
if ($rq > 5 || $mig > 5 || $wt > 5 || $id < 10)
    {
        push @notice, $line;
}
}



用戶可以根據(jù)自己系統(tǒng)的版本對(duì)例子代碼進(jìn)行修改,并且選擇如何處理這些異常。比較常見的處理有把異常內(nèi)容在標(biāo)準(zhǔn)輸出設(shè)備上輸出,或者發(fā)郵件給系統(tǒng)的管理員。為了能夠自動(dòng)的實(shí)現(xiàn)這一功能,用戶也可以把修改過的腳本定義成系統(tǒng)的 crontab 任務(wù),實(shí)現(xiàn)在一定時(shí)間段內(nèi)的定時(shí)監(jiān)控。在發(fā)現(xiàn)了異常狀態(tài)以后,通常需要確定異常狀態(tài)是否與特定的進(jìn)程或程序相關(guān),再進(jìn)一步對(duì)操作系統(tǒng)或特定進(jìn)程進(jìn)行判斷。在對(duì) AIX 系統(tǒng)中的 CPU 管理進(jìn)行介紹以后,下文的討論會(huì)以 Linux 為主。

論壇徽章:
8
亥豬
日期:2014-02-09 10:55:252015小元宵徽章
日期:2015-03-06 15:57:20數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2015-06-08 22:20:00綜合交流區(qū)版塊每日發(fā)帖之星
日期:2015-06-14 22:20:002015亞冠之阿爾沙巴布
日期:2015-09-01 20:23:45IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-09-04 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-11-04 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-12-04 06:20:00
2 [報(bào)告]
發(fā)表于 2012-05-03 21:53 |只看該作者
了解 Linux 系統(tǒng)中的可用 CPU 資源

Linux 系統(tǒng)由于其開放性的優(yōu)勢(shì),近年來在易用性,穩(wěn)定性和市場(chǎng)占有率上獲得了一定的進(jìn)步。Linux 提供了一個(gè)特殊而強(qiáng)大的偽文件系統(tǒng) proc。在設(shè)計(jì)之初,proc 的目的是用戶能夠方便快捷的訪問進(jìn)程。經(jīng)過長(zhǎng)時(shí)間的發(fā)展,proc 文件系統(tǒng)已經(jīng)可以提供查詢系統(tǒng)狀態(tài),例如 CPU 狀態(tài),更改系統(tǒng)參數(shù)等多方面的功能。

在絕大多數(shù)的 Linux 發(fā)行版中,/proc 文件系統(tǒng)在系統(tǒng)啟動(dòng)時(shí)缺省掛載到目錄 /proc,作為操作系統(tǒng)和應(yīng)用進(jìn)程的接口。用戶和應(yīng)用程序可以通過 proc 得到系統(tǒng)的信息,并可以改變內(nèi)核的某些參數(shù)。/proc 目錄中包含了許多特殊文件以允許對(duì)驅(qū)動(dòng)和內(nèi)核信息進(jìn)行高層訪問。只要用戶或應(yīng)用程序有正確的訪問權(quán)限,它們就可以通過讀寫這些文件來獲得信息或設(shè)置參數(shù)。由于 Linux 系統(tǒng)的狀態(tài),如進(jìn)程占用的資源,是動(dòng)態(tài)改變的,所以用戶或應(yīng)用程序讀取 proc 文件時(shí),proc 文件系統(tǒng)是動(dòng)態(tài)從系統(tǒng)內(nèi)核讀出所需信息并提交的。當(dāng)系統(tǒng)重啟或者電源關(guān)閉的時(shí)候,/proc 系統(tǒng)中原有的數(shù)據(jù)和信息將全部丟失。但在下次系統(tǒng)啟動(dòng)時(shí)會(huì)重新建立。下面會(huì)介紹與 CPU 直接相關(guān)的兩個(gè) /proc 文件,cpuinfo 和 loadavg。

文件 /proc/cpuinfo 存放了 Linux 系統(tǒng)的 CPU 信息。隨著 Linux 發(fā)行版,CPU 的類型、設(shè)置的不同,該文件的內(nèi)容會(huì)有比較大的差異。有些發(fā)行版本的 cpuinfo 文件包含了諸如 CPU 步進(jìn) (stepping),制造廠商等詳細(xì)的 CPU 硬件信息。而在一部分發(fā)行版中,該文件僅包含了每個(gè)處理器的基本信息,比如時(shí)鐘頻率。需要用戶注意的是,在使用了 SMT 技術(shù)的系統(tǒng)上,/proc/cpuinfo 顯示的是邏輯處理器的個(gè)數(shù)和屬性。

清單 7. 在 IBM JS BladeCenter 上讀取 /proc/cpuinfo

                                  
# cat /proc/cpuinfo
processor       : 0
CPU             : POWER6 (raw), altivec supported
clock           : 4005.000000MHz
revision        : 3.1 (pvr 003e 0301)

processor       : 1
CPU             : POWER6 (raw), altivec supported
clock           : 4005.000000MHz
revision        : 3.1 (pvr 003e 0301)

processor       : 2
CPU             : POWER6 (raw), altivec supported
clock           : 4005.000000MHz
revision        : 3.1 (pvr 003e 0301)

processor       : 3
CPU             : POWER6 (raw), altivec supported
clock           : 4005.000000MHz
revision        : 3.1 (pvr 003e 0301)

processor       : 4
CPU             : POWER6 (raw), altivec supported
clock           : 4005.000000MHz
revision        : 3.1 (pvr 003e 0301)

processor       : 5
CPU             : POWER6 (raw), altivec supported
clock           : 4005.000000MHz
revision        : 3.1 (pvr 003e 0301)

processor       : 6
CPU             : POWER6 (raw), altivec supported
clock           : 4005.000000MHz
revision        : 3.1 (pvr 003e 0301)

processor       : 7
CPU             : POWER6 (raw), altivec supported
clock           : 4005.000000MHz
revision        : 3.1 (pvr 003e 0301)
clock           : 4005.000000MHz
revision        : 3.1 (pvr 003e 0301)

timebase        : 512000000
platform        : pSeries
model           : IBM,7998-61X
machine         : CHRP IBM,7998-61X


Linux 支持眾多的硬件類型,并且有很多有差異的發(fā)行版。沒有統(tǒng)一的命令可以得到或查詢 SMT 的狀態(tài)。但在基于 Power 核心的 IBM 服務(wù)器上,可以使用 ppc_64 命令。

清單 8. 使用 ppc_64 命令獲得 SMT 的設(shè)置

                                  
# ppc64_cpu --smt
smt is on


這條命令同樣可以用來改變 SMT 的設(shè)置,詳細(xì)用法請(qǐng)參閱命令說明。

在了解到 SMT 被開啟以后分析 /proc/cpuinfo 文件的內(nèi)容?梢钥吹较到y(tǒng)中共有八個(gè)邏輯處理器 (Logical CPU),所以物理處理器的個(gè)數(shù)是 8 / 2 = 4。它們都是 IBM pSeries 系列的 Power 6 處理器,支持 Altivec 指令集,運(yùn)行于 4GHz,修訂版本為 3.1,基準(zhǔn)時(shí)鐘頻率 (time base) 為 512MHz。在文件最后的內(nèi)容表示了機(jī)器的硬件類型 7998-61X。查詢 IBM 網(wǎng)站可知這是 IBM BladeCenter JS22 的刀片服務(wù)器。

因?yàn)?IBM 的微分區(qū)技術(shù)構(gòu)建于 Linux 系統(tǒng)之下,所以為了獲得微分區(qū)的被分配的物理處理器個(gè)數(shù),需要訪問 HMC(Hardware Management Console) 或 AMM(Advanced Management Module)。具體使用可參閱本文的 AIX 部分或者 IBM 的使用說明。

從 2.6.20 開始,Linux 內(nèi)核引入了 KVM (Kernel-based Virtual Machine) 作為標(biāo)準(zhǔn)的虛擬化解決方案。在 KVM 中 /proc/cpuinfo 的內(nèi)容會(huì)與宿主機(jī)不同,一些情況下可以幫助用戶知道當(dāng)前的系統(tǒng)是否是 KVM 下的虛擬環(huán)境

清單 9. 在 KVM 的虛擬機(jī)中讀取 /proc/cpuinfo

                                  
# cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
CPU family      : 6
model           : 2
model name      : QEMU Virtual CPU version 0.9.1
stepping        : 3
CPU MHz         : 2660.129
cache size      : 2048 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
CPUid level     : 2
wp              : yes
flags           : fpu de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36
                   clflush mmx fxsr sse sse2 nx lm up pni
bogomips        : 5326.47


在模式名 (model name) 中可以知道,本機(jī)使用了基于 QEMU 模擬器的虛擬處理器。

IBM 的 System x 系列服務(wù)器使用了不同的硬件類型,用戶可以僅通過讀取 /proc/cpuinfo 的內(nèi)容獲得包括 SMT 等的系統(tǒng)設(shè)置。

獲得系統(tǒng)處理器配置的代碼示例

下面的例子代碼適用于使用 Power CPU 或者 Intel CPU 的 Linux 系統(tǒng),并在 Redhat 企業(yè)服務(wù)器版和 Suse 企業(yè)服務(wù)器版上測(cè)試通過。它首先運(yùn)行命令 arch 判斷當(dāng)前系統(tǒng)的運(yùn)行平臺(tái),并讀取 /proc/cpuinfo 文件。在 Power 平臺(tái)上調(diào)用特有的 ppc64_cpu 命令獲得 SMT 配置,并讀取 /proc/ppc64/lparcfg 文件以獲得 CPU 的運(yùn)行模式;在 System x 系列服務(wù)器上則是通過解析文件 /proc/cpuinfo 的內(nèi)容來獲得 SMT 配置。代碼的最后依次輸出了系統(tǒng)中 CPU 資源的數(shù)量、配置、運(yùn)行模式和類型。

清單 10. 獲取系統(tǒng) CPU 資源配置的代碼示例

                                  
# 得到 /proc/cpuinfo 文件的內(nèi)容
my $cpu_file = '/proc/cpuinfo';
open FILE, "<$cpu_file" or die "Failed to open $cpu_file.\n";
my @contents = <FILE>;
close FILE;

my ($smt, $dedicate);
# Power 服務(wù)器上運(yùn)行的 Linux 發(fā)行版有自己的命令和配置文件
my $arch = `arch`;
if ($arch =~ /ppc64/){
    # 得到 Power 服務(wù)器上的 SMT 配置
    my $output = `ppc64_cpu --smt`;
    if ($output =~ m/off/){
        $smt = "off";
    }elsif ($output =~ m/on/){
        $smt = "on";
    }else{
        die "Command ppc64_cpu does not work well. Please reinstall powerpc-utils
        to fix this issue.\n";
    }

    # 從 lparcfg 文件讀出處理器運(yùn)行模式
    my $cfg_file = '/proc/ppc64/lparcfg';
    open FILE, "<$cfg_file" or die "Failed to open $cfg_file.\n";
    my @cfgs = <FILE>;
    close FILE;

    foreach my $line (@cfgs){
        if ($line =~ /shared_processor_mode=0/){
            $dedicate = 1; # dedicated CPU
            last;
        }
    }
}

# 解析 /proc/cpuinfo 文件的內(nèi)容
my $proc_num = 0;
my $line_num = 0;
my (@physical_ids, $latest_proc_line_num);
foreach my $line (@contents){
    $line_num ++;
chomp $line;
# 得到虛擬處理器的個(gè)數(shù)
    if ($line =~ /processor\s+: \d/){
        $proc_num ++;
        $latest_proc_line_num = $line_num;
    }
    if ($arch =~ /86/ && $line =~ /physical id/ && !grep (/^\Q$line\E$/, @physical_ids)){
        push @physical_ids, $line;
    }
}

# 得到 x86 構(gòu)架系統(tǒng)的 SMT 配置
my $phy_proc_num = scalar(@physical_ids);
if ($arch =~ /86/ && ($proc_num > $phy_proc_num)){
    $smt = "on";
}elsif ($arch =~ /86/ && ($proc_num == $phy_proc_num)){
    $smt = "off";
}

# 得到 Power 服務(wù)器的虛擬處理器個(gè)數(shù)
my $vir_proc_num;
if ($arch =~ /ppc64/ && $smt eq "on"){
    $vir_proc_num = $proc_num/2;
}elsif ($arch =~ /ppc64/ && $smt eq "off"){
    $vir_proc_num = $proc_num;
}

# 輸出處理器個(gè)數(shù)
if ($arch =~ /86/){
    print "There exist $phy_proc_num physical processors and $proc_num logical
    processors in the system.\n";
}elsif ($arch =~ /ppc64/){
    print "There exist $vir_proc_num virtual processors and $proc_num logical
    processors in the system.\n";
}

# 輸出 SMT 配置
if ($smt eq "on"){
    print "SMT is $smt on this machine.\n";
}else{
    print "SMT is $smt on this machine. This means potential performance issue in some
    applications. Please make sure that's the configuration you want.\n";
}

# 輸出處理器運(yùn)行模式
if ($arch =~ /ppc64/ && $dedicate){
    print "System processors are dedicated.\n";
}elsif ($arch =~ /ppc64/ && !$dedicate){
    print "System processors are shared.\n";
}

# 輸出 /proc/cpuinfo 中的處理器關(guān)鍵信息
for (my $i = $latest_proc_line_num; $i < scalar(@contents); $i ++){
    print "$contents[$i]\n";

使用 Linux 系統(tǒng)接口分析處理器的工作狀態(tài)

因?yàn)?Linux 系統(tǒng)特有的開放性,用戶可以自主的添加,定義或者改變系統(tǒng)原有的功能。有很多開源項(xiàng)目提供了基于圖形的或者命令行的工具,幫助用戶更加方便的識(shí)別、監(jiān)控甚至改變系統(tǒng)中的處理器的運(yùn)行狀態(tài)?紤]到通用的原則,本文僅介紹常見 Linux 發(fā)行版本中已經(jīng)集成的接口或者工具。

系統(tǒng)處理器負(fù)載的查詢和分析

查看 /proc/stat 文件獲得 CPU 狀態(tài)

/proc/stat 的內(nèi)容包含了系統(tǒng)中的各項(xiàng)基本信息,例如 CPU 狀態(tài)。用戶可以詳細(xì)了解系統(tǒng)中每個(gè)處理器自系統(tǒng)啟動(dòng)以來的運(yùn)行狀態(tài),并以此分析和評(píng)估應(yīng)用環(huán)境的工作是否正常。

清單 11. 讀取 /proc/stat 獲得 CPU 的使用情況

                                  
# cat /proc/stat
cpu  507853 325 148706 190270813 190032 152 884 0 0
cpu0 178463 111 68890 95035802 93558 34 96 0 0
cpu1 329389 213 79816 95235010 96474 117 787 0 0
intr 93566218 3310 2 0 0 2 0 3 0 30 0 0 0 4 0 1623929 10015567 2440 20098 0 0 0 0 0 0 0
3712917 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0


0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 202868862
btime 1242974927
processes 356350
procs_running 1
procs_blocked 0



命令輸出的最初幾行包含了系統(tǒng)中所有 CPU 的活動(dòng)信息,在 kernel2.6.29 下的 /proc/stat 中,每行內(nèi)容的處理器名后有九個(gè)數(shù)字,而早期的 kernel 會(huì)缺失一些內(nèi)容,比如與虛擬化相關(guān)的信息。所有這些數(shù)值都是從系統(tǒng)啟動(dòng)開始累計(jì)到當(dāng)前時(shí)刻的,并以 0.01 秒為單位。以下是這些數(shù)值的解釋

    user: 用戶模式占用的 CPU 時(shí)間
    nice: 低優(yōu)先級(jí)用戶模式所占用的 CPU 時(shí)間
    system: 系統(tǒng)核心態(tài)占用的 CPU 時(shí)間
    idle:cpu 空閑時(shí)間
    iowait:硬盤 IO 等待時(shí)間 ( 從 kernel 2.5.41 開始添加此項(xiàng)信息 )
    irq:硬中斷時(shí)間 ( 叢 kernel 2.6.0-test4 開始添加此項(xiàng)信息 )
    softirq:軟中斷時(shí)間(同上)
    steal:在虛擬環(huán)境下,處理其他作業(yè)系統(tǒng)占用的 cpu 時(shí)間(叢 kernel 2.6.11 開始添加此項(xiàng)信息)
    guest: 作業(yè)系統(tǒng)運(yùn)行虛擬 cpu 占用 cpu 的時(shí)間(叢 kernel2.6.24 開始添加此項(xiàng)信息)

根據(jù) /proc/stat 文件的內(nèi)容,用戶可以自行計(jì)算任意時(shí)間段內(nèi) CPU 的占用率;

CPU 時(shí)間 =user+system+nice+idle+iowait+irq+softirq+steal+guest

選取兩個(gè)時(shí)間點(diǎn) T1 和 T2, CPU 在 T1 和 T2 時(shí)間段中的使用時(shí)間可以如下計(jì)算:

Total=(user2+system2+nice2+idle2+iowait2+irq2+softirq2+steal2+guest2)-( user1+system1+nice1+idle1+iowait1+irq1+softirq1+steal1+guest1)

CPU 空閑百分比:

idle = (idle2 - idle1) / Total * 100%

CPU 占用百分比:

occupy = (1 - idle) * 100%

除了最初的 CPU 行以外,/proc/stat 文件還有其他與系統(tǒng)性能相關(guān)的一些參數(shù)。其中 ctxt 是系統(tǒng)啟動(dòng)以來 CPU 發(fā)生的上下文交換的次數(shù)。

讀取 /proc/loadavg 文件獲得 CPU 狀態(tài)

文件 /proc/loadavg 給出了特定時(shí)間間隔內(nèi)運(yùn)行隊(duì)列的平均進(jìn)程數(shù)。同時(shí)也給出了其他的一些狀態(tài)參數(shù)值供內(nèi)部和外部的系統(tǒng)調(diào)用使用。命令 uptime 就讀取了該文件以獲得 CPU 上的進(jìn)程負(fù)載。

清單 12. 讀取 /proc/loadavg 獲得處理器上的進(jìn)程負(fù)載

                                  
# cat /proc/loadavg
5.86 5.78 5.89 12/840 22261


命令輸出前三項(xiàng)分別表示最近 1 分鐘,最近 5 分鐘及最近 15 分鐘運(yùn)行隊(duì)列中的平均進(jìn)程數(shù),第四項(xiàng)包括由斜線隔開的兩個(gè)數(shù)值,前者表示當(dāng)前正由內(nèi)核調(diào)度的進(jìn)程和線程的數(shù)目,后者表示系統(tǒng)當(dāng)前存活的進(jìn)程數(shù)目;第五個(gè)值表示此文件被查看前,最近一個(gè)由內(nèi)核創(chuàng)建的進(jìn)程的 PID。

利用 ps 命令

系統(tǒng)處理器的工作是處理任務(wù)。而在現(xiàn)代操作系統(tǒng)中,任務(wù)是以進(jìn)程的形式表現(xiàn)的。所以定位分析系統(tǒng)處理器的問題,也需要用到進(jìn)程相關(guān)的接口或指令。ps 命令是分析 CPU 狀態(tài)的重要工具,它讀取 /proc 文件系統(tǒng)中各進(jìn)程的信息,并且加以顯示。用戶首先需要定位感興趣的進(jìn)程,這可以通過 ps 命令來確定,也可以結(jié)合其他系統(tǒng)工具。很多情況下,用戶僅需關(guān)注某個(gè)或某幾個(gè)進(jìn)程。

清單 13. 使用 ps 選出占用 CPU 時(shí)間最多的五個(gè)進(jìn)程

                                  
[root@bldlnx02 ~]# ps -e -o pcpu,pid,user,sgi_p,cmd |grep -v PID| sort -k 1| tail -5
0.0     8 root     * [khelper]
0.0     9 root     * [kacpid]
0.1 21949 root     * sshd: csm@pts/0
0.2 21951 root     * -bash
99.9 12392 root     * /usr/bin/Xvnc -inetd -query 127.0.0.1 -once -depth 24
-desktop VNC Session Manager -rfbauth /root/.vnc/passwd -geometry 640x480


系統(tǒng)中通常會(huì)有多進(jìn)程的程序運(yùn)行。當(dāng)這些進(jìn)程占用了較多的 CPU 時(shí)間時(shí),可以單獨(dú)列出該程序的所有進(jìn)程。多數(shù)情況下,用戶也需要進(jìn)程的啟動(dòng)時(shí)間,狀態(tài),父進(jìn)程號(hào) (PPID),占用的內(nèi)存來分析系統(tǒng)和進(jìn)程的狀態(tài)。

清單 14. 通過進(jìn)程名使用 ps 命令返回進(jìn)程的主要屬性

                                  
# ps -C nfsd -o cmd,pCPU,start_time,user,ppid,size,stat
CMD                         %CPU START USER      PPID    SZ STAT
[nfsd]                       0.0 May12 root         1     0 D
[nfsd]                       0.0 May12 root         1     0 D
[nfsd]                       0.0 May12 root         1     0 D
[nfsd]                       0.0 May12 root         1     0 D
[nfsd]                       0.0 May12 root         1     0 S
[nfsd]                       0.0 May12 root         1     0 S
[nfsd]                       0.0 May12 root         1     0 D
[nfsd]                       0.0 May12 root         1     0 D


在以上輸出中各個(gè)字段分別表示如下含義:

    CMD 進(jìn)程命令名
    %CPU 進(jìn)程占用的 CPU 百分比
    START 進(jìn)程啟動(dòng)的時(shí)間
    USER 進(jìn)程的屬主
    PPID 父進(jìn)程號(hào)
    SZ 進(jìn)程占用的內(nèi)存空間
    STAT 進(jìn)程狀態(tài)

ps 命令的輸出結(jié)果表示系統(tǒng)中共有八個(gè) nfs 服務(wù)進(jìn)程,是根用戶在一天以前啟動(dòng)的。當(dāng)前這些進(jìn)程沒有使用 CPU 時(shí)間或內(nèi)存。并且分別處于不同的狀態(tài)。ps 命令可以接受的狀態(tài)種類共有七種,僅介紹清單 15 中的兩個(gè)作為示例

    D 無法中斷的休眠狀態(tài)(通常 IO 的進(jìn)程)
    S 處于休眠狀態(tài)

可以看到有六個(gè) nfs 服務(wù)進(jìn)程處于無法中斷的休眠狀態(tài),這表示 NFS 服務(wù)出現(xiàn)了問題。用戶可以通過檢查物理存儲(chǔ)可用性,查看 /var/log/messages 文件或 sysrq-T 系統(tǒng) trace 等手段來進(jìn)一步定位和排查錯(cuò)誤。

獲得各處理器利用率和耗用處理器時(shí)間最多的進(jìn)程的代碼示例

本段的最后給出一段例子代碼,可以獲得一段時(shí)間內(nèi)的 CPU 利用率,并且找出系統(tǒng)中占用 CPU 較多的進(jìn)程,已在 Redhat 企業(yè)服務(wù)器和 Suse 企業(yè)服務(wù)器上測(cè)試通過。代碼首先選取兩個(gè)相隔一分鐘的兩個(gè)時(shí)間段,分別讀取文件 /proc/stat 的內(nèi)容,獲得 CPU 在兩個(gè)時(shí)刻的進(jìn)程占用時(shí)間等數(shù)值來計(jì)算 CPU 利用率。并且讀取文件 /proc/loadavg 獲得處理器上的集成負(fù)載。在負(fù)載較高的情況下,調(diào)用命令 ps 找出消耗 CPU 最多的幾個(gè)進(jìn)程,及其所在的處理器(processor)。

清單 15.  獲得各處理器的利用率和耗用處理器時(shí)間最多的進(jìn)程代碼示例

                                  
# 兩次讀取 /proc/stat 文件的內(nèi)容
my $file = '/proc/stat';
open FILE, "<$file" or die "Failed to open file $file.\n";
my @fir_contents = <FILE>;
close FILE;

sleep 60;
open FILE, "<$file" or die "Failed to open file $file.\n";
my @sec_contents = <FILE>;
close FILE;

# 把 /proc/stat 文件的內(nèi)容存入一個(gè)散列
my (%cpuinfo);
my $cpu_num = 0;
my $line_num = 0;
foreach my $line (@fir_contents, @sec_contents){
    $line_num ++;
    if ($line =~ m/^cpu/)    {
        # 判斷當(dāng)前數(shù)據(jù)來自第一次讀取還是第二次讀取
        my $info_time;
        if ($line_num <= scalar(@fir_contents))        {
            $info_time = "first";
        }else        {
            $info_time = "second";
        }

        # 向散列寫入數(shù)據(jù)
        chomp $line;
        my ($cpu, $user, $nice, $sys, $idle, $io, $irq, $softirq, $steal, $guest) =
            split /\s+/, $line;
        $cpuinfo{$info_time}{$cpu}{'user'} = $user;
        $cpuinfo{$info_time}{$cpu}{'nice'} = $nice;
        $cpuinfo{$info_time}{$cpu}{'sys'} = $sys;
        $cpuinfo{$info_time}{$cpu}{'idle'} = $idle;
        $cpuinfo{$info_time}{$cpu}{'io'} = $io;  
        $cpuinfo{$info_time}{$cpu}{'irq'} = $irq;
        $cpuinfo{$info_time}{$cpu}{'softirq'} = $softirq;
        $cpuinfo{$info_time}{$cpu}{'$steal'} = $steal;
        $cpuinfo{$info_time}{$cpu}{'guest'} = $guest;

        $cpu_num ++;
    }
}

# 讀取散列中的數(shù)據(jù)以計(jì)算 CPU 利用率
my (%cpu_data, %cpu_usage);
foreach my $info_time (keys %cpuinfo)
{
    foreach my $cpu (keys %{$cpuinfo{$info_time}})    {
        $cpu_data{$cpu}{$info_time}{'total'} = 0;
        $cpu_data{$cpu}{$info_time}{'idle'} = $cpuinfo{$info_time}{$cpu}{'idle'};
        foreach my $key (keys %{$cpuinfo{$info_time}{$cpu}})        {
            $cpu_data{$cpu}{$info_time}{'total'} += $cpuinfo{$info_time}{$cpu}{$key};
        }
    }
}
my $check_proc;
foreach my $cpu (keys %cpu_data){
    my $idle_interval =  $cpu_data{$cpu}{'second'}{'idle'} -  
       $cpu_data{$cpu}{'fisrt'}{'idle'};
    my $total_interval = $cpu_data{$cpu}{'second'}{'total'} -
       $cpu_data{$cpu}{'fisrt'}{'total'};
    $cpu_usage{$cpu} = (1 - $idle_interval/$total_interval);
    if ($cpu_usage{$cpu} > 0.5) {$check_proc = 1;}
}

# 從 /proc/loadavg 讀取處理器上的進(jìn)程負(fù)載
$file = '/proc/loadavg';
open FILE, "<$file" or die "Failed to open file $file.\n";
my @contents = <FILE>;
close FILE;
my ($load1, $load5, $load15, $proc_num, $pid);
foreach my $line (@contents) {($load1, $load5, $load15, $proc_num, $pid) = \n
    split /\s+/, $line;}
if ($load1 > 5) {$check_proc = 1;}

# 如果處理器空閑,退出
if (!$check_proc){
    print "CPU load on this machine is normal.\n";
    exit 0;
}

# 如果處理器繁忙,找出占用 CPU 時(shí)間的進(jìn)程
my @output = `ps -e -o pcpu,pid,user,sgi_p,cmd |grep -v PID| sort -k 1| tail -10`;
foreach my $line (@output){
    $line =~ s/^\s+//g;
    my ($cpu, $pid, $user, $proc, $cmd) = split /\s+/, $line;
if ($cpu < 5) {next;}
# 輸出進(jìn)程號(hào)和進(jìn)程占用的 CPU 百分比
    print "Process $pid of user $user takes $cpu% CPU time on processor $proc.\n";
}
exit 0;



在得到需要關(guān)注的進(jìn)程以后,用戶可以進(jìn)一步查看進(jìn)程的應(yīng)用類型和狀態(tài)。詳情可以參考本系列文章之進(jìn)程管理篇。

小結(jié)

在本世紀(jì)的第一個(gè)十年,計(jì)算機(jī)中的 CPU 暫時(shí)結(jié)束了高主頻的競(jìng)賽,轉(zhuǎn)而向多核心發(fā)展。為了真正發(fā)揮多核心 CPU 的運(yùn)算效能,需要將計(jì)算任務(wù)進(jìn)行科學(xué)的拆分,并且根據(jù)不同運(yùn)算核心的狀態(tài)有選擇的進(jìn)行分配。這同時(shí)需要操作系統(tǒng)和應(yīng)用程序的良好支持。雖然并行運(yùn)算的研究已經(jīng)進(jìn)行了幾十年,但由于其復(fù)雜性,實(shí)際應(yīng)用中還會(huì)存在系統(tǒng)負(fù)載過高,處理器負(fù)載不均,程序同步等待時(shí)間長(zhǎng)等各種問題。應(yīng)用本文上述的各種工具和手段,可以幫助我們準(zhǔn)確的判斷異常情況的根源,并采取相應(yīng)的對(duì)策。隨著多核系統(tǒng)軟硬件技術(shù)的發(fā)展,程序員將可以花更少的時(shí)間寫出在更多應(yīng)用場(chǎng)景中具有更高運(yùn)算效能的程序,并在將來逐漸解決這些常見的問題。

http://www.ibm.com/developerwork ... cpu_wangwh/#author2

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2012-12-28 10:15 |只看該作者
樓主辛苦啦!

論壇徽章:
8
亥豬
日期:2014-02-09 10:55:252015小元宵徽章
日期:2015-03-06 15:57:20數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2015-06-08 22:20:00綜合交流區(qū)版塊每日發(fā)帖之星
日期:2015-06-14 22:20:002015亞冠之阿爾沙巴布
日期:2015-09-01 20:23:45IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-09-04 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-11-04 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-12-04 06:20:00
4 [報(bào)告]
發(fā)表于 2013-01-08 09:39 |只看該作者
bainanrain 發(fā)表于 2012-12-28 10:15
樓主辛苦啦!


客氣了,我也是轉(zhuǎn)載過來的,給需要的朋友分享一下

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2013-01-11 12:48 |只看該作者
樓主辛苦了,學(xué)習(xí)好文章

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2013-01-25 09:41 |只看該作者
學(xué)習(xí)了···謝謝樓主分享!

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2013-01-27 11:37 |只看該作者
謝謝樓主分享!收藏了

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2013-02-16 23:11 |只看該作者
學(xué)習(xí)了···謝謝樓主分享!

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2013-02-20 23:41 |只看該作者
路過 學(xué)習(xí)啦

論壇徽章:
6
CU大牛徽章
日期:2013-03-13 15:15:08CU大;照
日期:2013-03-13 15:26:06CU大;照
日期:2013-03-13 15:26:47戌狗
日期:2013-10-17 09:48:53CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:34丑牛
日期:2014-09-19 14:58:11
10 [報(bào)告]
發(fā)表于 2013-02-26 16:40 |只看該作者
多謝LZ分享 Thanks
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP