性能調優 -- 哪些計算機資源有可能成為系統的性能瓶頸?


  • CPU

  有些應用需要大量計算,會長時間、不間斷地占用CPU資源,導致其他資源無法爭奪到CPU而響應緩慢,從而帶來系統性能問題。比如:代碼遞歸導致的無限循環,正則表達式引起的回溯,JVM頻繁的FULL GC,以及多線程編程造成的大量上下文切換等等,這些都有可能導致CPU資源繁忙。

  • 內存   

   Java程序一般通過JVM對內存進行分配管理,主要是用JVM中的堆內存來存儲Java創建的對象。系統堆內存的讀寫速度非常快,所以基本不存在讀寫性能瓶頸。但是由於內存成本比磁盤高,相比磁盤,內存的存儲空間非常有限。所以當內存空間被占滿時,對象無法回收,就會導致內存溢出、內存泄漏等問題。

  • 磁盤I/O  

  磁盤相比內存來說,存儲空間要大很多,但磁盤I/O讀寫速度要比內存慢,雖然目前引入的SSD固態硬盤已經有所優化,但仍然無法與內存的讀寫速度相提並論。

  • 網絡

  網絡對於系統性能來說,也起着至關重要的作用。如果你購買過雲服務,一定經歷過,選擇網絡帶寬大小這一環節。帶寬過低的話,對於傳輸數據比較大,或者是並發量比較大的系統,網絡就很容易成為性能瓶頸。  

  • 異常

  Java應用中,拋出異常需要構建異常棧,對異常進行捕獲和處理,這個過程非常消耗系統性能。如果在高並發的情況下引發異常,持續地進行異常處理,那么系統的性能就會明顯地受到影響。  

  • 數據庫

  大部分系統都會用到數據庫。而數據庫地操作往往是涉及到磁盤I/O的讀寫。大量的數據庫讀寫操作,會導致磁盤I/O性能瓶頸,進而導致數據庫操作的延遲性。對於有大量數據庫讀寫操作的系統來說,數據庫的性能優化是整個系統的核心。 

  • 鎖競爭

  在並發編程中,我們經常會需要多個線程,共享讀寫操作同一個資源,這個時候為了保持數據的原子性(即保證這個共享資源在一個線程寫的時候,不被另一個線程修改),我們就會用到鎖。鎖的使用可能會帶來上下文切換,從而給系統帶來性能開銷。JDK1.6之后,Java為了降低鎖競爭帶來的上下文切換,對JVM內部鎖已經做了多次優化,比如:新增了偏向鎖、自旋鎖、輕量級鎖、鎖粗化、鎖消除等。如何合理地使用鎖資源,也是性能優化時需要注意的一點。

  • 響應時間  

   響應時間是衡量系統性能的重要指標之一,響應時間越短,性能越好,一般一個接口的響應時間是在毫秒級。在系統中,我們可以把響應時間自下而上細分為以下幾種:

  1. 數據庫響應時間:數據庫操作所消耗的時間,往往是整個請求鏈中最耗時的;
  2. 服務端響應時間:服務端包括nginx分發的請求所消耗的時間以及服務端程序執行所消耗的時間;
  3. 網絡響應時間:這是網絡傳輸時,網絡硬件需要對傳輸的請求進行解析等操作所消耗的時間;
  4. 客戶端響應時間:對於普通的Web、App客戶端來說,消耗時間是可以忽略不計的,但如果你的客戶端嵌入了大量的邏輯處理,消耗的時間就有可能變長,從而成為系統的瓶頸。
  • 吞吐量

  在測試中,我們往往會比較注重系統接口的TPS(每秒事務處理量),因為TPS體現了接口的性能,TPS越大,性能越好。在系統中,我們也可以把吞吐量自下而上地分為兩種:磁盤吞吐量和網絡吞吐量     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM