1.0性能監控介紹mysql
性能優化就是找到系統處理中的瓶頸以及去除這些的過程,多數管理員相信看一些相關的"cook book"就能夠實現性能優化,一般經過對內核的一些配置是能夠簡單的解決問題,但並不適合每一個環境,性能優化實際上是對OS 各子系統達到一種平衡的定義,這些子系統包括了:web
CPU
Memory
IO
Network
這些子系統之間關係是相互彼此依賴的,任何一個高負載都會致使其餘子系統出現問題.好比:數據庫
大量的頁調入請求致使內存隊列的擁塞
因此要對一個系統進行優化,查找瓶頸來自哪一個方面是關鍵,雖然看似是某一個子系統出現問題,其實有多是別的子系統致使的.服務器
1.1肯定應用類型網絡
基於須要理解該從什麼地方來入手優化瓶頸,首先重要的一點,就是理解並分析當前系統的特色,多數系統所跑的應用類型,主要爲2種:oracle
IO Bound(譯註:IO 範疇): 在這個範疇中的應用,通常都是高負荷的內存使用以及存儲系統,這實際上表示IO 範疇的應用,就是一個大量數據處理的過程.IO 範疇的應用不對CPU以及網絡發起更多請求(除非相似NAS這樣的網絡存儲硬件).IO 範疇的應用一般使用CPU 資源都是爲了產生IO 請求以及進入到內核調度的sleep 狀態.一般數據庫軟件(譯註:mysql,oracle等)被認爲是IO 範疇的應用類型.app
CPU Bound(譯註:CPU 範疇): 在這個範疇中的應用,通常都是高負荷的CPU 佔用. CPU 範疇的應用,就是一個批量處理CPU 請求以及數學計算的過程.一般web server,mail server,以及其餘類型服務被認爲是CPU 範疇的應用類型.ide
簡單總結下:IO範疇就是CPU處理大量數據的過程;
CPU範疇就是處理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 使用率應該被優化.
3.0 CPU介紹
CPU利用率主要依賴因而什麼資源在試圖存取.內核調度器將負責調度2種資源種類:線程(單一或者多路)和中斷.調度器去定義不一樣資源的不一樣優先權.如下列表從優先級高到低排列:Interrupts(中斷)---->Kernel Processe(內核處理過程)---->User Processes(用戶進程)
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.
b This is the number of processes blocked and waiting on IO requests to finish.
in This is the number of interrupts being processed.
cs This is the number of context switches currently happening on the 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.
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個地方,是超出了容許限制.
總結:某一個進程已經大大在影響到了CPU的總體處理能力,已經出現性能的下降趨勢。
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請求上,因此運行隊列裏也有至關數目的可運行狀態線程在等待執行.
總結:大部分的CPU都浪費在的線程交換,以及隊列等待上,超負載工做情況。