CVM性能排障工具使用手冊

  • 2019 年 11 月 6 日
  • 筆記

大部分Linux 性能監測工具都是基於proc 虛擬文件系統的。以下主要介紹使用CVM過程常見的性能排障工具

1.uptime

Uptime 命令的顯示結果包括伺服器已經運行了多長時間,有多少登陸用戶和對

伺服器性能的總體評估(load average)。load average 值分別記錄了上個1 分

鍾,5 分鐘和15 分鐘間隔的負載情況,load average 不是一個百分比,而是在

隊列中等待執行的進程的數量。如果進程要求CPU 時間被阻塞(意味著CPU 沒有

時間處理它),load average 值將增加。另一方面,如果每個進程都可以立刻得

到訪問CPU 的時間,這個值將減少。

load average 的最佳值是1,這說明每個進程都可以立刻被CPU 處理。在不同的

系統間這個值也是不同的,例如一個單CPU 的工作站,load average 為1 或者2

都是可以接受的,但是在一個多CPU 的系統中這個值通常為8 或者10。

你可以使用uptime 判斷一個性能問題是出現在伺服器上還是網路上。例如,如

果一個網路應用運行性能不理想,運行uptime 檢查系統負載是否比較高,如果

不是這個問題更可能出現在你的網路上。

Uptime 命令執行示例

Tip:你可以用w 命令代替uptime,w 命令也可以提供目前登陸用戶的資訊。

2.Dmesg

Dmesg 的主要功能是顯示內核資訊,當硬體或者內核中載入的模組出現問題的時

候dmesg 可以提供一些有用的資訊。另外,利用dmesg 你可以查看有哪些硬體安

裝在你的伺服器上。在每次啟動的時候,Linux 檢查硬體並且記錄這些資訊。你

可以使用/bin/dmesg 命令來查看這些資訊。

3.Top

Top 命令顯示了實際CPU 使用情況,默認情況下,它顯示了伺服器上佔用CPU 的

任務資訊並且每5 秒鐘刷新一次。你可以通過多種方式分類它們,包括PID、時

間和記憶體使用情況。

下圖是一個top 命令結果的示例,

你可以使用renice 命令為一個進程分配新的優先順序。如果一個進程宕掉或者占

用了太多的記憶體,可以使用kill 命令殺死進程。下面是輸出值的介紹,

PID:進程標識

USER;進程所有者的用戶名

PRI:進程的優先順序

NI:nice 級別

SIZE:進程佔用的記憶體數量(程式碼+數據+堆棧)

RSS;進程使用的物理記憶體數量

SHARE;該進程和其他進程共享記憶體的數量

STAT:進程的狀態:S=休眠狀態,R=運行狀態,T=停止狀態,D=中斷休眠狀

態,Z=殭屍狀態

%CPU:共享的CPU 使用

%MEM;共享的物理記憶體

TIME:進程佔用CPU 的時間

COMMAND:啟動任務的命令行(包括參數)

Top 命令有下面幾個有用的熱鍵,包括

t:是否顯示概要資訊

m:是否顯示記憶體資訊

A:通過不同的系統資源情況分類顯示結果,對快速判斷系統中影響性能的進程

十分有效

f:輸入一個top 的互動式的配置畫面

o:激活交換式的分類的選擇

進程的優先順序和nice 級別

進程優先順序是一個決定進程被CPU 執行優先順序的參數,內核會根據需要調整這

個值。Nice 值是一個對優先權的限制。進程優先順序的值不能低於nice 值。( nice

值越低優先順序越高)

進程優先順序是無法去手動改變的,只有通過改變nice 值去間接的調整進程優先

級。如果一個進程運行的太慢了,你可以通過指定一個較低的nice 值去為它分

配更多的CPU 資源。當然,這意味著其他的一些進程將被分配更少的CPU 資源,

運行更慢一些。Linux 支援nice 值的範圍是19(低優先順序)到-20(高優先順序),

默認的值是0。如果需要改變一個進程的nice 值為負數(高優先順序),必須使用

su 命令登陸到root 用戶。下面是一些調整nice 值的命令示例,

以nice 值-5 開始程式xyz

#nice –n -5 xyz

改變已經運行的程式的nice 值

#renice level pid

將pid 為2500 的進程的nice 值改為10

#renice 10 2500

殭屍進程

當一個進程被結束,在它結束之前通常需要用一些時間去完成所有的任務(比如

關閉打開的文件),在一個很短的時間裡,這個進程的狀態為殭屍狀態。在進程

完成所有關閉任務之後,會向父進程提交它關閉的資訊。有些情況下,一個殭屍

進程不能關閉它自己,這時這個進程狀態就為z(zombie)。不能使用kill 命令

殺死殭屍進程,因為它已經標誌為「dead」。如果你無法擺脫一個殭屍進程,你

