溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux性能優(yōu)化讀書筆記01

發(fā)布時(shí)間:2020-05-19 10:56:36 來源:網(wǎng)絡(luò) 閱讀:232 作者:xingq55 欄目:系統(tǒng)運(yùn)維

查看系統(tǒng)cpu個(gè)數(shù):
(1)grep 'model name' /proc/cpuinfo|wc -l

(2)grep 'core id' /proc/cpuinfo|wc -l

性能工具的安裝:
(1)centos:yum install -y stress sysstat

(2)ubuntu:apt install stress sysstat

實(shí)戰(zhàn)
情景一:CPU密集型進(jìn)程
(1)壓測(cè)cpu:stress --cpu 1 --timeout 600

(2)查看系統(tǒng)平均負(fù)載的變化:watch -d uptime (-d 表示高亮顯示變化的區(qū)域)

(3)查看系統(tǒng)cpu使用率的變化情況:mpstat -P ALL 5 (-P ALL 表示監(jiān)控所有的cpu,后面的數(shù)字5表示間隔5秒輸出一組數(shù)據(jù))動(dòng)態(tài)的輸出

(4)查看系統(tǒng)進(jìn)程使用cpu情況:pidstat -u 5 2 (-u表示每隔5秒輸出一組數(shù)據(jù),總共輸出兩次,并打印出平均數(shù)值)

情景二:I/O密集型進(jìn)程
壓測(cè)IO:stress --io 1 --timeout 600

過程如情景一
情景三:大量進(jìn)程的場(chǎng)景
模擬8個(gè)進(jìn)程:stress --cpu 8 --timeout 600

過程如情景一
情景四:查看系統(tǒng)上下文切換情況
查看上下文切換:vmstat 5(每隔5秒輸出1組數(shù)據(jù))
Linux性能優(yōu)化讀書筆記01

(1)cs(context switch)就是每秒上下文切換的次數(shù)

(2)in(interrupt)每秒中斷的次數(shù)

(3)r(running or runnable)表示就緒隊(duì)列的長(zhǎng)度,也就是正在運(yùn)行和等待CPU的進(jìn)程數(shù)

(4)b(blocked)表示處于不可中斷睡眠狀態(tài)的進(jìn)程數(shù)

查看詳細(xì)上下文切換的情況:pidstat -w 5(每隔5秒輸出1組數(shù)據(jù),動(dòng)態(tài)的)
Linux性能優(yōu)化讀書筆記01

(1)cswch表示每秒自愿上下文切換(voluntary context switches)的次數(shù)

(2)nvcswch表示每秒非自愿上下文切換(non voluntary context switches)的次數(shù)

上下文切換概念:
(1)自愿上下文切換:指進(jìn)程無(wú)法獲取所需資源,導(dǎo)致的上下文切換。比如,I/O,內(nèi)存等系統(tǒng)資源不足時(shí);

(2)非自愿上下文切換:指進(jìn)程由于時(shí)間片已到等原因,被系統(tǒng)強(qiáng)制調(diào)度,進(jìn)而發(fā)生的上下文切換。比如,大量進(jìn)程都在爭(zhēng)搶CPU時(shí);

模擬多線程調(diào)度:
(1)centos:yum install -y sysbench

(2)ubuntu:apt install sysbench

測(cè)試:
(1)以10個(gè)線程運(yùn)行5分鐘的基準(zhǔn)測(cè)試,模擬系統(tǒng)多線程切換的問題:sysbench --threads=10 --max-time=300 threads run

(2)觀察上下文切換情況:vmstat 1

Linux性能優(yōu)化讀書筆記01

(3)查看cpu和上下文切換的進(jìn)程和線程情況:pidstat -w -u 1

Linux性能優(yōu)化讀書筆記01

系統(tǒng)的就緒隊(duì)列過長(zhǎng),也就是正在運(yùn)行和等待cpu的進(jìn)程數(shù)過多,導(dǎo)致大量的上下文切換,而上下文切換又導(dǎo)致了系統(tǒng)cpu的占用率升高。

(4)上圖中pidstat 默認(rèn)顯示進(jìn)程的指標(biāo)數(shù)據(jù),加上-t參數(shù)后,才會(huì)輸出線程的指標(biāo)。

Linux性能優(yōu)化讀書筆記01

(5)查找源頭,注意中斷次數(shù),是什么類型的中斷上升呢:watch -d cat /proc/interrupts

會(huì)發(fā)現(xiàn)是RES(重調(diào)度中斷),這個(gè)中斷類型表示,喚醒空閑狀態(tài)的CPU來調(diào)度新的任務(wù)運(yùn)行。

情景五:查看CPU使用率
使用工具top和ps:
(1)top:顯示系統(tǒng)總體的CPU和內(nèi)存使用情況,以及各個(gè)進(jìn)程的資源使用情況,默認(rèn)每隔3秒刷新一次

Linux性能優(yōu)化讀書筆記01

空白行之后是進(jìn)程的實(shí)時(shí)信息,每個(gè)進(jìn)程都有一個(gè)%CPU列,表示進(jìn)程的CPU使用率。

它是用戶態(tài)和內(nèi)核態(tài)CPU使用率總和,包括進(jìn)程用戶空間使用的CPU、通過系統(tǒng)調(diào)用執(zhí)行的內(nèi)核空間CPU、以及在就緒隊(duì)列等待運(yùn)行的CPU。在虛擬化環(huán)境中,它還包括了運(yùn)行虛擬機(jī)占用的CPU。

Top并沒有細(xì)分進(jìn)程的用戶態(tài)CPU和內(nèi)核態(tài)CPU,那么怎么查看每個(gè)進(jìn)程的詳細(xì)情況呢:pidstat 1 5(每隔1秒輸出一組數(shù)據(jù),共輸出5組 )

(2)ps:只顯示每個(gè)進(jìn)程的資源使用情況

CPU過高排查工具:想知道占用CPU的到底是代碼里的哪個(gè)函數(shù),找到它,才能更高效、更針對(duì)性地進(jìn)行優(yōu)化。
(1)GDB(the GNU Project Debugger)功能強(qiáng)大的程序調(diào)試?yán)?,但不適合在性能分析的早期應(yīng)用,因?yàn)镚DB調(diào)試程序過程會(huì)中斷程序運(yùn)行,這在線上環(huán)境往往是不允許的。

(2)perf(Linux2.6.31以后內(nèi)置的性能分析工具),它以性能事件采樣為基礎(chǔ),不僅可以分析系統(tǒng)的各種事件和內(nèi)核性能,還可以用來分析指定應(yīng)用程序的性能問題。如系統(tǒng)沒有,請(qǐng)安裝:yum install -y perf

perf兩種常見用法:
(1)perf top類似于top,它能夠?qū)崟r(shí)顯示占用CPU時(shí)鐘最多的函數(shù)或指令,因此可以用來查找熱點(diǎn)函數(shù),如下:

Linux性能優(yōu)化讀書筆記01

第一行包含三個(gè)數(shù)據(jù),分別是:采樣數(shù)(Samples)、事件類型(event)和事件總數(shù)量(Event count)

另外注意:如果采樣數(shù)過少(比如直有十幾個(gè)),那下面的排序和百分比就沒有什么實(shí)際參考價(jià)值了。

再往下看是一個(gè)表格式樣的數(shù)據(jù),每一行包含四列,分別是:

第一列Overhead,是該符號(hào)的性能事件在所有采樣中的比例,用百分比來表示。

第二列Shared,是該函數(shù)或指令所在的動(dòng)態(tài)共享對(duì)象(Dynamic Shared Object),如內(nèi)核、進(jìn)程名、動(dòng)態(tài)鏈接庫(kù)名、內(nèi)核模塊名等。

第三列Object,是動(dòng)態(tài)共享對(duì)象的類型。比如[.]表示用戶空間的可執(zhí)行程序、或者動(dòng)態(tài)鏈接庫(kù),而[k]則表示內(nèi)核空間。

第四列Symbol是符號(hào)名,也就是函數(shù)名。當(dāng)函數(shù)名未知時(shí),用十六進(jìn)制的地址來表示。

(2)perf record和perf report

perf top雖然實(shí)時(shí)展示了系統(tǒng)的性能信息,但它缺點(diǎn)是不能保存數(shù)據(jù),也就是無(wú)法用于離線或者后續(xù)的分析。

perf record則提供了保存數(shù)據(jù)的功能,保存后的數(shù)據(jù),需要用perf report解析展示。

實(shí)際工作中,我們還經(jīng)常為perf top和perf record加上-g參數(shù),開啟調(diào)用關(guān)系的采樣,方便我們根據(jù)調(diào)用鏈來分析性能問題。

