性能測試監控指標及分析調優 | 京東雲技術團隊

来源:https://www.cnblogs.com/Jcloud/archive/2023/05/26/17435175.html
-Advertisement-
Play Games

### 一、哪些因素會成為系統的瓶頸? 1、CPU,如果存在大量的計算,他們會長時間不間斷的占用CPU資源,導致其他資源無法爭奪到CPU而響應緩慢,從而帶來系統性能問題,例如頻繁的FullGC,以及多線程造成的上下文頻繁的切換,都會導致CPU繁忙,一般情況下CPU使用率 作者:京東健康 牛金亮 > ...


一、哪些因素會成為系統的瓶頸?

1、CPU,如果存在大量的計算,他們會長時間不間斷的占用CPU資源,導致其他資源無法爭奪到CPU而響應緩慢,從而帶來系統性能問題,例如頻繁的FullGC,以及多線程造成的上下文頻繁的切換,都會導致CPU繁忙,一般情況下CPU使用率<75%比較合適。

2、記憶體,Java記憶體一般是通過jvm記憶體進行分配的,主要是用jvm中堆記憶體來存儲Java創建的對象。記憶體的讀寫速度非常快,但是記憶體空間又是有限的,當記憶體空間被占滿,對象無法回收時,就會導致記憶體溢出或記憶體泄漏。

3、磁碟I/O,磁碟的存儲空間要比記憶體存儲空間大很多,但是磁碟的讀寫速度比記憶體慢,雖然現在引入SSD固態硬碟,但是還是無法跟記憶體速度相比。

4、網路,帶寬的大小,會對傳輸數據有很大影響,當併發量增加時,網路很容易就會成為瓶頸。

5、異常,Java程式,拋出異常,要對異常進行捕獲,這個過程要消耗性能,如果在高併發的情況下,持續進行異常處理,系統的性能會受影響。

6、資料庫,資料庫的操作一般涉及磁碟I/O的讀寫,大量的資料庫讀寫操作,會導致磁碟I/O性能瓶頸,進而導致資料庫操作延遲。

7、當在併發編程的時候,經常會用多線程操作同一個資源,這個時候為了保證數據的原子性,就要使用到鎖,鎖的使用會帶來上下文切換,從而帶來性能開銷,在JDK1.6之後新增了偏向鎖、自旋鎖、輕量級鎖、鎖粗化、鎖消除。

二、哪些指標做為衡量系統的性能

1、RT響應時間,包括如下

1.1 資料庫響應時間,即資料庫操作的時間

1.2 服務端響應時間,服務端包括Nginx分發的請求所消耗的時間及服務端程式執行所消耗的時間。

1.3 網路響應時間,網路傳輸,網路硬體需要對傳輸的請求進行解析所消耗的時間

1.4 客戶端響應時間,一般Web、App客戶端,消耗時間可以忽略不計,但是如果客戶端存在大量的邏輯處理,消耗的時間有能能就會變長。

2、TPS吞吐量

2.1 磁碟吞吐量

IOPS(Input/Output Per Second)每秒的輸入輸出量,這種是單位時間內系統能處理的I/O請求數量,I/O請求通常為讀或寫數據操作請求,關註隨機讀寫性能,適用於隨機讀寫頻繁的應用,如小文件存儲,郵件伺服器。 數據吞吐量,這種是單位時間可以傳輸的數據量,對於大量順序讀寫頻繁的應用,傳輸大量連續數據,例如視頻編輯。

2.2 網路吞吐量

指網路傳輸時沒有丟幀的情況下,設備能夠接受的最大數據速率。網路吞吐量不僅跟帶寬有關係,還跟CPU處理能力、網卡、防火牆、以及I/O等緊密聯繫,吞吐量的大小由網卡的處理能力、內部程式演算法以及帶寬大小決定。

3、資源使用率

3.1 CPU使用率,首先可以先瞭解CPU的基本信息,包括物理CPU的個數、單個CPU的核數,然後可以通過命令查看使用率,vmstat、mpstat、top

