聊聊Top命令使用技巧,拿捏住~
目錄
- 線上系統(tǒng)是如何運(yùn)行的?
- CPU 是如何并發(fā)運(yùn)行多個(gè)線程的?
- 線程太多會(huì)導(dǎo)致什么樣的后果?
- 經(jīng)常聽說的 CPU 使用率和負(fù)載到底是什么?
- 如何通過 top 命令來查看 CPU 使用率和負(fù)載?
今天給大家分享一個(gè)知識(shí)點(diǎn),就是平時(shí)我們線上服務(wù)器部署的 Java 系統(tǒng)如果發(fā)現(xiàn)要是性能不太好,此時(shí)應(yīng)該如何登錄到線上服務(wù)器,接著用 top 命令去分析線上系統(tǒng)的性能呢?下面我們就來一步一步給大家講解一下 top 命令的使用技巧。
線上系統(tǒng)是如何運(yùn)行的?
首先,在講解 top 命令的使用技巧之前,我們先得給大家鋪墊一些基礎(chǔ)的知識(shí),就是關(guān)于線上系統(tǒng)在服務(wù)器上運(yùn)行的時(shí)候,他會(huì)需要使用哪些資源,或者換句話說,他會(huì)需要使用到服務(wù)器的哪些硬件呢?
首當(dāng)其中的,大家必須知道一個(gè)事兒,就是我們線上運(yùn)行的系統(tǒng),他的本質(zhì)其實(shí)就是一個(gè) Linux 進(jìn)程,也就就是 JVM 進(jìn)程,這個(gè) JVM 進(jìn)程實(shí)際上會(huì)開啟多個(gè)線程,每個(gè)線程都會(huì)交給 CPU 來運(yùn)行。
這個(gè) CPU 就是我們很關(guān)鍵的一個(gè)硬件,CPU 在運(yùn)行我們的線程的同時(shí),當(dāng)然也會(huì)運(yùn)行線程負(fù)責(zé)執(zhí)行的那部分代碼了。
如下圖:
CPU 是如何并發(fā)運(yùn)行多個(gè)線程的?
但是單單是這個(gè) CPU 運(yùn)行多個(gè)線程的事兒就有的一說,可能很多人不知道的是,現(xiàn)代服務(wù)器都是有多個(gè) CPU 的,或者說一個(gè) CPU 是有多個(gè)核的。
所以說,我們要搞清楚,一個(gè) CPU 是有多個(gè) cores 的,所以你的一個(gè) cpu core 并發(fā)運(yùn)行多個(gè)線程,以及多個(gè) cpu core 同時(shí)運(yùn)行多個(gè)線程,是不太一樣的。
這個(gè)一個(gè) cpu core 并發(fā)運(yùn)行多個(gè)線程,實(shí)際上他不是說同時(shí)運(yùn)行多個(gè)線程,而是快速的切換運(yùn)行每一個(gè)線程,什么意思呢?
就是說,你這個(gè) cpu core 會(huì)先運(yùn)行一下線程 A,執(zhí)行一小會(huì)兒他的代碼,再立刻切換去運(yùn)行線程 B,運(yùn)行一小會(huì)兒他的代碼再快速的切換過去運(yùn)行線程 C。
他只不過是切換的速度非常快,讓你有一種錯(cuò)覺,一個(gè) cpu core 可以同時(shí)運(yùn)行多個(gè)線程一樣,其實(shí)并不是。
如下圖:
那如果是有多個(gè) cpu core 呢?這個(gè)時(shí)候其實(shí)每個(gè) cpu core 都可以運(yùn)行一個(gè)線程了,如果你有多個(gè) cpu core 同時(shí)運(yùn)行多個(gè)線程,那就是真正的同時(shí)了,因?yàn)槊總€(gè) cpu core 都可以自己獨(dú)立運(yùn)行一個(gè)線程的代碼。
如下圖:
線程太多會(huì)導(dǎo)致什么樣的后果?
所以說,很多時(shí)候,其實(shí)并不是說線程越多越好的,很多兄弟往往對(duì)線上系統(tǒng)會(huì)犯一個(gè)錯(cuò)誤,那就是以為讓系統(tǒng)同時(shí)運(yùn)行幾百幾千個(gè)線程,就可以高并發(fā)的處理請(qǐng)求了。
其實(shí)根本不是,如果你要是線程太多了,會(huì)導(dǎo)致每個(gè) cpu core 要頻繁的切換來切換去的運(yùn)行 n 多線程。
每次線程切換都是有時(shí)間開銷的,如果線程太多了,反而會(huì)導(dǎo)致每個(gè)線程被運(yùn)行了一小會(huì)兒以后,接著要過一段時(shí)間才能被再次運(yùn)行,為什么?因?yàn)榫€程太多了啊,cpu core 要給每個(gè)線程都運(yùn)行一下,雨露均沾。
如下圖:
上面這個(gè)圖就很明顯,你一個(gè)請(qǐng)求來了,是交給一個(gè)線程來處理的,這個(gè)線程剛得到 cpu 運(yùn)行機(jī)會(huì),跑了一小會(huì)兒沒處理完請(qǐng)求呢,人家切換去執(zhí)行別的線程了,而且還得運(yùn)行很多別的線程,最后才能切換回來運(yùn)行你這個(gè)線程,那你一個(gè)請(qǐng)求運(yùn)行是不是要等挺久才能跑完的?
所以說,一般我們的經(jīng)驗(yàn)是,線上業(yè)務(wù)系統(tǒng)連接 MySQL 數(shù)據(jù)庫的這種情況,往往 4 個(gè) cpu core 的機(jī)器,開啟 200 個(gè)業(yè)務(wù)線程處理請(qǐng)求,大概每秒處理 1000 左右的線程,就差不多了,因?yàn)槟阋钦?qǐng)求再多,線程再多,4 個(gè) cpu core 就忙不過來了。
經(jīng)常聽說的 CPU 使用率和負(fù)載到底是什么?
所以這里給大家再引入一個(gè)概念,就是 CPU 使用率和負(fù)載,CPU 使用率這個(gè)大家很好理解,CPU 使用率越高,就說明 CPU 幾乎沒閑著,一直在拼命的運(yùn)轉(zhuǎn)。
負(fù)載也是同理,負(fù)載越高,說明 CPU 越是繁忙,如果要是 CPU 使用率和負(fù)載過于高,尤其是使用率,超過 90% 的時(shí)候,往往說明你的系統(tǒng)負(fù)載壓力就太大了,這個(gè)時(shí)候你的性能是會(huì)下降的。
因?yàn)槟闳魏我粋€(gè)請(qǐng)求過來,繁忙的 CPU 要干好多好多事情,他可能留給你這個(gè)請(qǐng)求的處理機(jī)會(huì)就比較少,導(dǎo)致你這個(gè)請(qǐng)求就得等待一段時(shí)間才能處理完畢,所以系統(tǒng)性能也就必然會(huì)下降了。
如下圖:
如何通過 top 命令來查看 CPU 使用率和負(fù)載?
因此如果線上服務(wù)器運(yùn)行的系統(tǒng)性能不好的時(shí)候,往往我們第一步就是可以登錄到線上服務(wù)器去通過 top 命令看一看當(dāng)前服務(wù)器的 CPU 使用率和負(fù)載是不是過高了。
如果過高了,那么說明你當(dāng)前系統(tǒng)壓力過大,CPU 過于繁忙,導(dǎo)致請(qǐng)求過來以后運(yùn)行的比較慢,性能自然就下來了。
當(dāng)然,如果你們公司要是有可視化監(jiān)控系統(tǒng),直接就可以看到線上服務(wù)器的 CPU 負(fù)載和使用率,那也是沒問題的,接著一起來看看 top 命令吧。
這里我用自己的 mac 電腦執(zhí)行了 top 命令,會(huì)得到如下的截圖:
咱們一起來看一看這個(gè) top 命令的輸出結(jié)果里都有什么,東西很多,但是我們挑選重要的東西來看就行了,剛開始他輸出的 Processes 是說當(dāng)前機(jī)器上的進(jìn)程情況。
這里會(huì)有在運(yùn)行中的進(jìn)程數(shù)量,以及在休眠中的進(jìn)程,還有你的進(jìn)程開啟的線程總數(shù)量,比如我的電腦里有 387 個(gè)進(jìn)程,就 2 個(gè)在運(yùn)行,385 個(gè)都是在休眠,一共有 3834 個(gè)線程。
接著 Load Avg 和 CPU Usage 是比較重要的,我們可以重點(diǎn)看 CPU Usage 就可以了。
他意思就是說我們的 CPU 使用率,這個(gè)使用率一般是應(yīng)該在最高在 80% 左右,如果到 90% 以上,甚至超過 100%,那就很危險(xiǎn)了,像我的電腦負(fù)載很低,使用率就 1%~2%,空閑率在 90% 多。
接著 PhysMem 說的是服務(wù)器的內(nèi)存被使用了多少 GB,NetWorks 說的是通過網(wǎng)絡(luò)輸入和輸出的數(shù)據(jù)量,Disks 說的是對(duì)磁盤文件寫入和讀取的數(shù)據(jù)量有多少,然后下面還有當(dāng)前運(yùn)行的主要進(jìn)程列表,每個(gè)進(jìn)程對(duì) CPU 等資源的消耗都有顯示。
好了,今天的知識(shí)點(diǎn)就到這里了,重點(diǎn)是給大家講解了 CPU 對(duì)系統(tǒng)性能的影響,以及如何通過 top 命令查看服務(wù)器的 CPU 使用率和負(fù)載情況。