天天看點

公司挖來一個阿裡Java大神,生産環境故障調優很溜

作者:石杉的架構筆記

目錄

  • 線上系統是如何運作的?
  • CPU 是如何并發運作多個線程的?
  • 線程太多會導緻什麼樣的後果?
  • 經常聽說的 CPU 使用率和負載到底是什麼?
  • 如何通過 top 指令來檢視 CPU 使用率和負載?

今天給大家分享一個知識點,就是平時我們線上伺服器部署的 Java 系統如果發現要是性能不太好,此時應該如何登入到線上伺服器,接着用 top 指令去分析線上系統的性能呢?下面我們就來一步一步給大家講解一下 top 指令的使用技巧。

線上系統是如何運作的?

首先,在講解 top 指令的使用技巧之前,我們先得給大家鋪墊一些基礎的知識,就是關于線上系統在伺服器上運作的時候,他會需要使用哪些資源,或者換句話說,他會需要使用到伺服器的哪些硬體呢?

首當其中的,大家必須知道一個事兒,就是我們線上運作的系統,他的本質其實就是一個 Linux 程序,也就就是 JVM 程序,這個 JVM 程序實際上會開啟多個線程,每個線程都會交給 CPU 來運作。

這個 CPU 就是我們很關鍵的一個硬體,CPU 在運作我們的線程的同時,當然也會運作線程負責執行的那部分代碼了。

如下圖:

公司挖來一個阿裡Java大神,生産環境故障調優很溜

CPU 是如何并發運作多個線程的?

但是單單是這個 CPU 運作多個線程的事兒就有的一說,可能很多人不知道的是,現代伺服器都是有多個 CPU 的,或者說一個 CPU 是有多個核的。

是以說,我們要搞清楚,一個 CPU 是有多個 cores 的,是以你的一個 cpu core 并發運作多個線程,以及多個 cpu core 同時運作多個線程,是不太一樣的。

這個一個 cpu core 并發運作多個線程,實際上他不是說同時運作多個線程,而是快速的切換運作每一個線程,什麼意思呢?

就是說,你這個 cpu core 會先運作一下線程 A,執行一小會兒他的代碼,再立刻切換去運作線程 B,運作一小會兒他的代碼再快速的切換過去運作線程 C。

他隻不過是切換的速度非常快,讓你有一種錯覺,一個 cpu core 可以同時運作多個線程一樣,其實并不是。

如下圖:

公司挖來一個阿裡Java大神,生産環境故障調優很溜

那如果是有多個 cpu core 呢?這個時候其實每個 cpu core 都可以運作一個線程了,如果你有多個 cpu core 同時運作多個線程,那就是真正的同時了,因為每個 cpu core 都可以自己獨立運作一個線程的代碼。

如下圖:

公司挖來一個阿裡Java大神,生産環境故障調優很溜

線程太多會導緻什麼樣的後果?

是以說,很多時候,其實并不是說線程越多越好的,很多兄弟往往對線上系統會犯一個錯誤,那就是以為讓系統同時運作幾百幾千個線程,就可以高并發的處理請求了。

其實根本不是,如果你要是線程太多了,會導緻每個 cpu core 要頻繁的切換來切換去的運作 n 多線程。

每次線程切換都是有時間開銷的,如果線程太多了,反而會導緻每個線程被運作了一小會兒以後,接着要過一段時間才能被再次運作,為什麼?因為線程太多了啊,cpu core 要給每個線程都運作一下,雨露均沾。

如下圖:

公司挖來一個阿裡Java大神,生産環境故障調優很溜

上面這個圖就很明顯,你一個請求來了,是交給一個線程來處理的,這個線程剛得到 cpu 運作機會,跑了一小會兒沒處理完請求呢,人家切換去執行别的線程了,而且還得運作很多别的線程,最後才能切換回來運作你這個線程,那你一個請求運作是不是要等挺久才能跑完的?

