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