可以殺死它的父進程,這個殭屍進程也就消失了。然而,如果父進程是init 進

程,你不能殺死init 進程,因為init 是一個重要的系統進程,這種情況下你只

能通過一次重新啟動來擺脫殭屍進程。

4.iostat

iostat 是sysstat 的一部分,如果你沒有安裝這個包,在Red Hat Enterprise

Linux 光碟中找到sysstat 的rpm 包進行安裝。Iostat 顯示自系統啟動後的平均

CPU 時間(與uptime 類似),它也可以顯示磁碟子系統的使用情況,iostat 可以

用來監測CPU 利用率和磁碟利用率。下圖是一個命令輸出的示例,

CPU 利用率分四個部分:

%user:user level(應用)的CPU 佔用率情況

%nice:加入nice 優先順序的user level 的CPU 佔用率情況

%sys:system level(內核)的CPU 佔用情況

%idle:空閑的CPU 資源情況

磁碟佔用率有下面幾個部分:

Device:塊設備名

Tps:設備每秒進行傳輸的數量(每秒的I/O 請求)。多個單獨的I/O 請求可以被

組成一個傳輸操作,因為一個傳輸操作可以是不同的容量。

Blk_read/s, Blk_wrtn/s:該設備每秒讀寫的塊的數量。塊可能為不同的容量。

塊的大小一般為1024、2048、4048byte。例如,塊設備/dev/sda1 的塊大小可以

通過下面命令查看

# dumpe2fs -h /dev/sda1 |grep -F 「Block size」

會得到類似下面的輸出

dumpe2fs 1.41.9 (22-Aug-2009)

Block size: 4096

Blk_read, Blk_wrtn:自系統啟動以來讀寫的塊設備的總量。

5.Vmstat

Vmstat 命令提供了對進程、記憶體、頁面I/O 塊和CPU 等資訊的監控,vmstat 可

以顯示檢測結果的平均值或者取樣值,取樣模式可以提供一個取樣時間段內不同

頻率的監測結果。下面是一個vmstat 命令的輸出結果的示例。

註:在取樣模式中需要考慮在數據收集中可能出現的誤差,將取樣頻率設為比較

低的值可以儘可能的減小誤差的影響。

下面介紹一下各列的含義

Master:~/python # vmstat 1 10

procs ———–memory———- —swap– —–io—- -system– —–cpu——

r b swpd free buff cache si so bi bo in cs us sy id wa st

0 0 0 314904 141624 7618764 0 0 2 1 1 2 0 0 100 0 0

0 0 0 314904 141624 7618804 0 0 0 0 32 23 0 0 100 0 0

·process(procs)

r:等待運行時間的進程數量

b:處在不可中斷睡眠狀態的進程

w:被交換出去但是仍然可以運行的進程,這個值是計算出來的

.memory

swpd:虛擬記憶體的數量

free:空閑記憶體的數量

buff:用做緩衝區的記憶體數量

·swap

si:從硬碟交換來的數量

so:交換到硬碟去的數量

·IO

bi:向一個塊設備輸出的塊數量

bo:從一個塊設備接受的塊數量

·system

in:每秒發生的中斷數量, 包括時鐘

cs:每秒發生的context switches 的數量

·cpu(整個cpu 運行時間的百分比)

us:非內核程式碼運行的時間(用戶時間,包括nice 時間)

sy:內核程式碼運行的時間(系統時間)

id:空閑時間,在Linux 2.5.41 之前的內核版本中,這個值包括I/O 等待時間

等待I/O 操作的時間,在Linux 2.5.41 之前的內核版本中這個值為0

Vmstat 命令提供了大量的附加參數,可以參考vmstat 的man 手冊去查詢所有的

參數,下面列舉幾個十分有用的參數。

·m:顯示內核的記憶體利用率

·a:顯示記憶體頁面資訊,包括活躍和不活躍的記憶體頁面

·n:顯示報頭行,這個參數在使用取樣模式並將命令結果輸出到一個文件時非

常有用。例如root#vmstat –n 2 10 以2 秒的頻率顯示10 輸出結果

·當使用-p {分區}時,vmstat 提供對I/O 結果的統計

6.ps 和pstree

ps 和pstree 命令是系統分析最常用的基本命令,ps 命令提供了一個正在運行的

進程的列表,列出進程的數量取決於命令所附加的參數。例如ps –A 命令列出

所有進程和它們相應的進程ID(PID),進程的PID 是使用其他一些工具之前所

必須了解的,例如pmap 或者renice。

在運行java 應用的系統上,ps –A 命令的輸出很容易就會超過螢幕的顯示範

圍,這樣就很難得到所有進程的完整資訊。這時,使用pstree 命令可以以樹狀

結構來顯示所有的進程資訊並且可以整合子進程的資訊。Pstree 命令對分析進

程的來源十分有用。下面是命令的示例,

7.Numastat

隨著NUMA 架構的不斷發展,例如eServer xSeries 445 及其後續產品eServe

xSeries 460,現在NUMA 架構已經成為了企業級數據中心的主流。然而,NUMA

架構在性能調優方面面臨了新的挑戰,例如記憶體分配的問題在NUMA 系統之前並

沒人感興趣,Red Hat Enterprise Linux 4 提供了一個監測NUMA 架構的工具。

Numastat 命令提供了本地記憶體與遠程記憶體使用情況的對比和各個節點的記憶體使

用情況。Numa_miss 列顯示分配失敗的本地記憶體,numa_foreign 列顯示分配遠程

記憶體(訪問速度慢)資訊,過多的調用遠程記憶體將增加系統的延遲從而影響整個

系統的性能。使運行在一個節點上的進程都訪問本地記憶體將極大的改善系統的性

能。

8.sa

sar 程式是sysstat 安裝包的一部分,如果你沒有安裝這個包,在Red Hat

Enterprise Linux 的源文件中尋找這個rpm 包進行安裝,sar 命令用於收集、報

告和保存系統的資訊。Sar 命令由三個應用組成:sar,用與顯示數據;sa1 和sa2,

用於收集和存儲數據。關於sar 工具的詳細參數說明可以參考man 手冊。

為了以後分析日誌,可以使用sa1 和sa2 配置系統獲得並且記錄日誌資訊。為了

實現這個目的,如下圖例所示向/etc/crontab 中加入相應的內容。注意默認的

情況下cron 每天都會定時的運行sar 命令,如果系統安裝了sar 相應的安裝包。

sar 命令所生成的數據保存在/var/log/sa/目錄下,數據按照時間保存,可以根

據時間來查詢相應的性能數據。

例如,顯示21 號的網路資訊使用下面的命令

sar -n DEV 1 10,命令結果如下,

22:28:38 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s

22:28:39 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00

22:28:39 eth0 5.00 1.00 0.48 0.37 0.00 0.00 0.00

你也可以使用sar 在命令行下得到一個實時的執行結果,收集的數據可以包括

CPU 利用率、記憶體頁面、網路I/O 等等。如下例所示,

9.free

free 命令顯示系統的所有記憶體的使用情況,包括空閑記憶體、被使用的記憶體和交

換記憶體空間。Free 命令顯示也包括一些內核使用的快取和緩衝區的資訊。下面

是命令結果的示例,

當使用free 命令的時候,需要記住linux 的記憶體結構和虛擬記憶體的管理方法,

比如空閑記憶體數量的限制,還有swap 空間的使用並不標誌一個記憶體瓶頸的出現。

Free 命令有用的參數:

·-b,-k,-m 和-g 分別按照bytes, kilobytes, megabytes, gigabytes 顯示結果。

·-l 區別顯示low 和high 記憶體

·-c {count}顯示free 輸出的次數

10.Pmap (顯示一個或者多個進程使用記憶體的數量)

pmap 命令顯示一個或者多個進程使用記憶體的數量,你可以用這個工具來確定服

務器上哪個進程佔用了過多的記憶體從而導致記憶體瓶頸。

命令格式:pmap

關於pmap 命令的詳細語法可以使用下面命令查詢

pmap -d 28008 (顯示snmpd進程使用的記憶體)

28008: snmpd

START SIZE RSS PSS DIRTY SWAP PERM OFFSET DEVICE MAPPING

00007ff851fab000 4K 0K 0K 0K 0K —p 0000000000000000 00:00 [anon]

00007ff851fac000 8192K 12K 12K 12K 0K rw-p 0000000000000000 00:00 [anon]

00007ff8527ac000 44K 28K 28K 0K 0K r-xp 0000000000000000 ca:03 /lib64/libsysfs.so.2.0.1

00007ff8527b7000 2044K 0K 0K 0K 0K —p 000000000000b000 ca:03 /lib64/libsysfs.so.2.0.1

…….

Total: 68176K 6776K 6092K 3648K 0K

12484K writable-private, 55692K readonly-private, 0K shared, and 4676K referenced

11.Strace (監控進程)

strace 截取和記錄進程的系統調用資訊,還包括進程接受的命令訊號。這是一

個有用的診斷和調試工具,系統管理員可以通過strace 來解決程式上的問題。

命令格式,需要指定需要監測的進程ID,下圖是一個命令結果的示例。

strace -p 28008 (snmpd 進程PID)

gettimeofday({1398176415, 289636}, NULL) = 0

gettimeofday({1398176415, 289716}, NULL) = 0

gettimeofday({1398176415, 289792}, NULL) = 0

gettimeofday({1398176415, 289866}, NULL) = 0

select(10, [4 8 9], [], [], {0, 671931}) = 0 (Timeout)