是以說,一般我們的經驗是,線上業務系統連接配接 MySQL 資料庫的這種情況,往往 4 個 cpu core 的機器,開啟 200 個業務線程處理請求,大概每秒處理 1000 左右的線程,就差不多了,因為你要是請求再多,線程再多,4 個 cpu core 就忙不過來了。

經常聽說的 CPU 使用率和負載到底是什麼?

是以這裡給大家再引入一個概念,就是 CPU 使用率和負載,CPU 使用率這個大家很好了解,CPU 使用率越高,就說明 CPU 幾乎沒閑着,一直在拼命的運轉。

負載也是同理,負載越高,說明 CPU 越是繁忙,如果要是 CPU 使用率和負載過于高,尤其是使用率,超過 90% 的時候,往往說明你的系統負載壓力就太大了,這個時候你的性能是會下降的。

因為你任何一個請求過來,繁忙的 CPU 要幹好多好多事情,他可能留給你這個請求的處理機會就比較少,導緻你這個請求就得等待一段時間才能處理完畢,是以系統性能也就必然會下降了。

如下圖:

公司挖來一個阿裡Java大神,生産環境故障調優很溜

如何通過 top 指令來檢視 CPU 使用率和負載?

是以如果線上伺服器運作的系統性能不好的時候,往往我們第一步就是可以登入到線上伺服器去通過 top 指令看一看目前伺服器的 CPU 使用率和負載是不是過高了。

如果過高了,那麼說明你目前系統壓力過大,CPU 過于繁忙,導緻請求過來以後運作的比較慢,性能自然就下來了。

當然,如果你們公司要是有可視化監控系統,直接就可以看到線上伺服器的 CPU 負載和使用率,那也是沒問題的,接着一起來看看 top 指令吧。

這裡我用自己的 mac 電腦執行了 top 指令,會得到如下的截圖:

公司挖來一個阿裡Java大神,生産環境故障調優很溜

咱們一起來看一看這個 top 指令的輸出結果裡都有什麼,東西很多,但是我們挑選重要的東西來看就行了,剛開始他輸出的 Processes 是說目前機器上的程序情況。

這裡會有在運作中的程序數量,以及在休眠中的程序,還有你的程序開啟的線程總數量,比如我的電腦裡有 387 個程序,就 2 個在運作,385 個都是在休眠,一共有 3834 個線程。

接着 Load Avg 和 CPU Usage 是比較重要的,我們可以重點看 CPU Usage 就可以了。

他意思就是說我們的 CPU 使用率,這個使用率一般是應該在最高在 80% 左右,如果到 90% 以上,甚至超過 100%,那就很危險了,像我的電腦負載很低,使用率就 1%~2%,空閑率在 90% 多。

接着 PhysMem 說的是伺服器的記憶體被使用了多少 GB,NetWorks 說的是通過網絡輸入和輸出的資料量,Disks 說的是對磁盤檔案寫入和讀取的資料量有多少,然後下面還有目前運作的主要程序清單,每個程序對 CPU 等資源的消耗都有顯示。

好了,今天的知識點就到這裡了,重點是給大家講解了 CPU 對系統性能的影響,以及如何通過 top 指令檢視伺服器的 CPU 使用率和負載情況。

若有收獲,就點個贊吧!

------------- END -------------

公司挖來一個阿裡Java大神,生産環境故障調優很溜

另外推薦儒猿課堂的1元系列課程給您,歡迎加入一起學習~

網際網路Java工程師面試突擊課(1元專享)

SpringCloudAlibaba零基礎入門到項目實戰(1元專享)

億級流量下的電商詳情頁系統實戰項目(1元專享)

Kafka消息中間件核心源碼精講(1元專享)

12個實戰案例帶你玩轉Java并發程式設計(1元專享)

Elasticsearch零基礎入門到精通(1元專享)

基于Java手寫分布式中間件系統實戰(1元專享)

基于ShardingSphere的分庫分表實戰課(1元專享)

繼續閱讀