快速定位问题
CPU 性能指標(biāo)
最容易想到的應(yīng)該是 CPU 使用率,這也是實(shí)際環(huán)境中最常見的一個(gè)性能指標(biāo)。
CPU 使用率描述了非空閑時(shí)間占總 CPU 時(shí)間的百分比,根據(jù) CPU 上運(yùn)行任務(wù)的不同,又被分為用戶 CPU、系統(tǒng) CPU、等待 I/O CPU、軟中斷和硬中斷等。
用戶 CPU 使用率,包括用戶態(tài) CPU 使用率(user)和低優(yōu)先級(jí)用戶態(tài) CPU 使用率(nice),表示 CPU 在用戶態(tài)運(yùn)行的時(shí)間百分比。
用戶 CPU 使用率高,通常說(shuō)明有應(yīng)用程序比較繁忙。
系統(tǒng) CPU 使用率,表示 CPU 在內(nèi)核態(tài)運(yùn)行的時(shí)間百分比(不包括中斷)。系統(tǒng) CPU 使用率高,說(shuō)明內(nèi)核比較繁忙。
等待 I/O 的 CPU 使用率,通常也稱為 iowait,表示等待 I/O 的時(shí)間百分比。iowait 高,通常說(shuō)明系統(tǒng)與硬件設(shè)備的 I/O 交互時(shí)間比較長(zhǎng)。
軟中斷和硬中斷的 CPU 使用率,分別表示內(nèi)核調(diào)用軟中斷處理程序、硬中斷處理程序的時(shí)間百分比。它們的使用率高,通常說(shuō)明系統(tǒng)發(fā)生了大量的中斷。
還有在虛擬化環(huán)境中會(huì)用到的竊取 CPU 使用率(steal)和客戶 CPU 使用率(guest),分別表示被其他虛擬機(jī)占用的 CPU 時(shí)間百分比,和運(yùn)行客戶虛擬機(jī)的 CPU 時(shí)間百分比。
應(yīng)該是平均負(fù)載(Load Average),也就是系統(tǒng)的平均活躍進(jìn)程數(shù)。
它反應(yīng)了系統(tǒng)的整體負(fù)載情況,主要包括三個(gè)數(shù)值,分別指過(guò)去 1 分鐘、過(guò)去 5 分鐘和過(guò)去 15 分鐘的平均負(fù)載。理想情況下,平均負(fù)載等于邏輯 CPU 個(gè)數(shù),這表示每個(gè) CPU 都恰好被充分利用。如果平均負(fù)載大于邏輯 CPU 個(gè)數(shù),就表示負(fù)載比較重了。
第三個(gè),進(jìn)程上下文切換。
無(wú)法獲取資源而導(dǎo)致的自愿上下文切換;被系統(tǒng)強(qiáng)制調(diào)度導(dǎo)致的非自愿上下文切換。
上下文切換,本身是保證 Linux 正常運(yùn)行的一項(xiàng)核心功能。但過(guò)多的上下文切換,會(huì)將原本運(yùn)行進(jìn)程的 CPU 時(shí)間,消耗在寄存器、內(nèi)核棧以及虛擬內(nèi)存等數(shù)據(jù)的保存和恢復(fù)上,縮短進(jìn)程真正運(yùn)行的時(shí)間,成為性能瓶頸。
還有一個(gè)指標(biāo),CPU 緩存的命中率。
由于 CPU 發(fā)展的速度遠(yuǎn)快于內(nèi)存的發(fā)展,CPU 的處理速度就比內(nèi)存的訪問(wèn)速度快得多。這樣,CPU 在訪問(wèn)內(nèi)存的時(shí)候,免不了要等待內(nèi)存的響應(yīng)。為了協(xié)調(diào)這兩者巨大的性能差距,CPU 緩存(通常是多級(jí)緩存)就出現(xiàn)了。
這張圖顯示的,CPU 緩存的速度介于 CPU 和內(nèi)存之間,緩存的是熱點(diǎn)的內(nèi)存數(shù)據(jù)。根據(jù)不斷增長(zhǎng)的熱點(diǎn)數(shù)據(jù),這些緩存按照大小不同分為 L1、L2、L3 等三級(jí)緩存,其中 L1 和 L2 常用在單核中, L3 則用在多核中。
從 L1 到 L3,三級(jí)緩存的大小依次增大,相應(yīng)的,性能依次降低(當(dāng)然比內(nèi)存還是好得多)。而它們的命中率,衡量的是 CPU 緩存的復(fù)用情況,命中率越高,則表示性能越好。
性能工具
首先,平均負(fù)載的案例。先用 uptime, 查看了系統(tǒng)的平均負(fù)載;而在平均負(fù)載升高后,又用 mpstat 和 pidstat ,分別觀察了每個(gè) CPU 和每個(gè)進(jìn)程 CPU 的使用情況,進(jìn)而找出了導(dǎo)致平均負(fù)載升高的進(jìn)程。
先用 vmstat ,查看了系統(tǒng)的上下文切換次數(shù)和中斷次數(shù);然后通過(guò) pidstat ,觀察了進(jìn)程的自愿上下文切換和非自愿上下文切換情況;最后通過(guò) pidstat ,觀察了線程的上下文切換情況,找出了上下文切換次數(shù)增多的根源。
進(jìn)程 CPU 使用率升高的案例。先用 top ,查看了系統(tǒng)和進(jìn)程的 CPU 使用情況,發(fā)現(xiàn) CPU 使用率升高的進(jìn)程是 php-fpm;再用 perf top ,觀察 php-fpm 的調(diào)用鏈,最終找出 CPU 升高的根源,也就是庫(kù)函數(shù) sqrt() 。
系統(tǒng)的 CPU 使用率升高的案例。我們先用 top 觀察到了系統(tǒng) CPU 升高,但通過(guò) top 和 pidstat ,卻找不出高 CPU 使用率的進(jìn)程。于是,重新審視 top 的輸出,又從 CPU 使用率不高但處于 Running 狀態(tài)的進(jìn)程入手,找出了可疑之處,最終通過(guò) perf record 和 perf report ,發(fā)現(xiàn)原來(lái)是短時(shí)進(jìn)程在搗鬼。
對(duì)于短時(shí)進(jìn)程,我還介紹了一個(gè)專門的工具 execsnoop,它可以實(shí)時(shí)監(jiān)控進(jìn)程調(diào)用的外部命令。
不可中斷進(jìn)程和僵尸進(jìn)程的案例。我們先用 top 觀察到了 iowait 升高的問(wèn)題,并發(fā)現(xiàn)了大量的不可中斷進(jìn)程和僵尸進(jìn)程;接著用 dstat 發(fā)現(xiàn)是這是由磁盤讀導(dǎo)致的,于是又通過(guò) pidstat 找出了相關(guān)的進(jìn)程。但我們用 strace 查看進(jìn)程系統(tǒng)調(diào)用卻失敗了,最終還是用 perf 分析進(jìn)程調(diào)用鏈,才發(fā)現(xiàn)根源在于磁盤直接 I/O
軟中斷的案例。通過(guò) top 觀察到,系統(tǒng)的軟中斷 CPU 使用率升高;接著查看 /proc/softirqs, 找到了幾種變化速率較快的軟中斷;然后通過(guò) sar 命令,發(fā)現(xiàn)是網(wǎng)絡(luò)小包的問(wèn)題,最后再用 tcpdump ,找出網(wǎng)絡(luò)幀的類型和來(lái)源,確定是一個(gè) SYN FLOOD 攻擊導(dǎo)致的。
把性能指標(biāo)和性能工具聯(lián)系起來(lái)第一個(gè)維度,從 CPU 的性能指標(biāo)出發(fā)。也就是說(shuō),當(dāng)要查看某個(gè)性能指標(biāo)時(shí),要清楚知道哪些工具可以做到。
根據(jù)不同的性能指標(biāo),對(duì)提供指標(biāo)的性能工具進(jìn)行分類和理解
用 top 發(fā)現(xiàn)了軟中斷 CPU 使用率高后,下一步自然就想知道具體的軟中斷類型。查看proc 文件系統(tǒng)中的 /proc/softirqs 這個(gè)文件。找到的軟中斷類型是網(wǎng)絡(luò)接收,那就要繼續(xù)往網(wǎng)絡(luò)接收方向思考。用的正是 dstat查看網(wǎng)絡(luò)報(bào)文接收情況
第二個(gè)維度,從工具出發(fā)。也就是當(dāng)已經(jīng)安裝了某個(gè)工具后,要知道這個(gè)工具能提供哪些指標(biāo)。
這在實(shí)際環(huán)境特別是生產(chǎn)環(huán)境中也是非常重要的,因?yàn)楹芏嗲闆r下,你并沒有權(quán)限安裝新的工具包,只能最大化地利用好系統(tǒng)中已經(jīng)安裝好的工具,這就需要你對(duì)它們有足夠的了解。具體到每個(gè)工具的使用方法,一般都支持豐富的配置選項(xiàng)。不過(guò)不用擔(dān)心,這些配置選項(xiàng)并不用背下來(lái)。你只要知道有哪些工具、以及這些工具的基本功能是什么就夠了。真正要用到的時(shí)候, 通過(guò) man 命令,查它們的使用手冊(cè)就可以了。
迅速分析 CPU 的性能瓶頸
在實(shí)際生產(chǎn)環(huán)境中,通常都希望盡可能快地定位系統(tǒng)的瓶頸,然后盡可能快地優(yōu)化性能,也就是要又快又準(zhǔn)地解決性能問(wèn)題。
雖然 CPU 的性能指標(biāo)比較多,但要知道,既然都是描述系統(tǒng)的 CPU 性能,它們就不會(huì)是完全孤立的,很多指標(biāo)間都有一定的關(guān)聯(lián)。想弄清楚性能指標(biāo)的關(guān)聯(lián)性,就要通曉每種性能指標(biāo)的工作原理。
用戶 CPU 使用率高,應(yīng)該去排查進(jìn)程的用戶態(tài)而不是內(nèi)核態(tài)。因?yàn)橛脩?CPU 使用率反映的就是用戶態(tài)的 CPU 使用情況,而內(nèi)核態(tài)的 CPU 使用情況只會(huì)反映到系統(tǒng) CPU 使用率上。有這樣的基本認(rèn)識(shí),就可以縮小排查的范圍,省時(shí)省力。
所以,為了縮小排查范圍,通常會(huì)先運(yùn)行幾個(gè)支持指標(biāo)較多的工具,如 top、vmstat 和 pidstat
這三個(gè)命令,幾乎包含了所有重要的 CPU 性能指標(biāo),比如:從 top 的輸出可以得到各種 CPU 使用率以及僵尸進(jìn)程和平均負(fù)載等信息。從 vmstat 的輸出可以得到上下文切換次數(shù)、中斷次數(shù)、運(yùn)行狀態(tài)和不可中斷狀態(tài)的進(jìn)程數(shù)。從 pidstat 的輸出可以得到進(jìn)程的用戶 CPU 使用率、系統(tǒng) CPU 使用率、以及自愿上下文切換和非自愿上下文切換情況。
pidstat 輸出的進(jìn)程用戶 CPU 使用率升高,會(huì)導(dǎo)致 top 輸出的用戶 CPU 使用率升高。所以,當(dāng)發(fā)現(xiàn) top 輸出的用戶 CPU 使用率有問(wèn)題時(shí),可以跟 pidstat 的輸出做對(duì)比,觀察是否是某個(gè)進(jìn)程導(dǎo)致的問(wèn)題。而找出導(dǎo)致性能問(wèn)題的進(jìn)程后,就要用進(jìn)程分析工具來(lái)分析進(jìn)程的行為,比如使用 strace 分析系統(tǒng)調(diào)用情況,以及使用 perf 分析調(diào)用鏈中各級(jí)函數(shù)的執(zhí)行情況。
top 輸出的平均負(fù)載升高,可以跟 vmstat 輸出的運(yùn)行狀態(tài)和不可中斷狀態(tài)的進(jìn)程數(shù)做對(duì)比,觀察是哪種進(jìn)程導(dǎo)致的負(fù)載升高。
如果是不可中斷進(jìn)程數(shù)增多了,那么就需要做 I/O 的分析,也就是用 dstat 或 sar 等工具,進(jìn)一步分析 I/O 的情況。如果是運(yùn)行狀態(tài)進(jìn)程數(shù)增多了,那就需要回到 top 和 pidstat,找出這些處于運(yùn)行狀態(tài)的到底是什么進(jìn)程,然后再用進(jìn)程分析工具,做進(jìn)一步分析。
當(dāng)發(fā)現(xiàn) top 輸出的軟中斷 CPU 使用率升高時(shí),可以查看 /proc/softirqs 文件中各種類型軟中斷的變化情況,確定到底是哪種軟中斷出的問(wèn)題。比如,發(fā)現(xiàn)是網(wǎng)絡(luò)接收中斷導(dǎo)致的問(wèn)題,那就可以繼續(xù)用網(wǎng)絡(luò)分析工具 sar 和 tcpdump 來(lái)分析。
總結(jié)
- 上一篇: H5 引入阿里矢量图标库 symbol
- 下一篇: [AngularJS] Reusable