Linux效能監控、調優(CPU篇)

來源:互聯網
上載者:User
前言: 網上其實有很多關於這方面的文章,那為什麼還會有此篇呢,有這麼幾個原因,是我翻譯的動力,第一,概念和內容雖然老套,但都講得很透徹,而且還很全面.第二,理論結合實際,其中案例分析都不錯.第三,不花哨,採用的工具及命令都是最基本的,有助於實際操作.但本人才疏學淺,譯文大多數都是立足於自己對原文的理解,大家也可以自己去OSCAN上找原文,如果有什麼較大出入,還望留言回複,甚是感激!

  1.0 效能監控介紹

  效能最佳化就是找到系統處理中的瓶頸以及去除這些的過程,多數管理員相信看一些相關的"cook book"就可以實現效能最佳化,通常通過對核心的一些配置是可以簡單的解決問題,但並不適合每個環境,效能最佳化其實是對OS 各子系統達到一種平衡的定義,這些子系統包括了:

  CPU

  Memory

  IO

  Network

  這些子系統之間關係是相互彼此依賴的,任何一個高負載都會導致其他子系統出現問題.比如:

  大量的頁調入請求導致記憶體隊列的擁塞

  網卡的大輸送量可能導致更多的 CPU開銷

  大量的CPU開銷又會嘗試更多的記憶體使用量請求

  大量來自記憶體的磁碟寫請求可能導致更多的 CPU 以及 IO問題

  所以要對一個系統進行最佳化,尋找瓶頸來自哪個方面是關鍵,雖然看似是某一個子系統出現問題,其實有可能是別的子系統導致的.

  1.1 確定應用類型

  基於需要理解該從什麼地方來入手最佳化瓶頸,首先重要的一點,就是理解並分析當前系統的特點,多數系統所跑的應用類型,主要為2種:

  IO Bound(譯註:IO 範疇): 在這個範疇中的應用,一般都是高負荷的記憶體使用量以及儲存系統,這實際上表示IO 範疇的應用,就是一個大量資料處理的過程.IO 範疇的應用不對CPU以及網路發起更多請求(除非類似NAS這樣的網路儲存硬體).IO 範疇的應用通常使用CPU 資源都是為了產生IO 請求以及進入到核心調度的sleep 狀態.通常資料庫軟體(譯註:mysql,oracle等)被認為是IO 範疇的應用類型.

  CPU Bound(譯註:CPU 範疇): 在這個範疇中的應用,一般都是高負荷的CPU 佔用. CPU 範疇的應用,就是一個批量處理CPU 請求以及數學計算的過程.通常web server,mail server,以及其他類型服務被認為是CPU 範疇的應用類型.

  1.2 確定基準線統計

  系統利用率情況,一般隨管理員經驗以及系統本身用途來決定.唯一要清楚的就是,系統最佳化希望達成什麼效果,以及哪些方面是需要最佳化,還有參考值是什麼?因此就建立一個基準線,這個統計資料必須是系統可用效能狀態值,用來比較不可用效能狀態值.

  在以下例子中,1個系統效能的基準線快照,用來比較當高負荷時的系統效能快照.

  # vmstat 1

  procs memory swap io system cpu

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

  1 0 138592 17932 126272 214244 0 0 1 18 109 19 2 1 1 96

  0 0 138592 17932 126272 214244 0 0 0 0 105 46 0 1 0 99

  0 0 138592 17932 126272 214244 0 0 0 0 198 62 40 14 0 45

  0 0 138592 17932 126272 214244 0 0 0 0 117 49 0 0 0 100

  0 0 138592 17924 126272 214244 0 0 0 176 220 938 3 4 13 80

  0 0 138592 17924 126272 214244 0 0 0 0 358 1522 8 17 0 75

  1 0 138592 17924 126272 214244 0 0 0 0 368 1447 4 24 0 72

  0 0 138592 17924 126272 214244 0 0 0 0 352 1277 9 12 0 79

  # vmstat 1

  procs memory swap io system cpu

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

  2 0 145940 17752 118600 215592 0 1 1 18 109 19 2 1 1 96

  2 0 145940 15856 118604 215652 0 0 0 468 789 108 86 14 0 0

  3 0 146208 13884 118600 214640 0 360 0 360 498 71 91 9 0 0

  2 0 146388 13764 118600 213788 0 340 0 340 672 41 87 13 0 0

  2 0 147092 13788 118600 212452 0 740 0 1324 620 61 92 8 0 0

  2 0 147360 13848 118600 211580 0 720 0 720 690 41 96 4 0 0

  2 0 147912 13744 118192 210592 0 720 0 720 605 44 95 5 0 0

  2 0 148452 13900 118192 209260 0 372 0 372 639 45 81 19 0 0

  2 0 149132 13692 117824 208412 0 372 0 372 457 47 90 10 0 0

  從上面第一個結果可看到,最後一列(id) 表示的是空閑時間,我們可以看到,在基準線統計時,CPU 的空閑時間在79% - 100%.在第二個結果可看到,系統處於100%的佔用率以及沒有空閑時間.從這個比較中,我們就可以確定是否是CPU 使用率應該被最佳化.

 2.0 安裝監控工具

  多數 *nix系統都有一堆標準的監控命令.這些命令從一開始就是*nix 的一部分.Linux 則通過基本安裝包以及額外包提供了其他監控工具,這些安裝包多數都存在各個Linux 發布版本中.儘管還有其他更多的開源以及第三方監視軟體,但本文檔只討論基於Linux 發布版本的監控工具.

  本章將討論哪些工具怎樣來監控系統效能.

  Tool Description Base Repository

  vmstat all purpose performance tool yes yes

  mpstat provides statistics per CPU no yes

  sar all purpose performance monitoring tool no yes

  iostat provides disk statistics no yes

  netstat provides network statistics yes yes

  dstat monitoring statistics aggregator no in most distributions

  iptraf traffic monitoring dashboard no yes

  netperf Network bandwidth tool no In some distributions

  ethtool reports on Ethernet interface configuration yes yes

  iperf Network bandwidth tool no yes

  tcptrace Packet analysis tool no yes

  3.0 CPU 介紹

  CPU 利用率主要依賴於是什麼資源在試圖存取.核心調度器將負責調度2種資源種類:線程(單一或者多路)和中斷.調度器去定義不同資源的不同優先權.以下列表從優先順序高到低排列:

  Interrupts(譯註:中斷) - 裝置通知核心,他們完成一次資料處理的過程.例子,當一塊網卡裝置遞送網路資料包或者一塊硬體提供了一次IO 請求.

  Kernel(System) Processes(譯註:核心處理過程) - 所有核心處理過程就是控制優先順序別.

  User Processes(譯註:使用者進程) - 這塊涉及"userland".所有軟體程式都運行在這個user space.這塊在核心調度機制中處於低優先順序.

  從上面,我們可以看出核心是怎樣管理不同資源的.還有幾個關鍵內容需要介紹,以下部分就將介紹context(譯註:環境切換),run queues(譯註:運行隊列)以及utilization(譯註:利用率).

  3.1 環境切換

  多數現代處理器都能夠運行一個進程(單一線程)或者線程.多路超執行緒處理器有能力運行多個線程.然而,Linux 核心還是把每個處理器核心的雙核心晶片作為獨立的處理器.比如,以Linux 核心的系統在一個雙核心處理器上,是報告顯示為兩個獨立的處理器.

  一個標準的Linux 核心可以運行50 至 50,000 的處理線程.在只有一個CPU時,核心將調度並均衡每個進程線程.每個線程都分配一個在處理器中被開銷的時間額度.一個線程要麼就是獲得時間額度或已搶先獲得一些具有較高優先順序(比如硬體中斷),其中較高優先順序的線程將從地區重新放置回處理器的隊列中.這種線程的轉換關係就是我們提到的環境切換.

  每次核心的環境切換,資源被用於關閉在CPU寄存器中的線程和放置在隊列中.系統中越多的環境切換,在處理器的調度管理下,核心將得到更多的工作.

  3.2 運行隊列

  每個CPU 都維護一個線程的運行隊列.理論上,調度器應該不斷的運行和執行線程.進程線程不是在sleep 狀態中(譯註:阻塞中和等待IO中)或就是在可運行狀態中.如果CPU 子系統處於高負荷下,那就意味著核心調度將無法及時響應系統請求.導致結果,可運行狀態進程擁塞在運行隊列裡.當運行隊列越來越巨大,進程線程將花費更多的時間擷取被執行.

  比較流行的術語就是"load",它提供當前運行隊列的詳細狀態.系統 load 就是指在CPU 隊列中有多少數目的線程,以及其中當前有多少進程線程數目被執行的組合.如果一個雙核系統執行了2個線程,還有4個在運行隊列中,則 load 應該為 6. top 這個程式裡顯示的load averages 是指1,5,15 分鐘以內的load 情況.

  3.3 CPU 利用率

  CPU 利用率就是定義CPU 使用的百分比.評估系統最重要的一個度量方式就是CPU 的利用率.多數效能監控工具關於CPU 利用率的分類有以下幾種:

  User Time(譯註:使用者進程時間) - 關於在user space中被執行進程在CPU 開銷時間百分比.

  System Time(譯註:核心線程以及停機時間) - 關於在kernel space中線程和中斷在CPU 開銷時間百分比.

  Wait IO(譯註:IO 請求等待時間) - 所有進程線程被阻塞等待完成一次IO 請求所佔CPU 開銷idle的時間百分比.

  Idle(譯註:空閑) - 一個完整空閑狀態的進程在CPU 處理器中開銷的時間百分比.

  4.0 CPU 效能監控

  理解運行隊列,利用率,環境切換對怎樣CPU 效能最佳化之間的關係.早期提及到,效能是相對於基準線資料的.在一些系統中,通常預期所達到的效能包括:

  Run Queues - 每個處理器應該運行隊列不超過1-3 個線程.例子,一個雙核處理器應該運行隊列不要超過6 個線程.

  CPU Utiliation - 如果一個CPU 被充分使用,利用率分類之間均衡的比例應該是

  65% - 70% User Time

  30% - 35% System Time

  0% - 5% Idle Time

  Context Switches - 環境切換的數目直接關係到CPU 的使用率,如果CPU 利用率保持在上述均衡狀態時,大量的環境切換是正常的.

  很多Linux 上的工具可以得到這些狀態值,首先就是 vmstat 和 top 這2個工具.

  4.1 vmstat 工具的使用

  vmstat 工具提供了一種低開銷的系統效能觀察方式.因為 vmstat 本身就是低開銷工具,在非常高負荷的伺服器上,你需要查看並監控系統的健康情況,在控制視窗還是能夠使用vmstat 輸出結果.這個工具運行在2種模式下:average 和 sample 模式.sample 模式通過指定間隔時間測量狀態值.這個模式對於理解在持續負荷下的效能表現,很有協助.下面就是

  vmstat 運行1秒間隔的樣本:

  # vmstat 1

  procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----

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

  0 0 104300 16800 95328 72200 0 0 5 26 7 14 4 1 95 0

  0 0 104300 16800 95328 72200 0 0 0 24 1021 64 1 1 98 0

  0 0 104300 16800 95328 72200 0 0 0 0 1009 59 1 1 98 0

  Table 1: The vmstat CPU statistics

  Field Description

  r The amount of threads in the run queue. These are threads that are runnable, but the CPU is not available to execute them.

  當前運行隊列中線程的數目.代表線程處於可運行狀態,但CPU 還未能執行.

  b This is the number of processes blocked and waiting on IO requests to finish.

  當前進程阻塞並等待IO 請求完成的數目

  in This is the number of interrupts being processed.

  當前中斷被處理的數目

  cs This is the number of context switches currently happening on the system.

  當前kernel system中,發生環境切換的數目

  us This is the percentage of user CPU utilization.

  CPU 利用率的百分比

  sys This is the percentage of kernel and interrupts utilization.

  核心和中斷利用率的百分比

  wa This is the percentage of idle processor time due to the fact that ALL runnable threads are blocked waiting on IO.

  所有可運行狀態線程被阻塞在等待IO 請求的百分比

  id This is the percentage of time that the CPU is completely idle.

  CPU 空閑時間的百分比

  4.2 案例學習:持續的CPU 利用率

  在這個例子中,這個系統被充分利用

  # vmstat 1

  procs memory swap io system cpu

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

  3 0 206564 15092 80336 176080 0 0 0 0 718 26 81 19 0 0

  2 0 206564 14772 80336 176120 0 0 0 0 758 23 96 4 0 0

  1 0 206564 14208 80336 176136 0 0 0 0 820 20 96 4 0 0

  1 0 206956 13884 79180 175964 0 412 0 2680 1008 80 93 7 0 0

  2 0 207348 14448 78800 175576 0 412 0 412 763 70 84 16 0 0

  2 0 207348 15756 78800 175424 0 0 0 0 874 25 89 11 0 0

  1 0 207348 16368 78800 175596 0 0 0 0 940 24 86 14 0 0

  1 0 207348 16600 78800 175604 0 0 0 0 929 27 95 3 0 2

  3 0 207348 16976 78548 175876 0 0 0 2508 969 35 93 7 0 0

  4 0 207348 16216 78548 175704 0 0 0 0 874 36 93 6 0 1

  4 0 207348 16424 78548 175776 0 0 0 0 850 26 77 23 0 0

  2 0 207348 17496 78556 175840 0 0 0 0 736 23 83 17 0 0

  0 0 207348 17680 78556 175868 0 0 0 0 861 21 91 8 0 1

  根據觀察值,我們可以得到以下結論:

  1,有大量的中斷(in) 和較少的環境切換(cs).這意味著一個單一的進程在產生對硬體裝置的請求.

  2,進一步顯示某單個應用,user time(us) 經常在85%或者更多.考慮到較少的環境切換,這個應用應該還在處理器中被處理.

  3,運行隊列還在可接受的效能範圍內,其中有2個地方,是超出了允許限制.

  4.3 案例學習:超負荷調度

  在這個例子中,核心調度中的環境切換處於飽和

  # vmstat 1

  procs memory swap io system cpu

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

  2 1 207740 98476 81344 180972 0 0 2496 0 900 2883 4 12 57 27

  0 1 207740 96448 83304 180984 0 0 1968 328 810 2559 8 9 83 0

  0 1 207740 94404 85348 180984 0 0 2044 0 829 2879 9 6 78 7

  0 1 207740 92576 87176 180984 0 0 1828 0 689 2088 3 9 78 10

  2 0 207740 91300 88452 180984 0 0 1276 0 565 2182 7 6 83 4

  3 1 207740 90124 89628 180984 0 0 1176 0 551 2219 2 7 91 0

  4 2 207740 89240 90512 180984 0 0 880 520 443 907 22 10 67 0

  5 3 207740 88056 91680 180984 0 0 1168 0 628 1248 12 11 77 0

  4 2 207740 86852 92880 180984 0 0 1200 0 654 1505 6 7 87 0

  6 1 207740 85736 93996 180984 0 0 1116 0 526 1512 5 10 85 0

  0 1 207740 84844 94888 180984 0 0 892 0 438 1556 6 4 90 0

  根據觀察值,我們可以得到以下結論:

  1,環境切換數目高於中斷數目,說明kernel中相當數量的時間都開銷在環境切換線程.

  2,大量的環境切換將導致CPU 利用率分類不均衡.很明顯實際上等待io 請求的百分比(wa)非常高,以及user time百分比非常低(us).

  3,因為CPU 都阻塞在IO請求上,所以運行隊列裡也有相當數目的可運行狀態線程在等待執行.

  4.4 mpstat 工具的使用

  如果你的系統運行在多處理器晶片上,你可以使用 mpstat 命令來監控每個獨立的晶片.Linux 核心視雙核處理器為2 CPU's,因此一個雙核處理器的雙核心就報告有4 CPU's 可用.

  mpstat 命令給出的CPU 利用率統計值大致和 vmstat 一致,但是 mpstat 可以給出基於單個處理器的統計值.

  # mpstat –P ALL 1

  Linux 2.4.21-20.ELsmp (localhost.localdomain) 05/23/2006

  05:17:31 PM CPU %user %nice %system %idle intr/s

  05:17:32 PM all 0.00 0.00 3.19 96.53 13.27

  05:17:32 PM 0 0.00 0.00 0.00 100.00 0.00

  05:17:32 PM 1 1.12 0.00 12.73 86.15 13.27

  05:17:32 PM 2 0.00 0.00 0.00 100.00 0.00

  05:17:32 PM 3 0.00 0.00 0.00 100.00 0.00

  4.5 案例學習: 未充分使用的處理量

  在這個例子中,為4 CPU核心可用.其中2個CPU 主要處理進程運行(CPU 0 和1).第3個核心處理所有核心和其他系統功能(CPU 3).第4個核心處於idle(CPU 2).

  使用 top 命令可以看到有3個進程差不多完全佔用了整個CPU 核心.

  # top -d 1

  top - 23:08:53 up 8:34, 3 users, load average: 0.91, 0.37, 0.13

  Tasks: 190 total, 4 running, 186 sleeping, 0 stopped, 0 zombie

  Cpu(s): 75.2% us, 0.2% sy, 0.0% ni, 24.5% id, 0.0% wa, 0.0% hi, 0.0%

  si

  Mem: 2074736k total, 448684k used, 1626052k free, 73756k buffers

  Swap: 4192956k total, 0k used, 4192956k free, 259044k cached

  PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

  15957 nobody 25 0 2776 280 224 R 100 20.5 0:25.48 php

  15959 mysql 25 0 2256 280 224 R 100 38.2 0:17.78 mysqld

  15960 apache 25 0 2416 280 224 R 100 15.7 0:11.20 httpd

  15901 root 16 0 2780 1092 800 R 1 0.1 0:01.59 top

  1 root 16 0 1780 660 572 S 0 0.0 0:00.64 init

  # mpstat –P ALL 1

  Linux 2.4.21-20.ELsmp (localhost.localdomain) 05/23/2006

  05:17:31 PM CPU %user %nice %system %idle intr/s

  05:17:32 PM all 81.52 0.00 18.48 21.17 130.58

  05:17:32 PM 0 83.67 0.00 17.35 0.00 115.31

  05:17:32 PM 1 80.61 0.00 19.39 0.00 13.27

  05:17:32 PM 2 0.00 0.00 16.33 84.66 2.01

  05:17:32 PM 3 79.59 0.00 21.43 0.00 0.00

  05:17:32 PM CPU %user %nice %system %idle intr/s

  05:17:33 PM all 85.86 0.00 14.14 25.00 116.49

  05:17:33 PM 0 88.66 0.00 12.37 0.00 116.49

  05:17:33 PM 1 80.41 0.00 19.59 0.00 0.00

  05:17:33 PM 2 0.00 0.00 0.00 100.00 0.00

  05:17:33 PM 3 83.51 0.00 16.49 0.00 0.00

  05:17:33 PM CPU %user %nice %system %idle intr/s

  05:17:34 PM all 82.74 0.00 17.26 25.00 115.31

  05:17:34 PM 0 85.71 0.00 13.27 0.00 115.31

  05:17:34 PM 1 78.57 0.00 21.43 0.00 0.00

  05:17:34 PM 2 0.00 0.00 0.00 100.00 0.00

  05:17:34 PM 3 92.86 0.00 9.18 0.00 0.00

  05:17:34 PM CPU %user %nice %system %idle intr/s

  05:17:35 PM all 87.50 0.00 12.50 25.00 115.31

  05:17:35 PM 0 91.84 0.00 8.16 0.00 114.29

  05:17:35 PM 1 90.82 0.00 10.20 0.00 1.02

  05:17:35 PM 2 0.00 0.00 0.00 100.00 0.00

  05:17:35 PM 3 81.63 0.00 15.31 0.00 0.00

  你也可以使用 ps 命令通過查看 PSR 這列,檢查哪個進程在佔用了哪個CPU.

  # while :; do ps -eo pid,ni,pri,pcpu,psr,comm | grep 'mysqld'; sleep 1;

  done

  PID NI PRI %CPU PSR COMMAND

  15775 0 15 86.0 3 mysqld

  PID NI PRI %CPU PSR COMMAND

  15775 0 14 94.0 3 mysqld

  PID NI PRI %CPU PSR COMMAND

  15775 0 14 96.6 3 mysqld

  PID NI PRI %CPU PSR COMMAND

  15775 0 14 98.0 3 mysqld

  PID NI PRI %CPU PSR COMMAND

  15775 0 14 98.8 3 mysqld

  PID NI PRI %CPU PSR COMMAND

  15775 0 14 99.3 3 mysqld

  4.6 結論

  監控 CPU 效能由以下幾個部分組成:

  1,檢查system的運行隊列,以及確定不要超出每個處理器3個可運行狀態線程的限制.

  2,確定CPU 利用率中user/system比例維持在70/30

  3,當CPU 開銷更多的時間在system mode,那就說明已經超負荷並且應該嘗試重新調度優先順序

  4,當I/O 處理得到增長,CPU 範疇的應用處理將受到影響

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.