3.2 記憶體使用率,free -m、vmstat、top

3.3 磁碟I/O, iostat、 iotop、

3.4 網路I/O,netstat、ifconfig、tcpstat、

三、性能測試註意的問題

1、我們在做性能測試的時候,系統的運行會越來越快,後面的訪問速度比我們第一次訪問的速度快了好幾倍,這是因為Java語言編譯的順序是,.java文件先編譯為.class文件,然後通過解釋器將.class的位元組碼轉換成本地機器碼後,才能運行。為了節約記憶體和執行效率,代碼最初被執行時,解釋器會率先解釋執行這段代碼。隨著代碼被執行的次數增多,虛擬機發現某個方法或代碼運行的特別頻繁,就被認定為熱點代碼(Hot Spot Code)。為了提高熱點代碼的執行效率,在運行時虛擬機將會通過即時編譯器(JIT)把這些代碼編譯成為本地平臺相關的機器碼,然後儲存在記憶體中,之後每次運行代碼時,直接從記憶體中獲取。這樣就會導致第一次系統運行慢,後面訪問的速度快幾倍。

2、在做性能測試的時候,每次測試處理的數據集都是一樣的,但是結果卻有差異,這是因為測試時,伴隨著很多不穩定因素,比如機器其他進程的影響、網路波動以及每個階段JVM垃圾回收的不同等。我們可以通過多次測試,將測試結果求平均,只要保證平均值在合理範圍之內,並且波動不是很大,這種情況,性能測試就算通過。

四、定位性能問題的時候,可以使用自下而上的策略分析排查

當我們進行壓測之後,我們會輸出一份性能測試報告,其中包括,RT、TPS、TP99,被壓伺服器的CPU、記憶體、I/O,以及JVM的GC頻率。通過這些指標可以發現性能瓶頸。我們可以採用自下而上的方式進行分析。

1、首先從操作系統層面,查看系統的CPU、記憶體、I/O、網路的使用率是否異常,再通過命令查找異常日誌,最後通過日誌分析,找到導致瓶頸的問原因。

2、還可以從Java應用的JVM層面,查看JVM的垃圾回收頻率以及記憶體分配情況是否存在異常,分析垃圾回收日誌,找到導致瓶頸的原因。

3、如果系統和JVM層面都沒有出現異常情況,然後可以從應用服務業務層查看是否存在性能瓶頸,例如,Java編程問題,讀寫資料庫瓶頸等。

五、優化性能問題的時候,可以使用自上而下的策略進行優化

整體的調優順序,我們可以從業務調優到編程調優,最後再到系統調優

1、應用層調優

首先是優化代碼,代碼問題往往會因為消耗系統資源而暴漏出來,例如代碼導致記憶體溢出,使JVM記憶體用完,而發生頻繁的FullGC,導致CPU偏高。

其次是優化設計,主要是優化業務層和中間件層代碼,例如可以採用代理模式,放在頻繁調用的創建對象的場景里,共用一個創建對象,減少創建對象的消耗。

再次是優化演算法,選擇合適的演算法降低時間複雜度。

2、中間件調優

MySQL調優

1)、表結構與索引優化。

主要是對資料庫設計、表結構設計以及索引設置維度進行的優化,設計表結構的時候,考慮資料庫的水平與垂直的拓展能力,提前規劃好將來數據量、讀寫量的增長,規劃好分庫分表方案。對欄位選擇合適的數據類型,優先選用較小的數據結構。

2)、SQL語句優化。

主要是對SQL語句進行的優化,使用explain來查看執行計劃,來查看是否使用了索引,使用了哪些索引。也可以使用Profile命令分析語句執行過程中各個分步的耗時。

3)、MySQL參數優化。

主要是對MySQL服務的配置進行優化,例如連接數的管理,對索引緩存、查詢緩存、排序緩存等各種緩存大小進行優化

4)、硬體及系統配置。

對硬體設備和操作系統設置進行優化,例如調整操作系統參數、禁用swap、增加記憶體、升級固態硬碟。

3、系統調優

首先是操作系統調優,Linux操作的內核參數設置可以進行調優,已達到提供高性能的目的。
其次,JVM調優,設置合理的JVM記憶體空間,以及垃圾回收演算法來提高性能,例如,如果業務邏輯會創建大對象,我們就可以設置,將大的對象直接放到老年代中,這樣可以減少年輕代頻發發生YongGC,減少CPU的占用時間。

4、調優的策略

首先是時間換取空間,有的時候系統對查詢速度要求不高,對存儲空間要求較高,這個時候我們可以考慮用時間換取空間。

其次是空間換取時間,用存儲空間提升訪問速度,典型的就是MySQL的分庫分表策略,MySQL表單數據存儲千萬以上的時候,讀寫性能就會下降,這個時候我們可以將數據進行拆分,以達到查詢的時候,每個表的數據是少量的,以達到提升性能的目的。

5、兜底策略

系統調優後,仍然還會存在性能問題,這個時候我們需要有兜底策略, 首先是限流,對系統的入口設置最大訪問限制,同時採取斷熔措施,返回沒有成功的請求。 其次是橫向擴容,當訪問量超過某一個閾值時,系統可以自動橫向增加服務。

作者:京東健康 牛金亮

內容來源:京東雲開發者社區


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • >我們是[袋鼠雲數棧 UED 團隊](http://ued.dtstack.cn/),致力於打造優秀的一站式數據中台產品。我們始終保持工匠精神,探索前端道路,為社區積累並傳播經驗價值。。 >本文作者:琉易 [liuxianyu.cn](https://link.juejin.cn/?target=h ...
  • # JavaScript 格式化金額 ## 一、[使用 `Intl.NumberFormat` 構造函數](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberForm ...
  • > 隨著人工智慧技術的不斷發展,阿裡體育等IT大廠,推出的“樂動力”、“天天跳繩”AI運動APP,讓**雲上運動會、線上運動會、健身打卡、AI體育指導**等概念空前火熱。那麼,能否將這些在APP成功應用的場景搬上小程式,分享這些概念的紅利呢?本系列文章就帶您一步一步從零開始開發一個AI運動小程式,本 ...
  • 前端構建的提速是一項比較複雜且細節的工程, 目前產品上在持續跟蹤構建慢的應用, 努力優化編譯速度, 但前端本身擁有一個比較自由的技術環境, 沒有統一的構建工具與流程, 另外語言本身的執行效率、單線程的構建也不好讓編譯機發揮其最大能力, 所以目前全局的通用優化手段還是會比較局限, 還是依賴項目自身的優... ...
  • 如果你有 *n* 個緩存伺服器,一個常見的負載均衡方式是使用以下的哈希方法: *伺服器索引 = 哈希(鍵) % N*,其中 *N* 是伺服器池的大小。 讓我們通過一個例子來說明這是如何工作的。如表5-1所示,我們有4台伺服器和8個字元串鍵及其哈希值。 ![image-2023052022160981 ...
  • # 1.初識變數 編程本質就是通過一定的規則,去操縱數據,變數作為數據的載體,在程式中經常會被用到。與變數相聯繫的還有一個名詞叫數據類型,我們可以舉一個生活中的例子,來理解**數據類型-變數-數據**三者之間的關係 ![image](https://img2023.cnblogs.com/blog/ ...
  • # 使用 Rust 構建微型游戲 -- 用於理解游戲開發 ## 一、 創建游戲 ### Agenda + 建立項目 + 實現 Game loop + 不同的游戲模式 + 添加玩家 + 添加障礙和計分 + 彙總 ### 理解 Game loop 為了讓游戲流暢、順滑的運行,需要使用 Game loop ...
  • 作者:知了一笑\ 來源:juejin.cn/post/7210194936276680759 ## 一、背景 前段時間,在做項目重構的時候,遇到很多地方需要做很多的條件判斷。當然可以用很多的if-else判斷去解決,但是當時也不清楚怎麼回事,就想玩點別的。於是乎,就去調研了規則引擎。 當然,市面上有 ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...