gettimeofday({1398176415, 966576}, NULL) = 0

gettimeofday({1398176415, 966652}, NULL) = 0

gettimeofday({1398176415, 966726}, NULL) = 0

open("/proc/stat", O_RDONLY) = 10

read(10, "cpu 34238 7477 59888 1732404978"…, 12287) = 5249

close(10) = 0

open("/proc/vmstat", O_RDONLY) = 10

read(10, "nr_free_pages 79460nnr_inactive_"…, 4095) = 1334

close(10) = 0

gettimeofday({1398176415, 968020}, NULL) = 0

gettimeofday({1398176415, 968096}, NULL) = 0

gettimeofday({1398176415, 968169}, NULL) = 0

select(10, [4 8 9], [], [], {4, 998630}

使用下面命令可以獲得關於strace 的完整語法資訊

strace -?

註:當針對某個進程執行strace 命令時,對該進程的運行性能將產生很大的影

響,所以這個命令僅僅應該用在收集數據的時候。

12.ulimit 文件數打開硬限制和軟限制

這個命令是基於bash 的,可以通過ulimit 來控制系統資源的使用,使用-a 參

數列出所有可調的參數。

ulimit –a

-H 和-S 參數可以對指定的資源進行軟限制和硬限制,如果超過了軟限制,系統

管理員會接收到一個警告,在達到硬限制的時候命令就會提示報錯。

例如,為系統打開文件的數量設定一個硬限制

ulimit -Hn 4096

為打開文件設定一個軟限制

ulimit -Sn 1024

ulimit -SHn 100000 (設定硬限制和軟限制的值)

查看硬限制和軟限制的值

ulimit -Hn

ulimit -Sn

這是一個很有用的命令,例如現在想在系統啟動時對Oracle 用戶進行限制,在

/etc/security/limits.conf 中加入如下兩行:

soft nofile 4096

hard nofile 10240

另外確保/etc/pam.d/system-auth 文件有下面內容

session required /lib/security/$ISA/pam_limits.so

這一行確保系統會執行這個限制。

如果要查看ulimit 命令的詳細語法,可以執行

ulimit -?

13.Mpstat

mpstat 2 5 -P ALL

mpstat 命令是sysstat 包的一部分,如果沒有安裝sysstat 包,可以在Red Hat

Enterprise Linux 安裝源文件中找到並且安裝這個rpm 包。Mpstat 命令用於監

測一個多CPU 系統中每個可用CPU 的情況。Mpstat 命令可以顯示每個CPU 或者

所有CPU 的運行情況,同時也可以像vmstat 命令那樣使用參數進行一定頻率的

取樣結果的監測。下面是使用mpstat -P ALL 命令的顯示結果的示例,

關於完整的命令語法請用下面命令查看

mpstat -?

16. Capacity Manage

Capacity Manager 是IBM Director 系統管理的一個附加組件,可以提供對不同

平台下的多個系統進行長期的性能監測。除了對性能的監測,Capacity Manage

還包括對容量的計劃,提供對系統將來可能的容量的分析和建議。Capacity

Manager 可以輸出多種文件格式包括HTML, XML 和GIF。IBM Director 可以被應

用在不同作業系統平台下,這樣就為在異構環境下對數據的收集和分析提供了有

力的工具。

如果使用Capacity Manager,必須在系統中安裝相關的rpm 包。安裝完成後在IBM

Director Console 中選擇Capacity Manager →Monitor Activato

拖拽Monitor Activator 圖標到一個單獨的或者一組已經安裝相應程式的系統,

在接下來的窗口中可以選擇多種子系統進行監測。Capacity Manager 在Linux

下會有少部分功能受一些參數的限制。

Monitor Activator 窗口在右邊的窗口中顯示相關係統目前的狀態,在左邊的窗

口中顯示顯示可用的性能監測。添加一個新的監測,選擇相應的監測圖標點擊

On。改變將在Monitor Activator 窗口關閉後馬上生效,配置完成後, IBM

Director 將開始收集並且存儲所要求的性能數據。如果要為收集的資訊創建一

個報告,選擇Capacity Manager → Report Generator 並且拖拽操作你想監測

的單個或者一組系統,IBM Director 將顯示下面的介面,

在這裡根據你的需要選擇是立刻執行或者指定時間執行。在生產環境中,在固定

的時間收集Capacity Manager 報告是一個比較好的方法,我們可以選擇在每周

末系統並不繁忙的時候產生一次系統報告。一旦報告收集完成將存儲在IBM

Director 伺服器上,可以通過Report Viewer 任務來查看。

下圖是一個報告結果的示例

在Report Viewer 窗口中可以選擇需要查看的不同性能參數,Capacity Manage

的結果可以被輸出為HTML 或者XML 文件,為了分析需要可以被顯示在內部的web

伺服器上。