比如:perf top -g -p 21515(-g開啟調(diào)用關(guān)系分析,-p指定服務(wù)的進(jìn)程號(hào)是21515)

HTTP服務(wù)性能測(cè)試工具:ab(apache bench)
比如:ab -c 10 -n 1000 http://192.168.246.191:80/(并發(fā)10個(gè)請(qǐng)求,總共測(cè)試1000個(gè)請(qǐng)求)

情景六:系統(tǒng)的CPU使用率很高,但是找不到高CPU的應(yīng)用
pidstat -p 24344(指定PID是24344的進(jìn)程)

Pstree 用樹狀形式顯示所有進(jìn)程之間的關(guān)系

grep stress -r app/ (-r目錄遞歸)

execsnoop :一個(gè)專門為段時(shí)進(jìn)程設(shè)計(jì)的工具。它通過ftrace實(shí)時(shí)監(jiān)控進(jìn)程的exec()行為,并輸出短時(shí)進(jìn)程的基本信息,包括進(jìn)程的PID、父進(jìn)程PID、命令行參數(shù)以及執(zhí)行的結(jié)果。

常規(guī)無(wú)法解釋的CPU使用率情況,有可能是下面這兩種情況:
(1)應(yīng)用里直接調(diào)用了其他二進(jìn)制程序,這些程序通常運(yùn)行時(shí)間比較短,通過top等工具不容易發(fā)現(xiàn);

(2)應(yīng)用本身在不停地奔潰重啟,而啟動(dòng)過程的資源初始化,很可能會(huì)占用相當(dāng)多的CPU;

對(duì)于這類進(jìn)程,我們可以用pstree或者execsnoop找到它們的父進(jìn)程,再?gòu)母高M(jìn)程所在的應(yīng)用入手,排查問題的根源。

注意??:當(dāng)碰到無(wú)法解釋的CPU使用率問題時(shí),先要檢查下是不是短時(shí)應(yīng)用在搗鬼!

情景七:系統(tǒng)中出現(xiàn)大量不可中斷進(jìn)程和僵尸進(jìn)程怎么辦(上)
Linux性能優(yōu)化讀書筆記01

進(jìn)程常見的五種狀態(tài):
(1)R 是 Running 或 Runnable 的縮寫,表示進(jìn)程在 CPU 的就緒隊(duì)列中,正在運(yùn)行或者正在等待運(yùn)行。

(2)D 是 Disk Sleep 的縮寫,也就是不可中斷狀態(tài)睡眠(Uninterruptible Sleep),一般表示進(jìn)程正在跟硬件交互,并且交互過程不允許被其他進(jìn)程或中斷打斷。

注意??:進(jìn)程長(zhǎng)時(shí)間處于不可中斷狀態(tài),通常表示系統(tǒng)有 I/O 性能問題。

(3)Z 是 Zombie 的縮寫,如果你玩過“植物大戰(zhàn)僵尸”這款,應(yīng)該知道它的意思。它表示僵尸進(jìn)程,也就是進(jìn)程實(shí)際上已經(jīng)結(jié)束了,但是父進(jìn)程還沒有回收它的資源(比如進(jìn)程的描述符、PID 等)。

(4)S 是 Interruptible Sleep 的縮寫,也就是可中斷狀態(tài)睡眠,表示進(jìn)程因?yàn)榈却硞€(gè)事件而被系統(tǒng)掛起。當(dāng)進(jìn)程等待的事件發(fā)生時(shí),它會(huì)被喚醒并進(jìn)入 R 狀態(tài)。

(5)I 是 Idle 的縮寫,也就是空閑狀態(tài),用在不可中斷睡眠的內(nèi)核線程上。前面說了,硬件交互導(dǎo)致的不可中斷進(jìn)程用 D 表示,但對(duì)某些內(nèi)核線程來說,它們有可能實(shí)際上并沒有任何負(fù)載,用 Idle 正是為了區(qū)分這種情況。要注意,D 狀態(tài)的進(jìn)程會(huì)導(dǎo)致平均負(fù)載升高,I 狀態(tài)的進(jìn)程卻不會(huì)。

進(jìn)程不常見的兩種狀態(tài):
(1)T 或者 t,也就是 Stopped 或 Traced 的縮寫,表示進(jìn)程處于暫停或者跟蹤狀態(tài)。

向一個(gè)進(jìn)程發(fā)送 SIGSTOP 信號(hào),它就會(huì)因響應(yīng)這個(gè)信號(hào)變成暫停狀態(tài)(Stopped);再向它發(fā)送 SIGCONT 信號(hào),進(jìn)程又會(huì)恢復(fù)運(yùn)行(如果進(jìn)程是終端里直接啟動(dòng)的,則需要你用 fg 命令,恢復(fù)到前臺(tái)運(yùn)行)。

而當(dāng)你用調(diào)試器(如 gdb)調(diào)試一個(gè)進(jìn)程時(shí),在使用斷點(diǎn)中斷進(jìn)程后,進(jìn)程就會(huì)變成跟蹤狀態(tài),這其實(shí)也是一種特殊的暫停狀態(tài),只不過你可以用調(diào)試器來跟蹤并按需要控制進(jìn)程的運(yùn)行。

(2)X,也就是 Dead 的縮寫,表示進(jìn)程已經(jīng)消亡,所以你不會(huì)在top 或者 ps 命令中看到它。

注意??:Ss+:S表示可中斷睡眠狀態(tài),s表示這個(gè)進(jìn)程是一個(gè)會(huì)話的領(lǐng)導(dǎo)進(jìn)程,而+表示前臺(tái)進(jìn)程組。

進(jìn)程組與會(huì)話:
它們是管理一組相互關(guān)聯(lián)的進(jìn)程,意思如下:

(1)進(jìn)程組表示一組相互關(guān)聯(lián)的進(jìn)程,比如每個(gè)子進(jìn)程都是父進(jìn)程所在組的成員;

(2)會(huì)話是指共享同一個(gè)控制端的一個(gè)或多個(gè)進(jìn)程組;

比如,我們通過 SSH 登錄服務(wù)器,就會(huì)打開一個(gè)控制終端(TTY),這個(gè)控制終端就對(duì)應(yīng)一個(gè)會(huì)話。而我們?cè)诮K端中運(yùn)行的命令以及它們的子進(jìn)程,就構(gòu)成了一個(gè)個(gè)的進(jìn)程組,,其中,在后臺(tái)運(yùn)行的命令,構(gòu)成后臺(tái)進(jìn)程組;在前臺(tái)運(yùn)行的命令,構(gòu)成前臺(tái)進(jìn)程組。

安裝dstat
(1)CentOS:yum install -y dstat

(2)Ubuntu:apt install dstat

這里dstat是一個(gè)新的性能工具,它吸收了vmstat、iostat、ifstat等幾種工具的優(yōu)點(diǎn),可以同時(shí)觀察系統(tǒng)的CPU、磁盤I/O、網(wǎng)絡(luò)以及內(nèi)存使用情況。

情景八:系統(tǒng)中出現(xiàn)大量不可中斷進(jìn)程和僵尸進(jìn)程怎么辦(下)
工具使用:
(1)dstat 1 10 (間隔1秒輸出10組數(shù)據(jù))

Linux性能優(yōu)化讀書筆記01

(2)pidstat -d -p 4344 1 3 (-d 展示 I/O 統(tǒng)計(jì)數(shù)據(jù),-p 指定進(jìn)程號(hào),間隔 1 秒輸出 3 組數(shù)據(jù))

(3)strace -p 6082 (-p指定進(jìn)程號(hào))

Strace最常用的跟蹤進(jìn)程系統(tǒng)調(diào)用的工具。

(4)perf record -g(終端運(yùn)行十五分鐘左右,再ctrl+c)

(5)perf report

僵尸進(jìn)程的處理
要解決僵尸進(jìn)程,就要找到它的根兒,也就是找出父進(jìn)程,然后在父進(jìn)程里解決。

(1)pstree -aps 3084(-a表示輸出命令行選項(xiàng),p表示PID,s表示指定進(jìn)程的父進(jìn)程)

Linux性能優(yōu)化讀書筆記01

運(yùn)行完,你會(huì)發(fā)現(xiàn) 3084 號(hào)進(jìn)程的父進(jìn)程是 4009,也就是 app 應(yīng)用。

(2)接著查看 app 應(yīng)用程序的代碼,看看子進(jìn)程結(jié)束的處理是否正確,比如有沒有調(diào)用wait() 或 waitpid() ,抑或是,有沒有注冊(cè) SIGCHLD 信號(hào)的處理函數(shù)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI