主頁 > 後端開發 > 性能測驗監控指標及分析調優 | 京東云技術團隊

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

2023-05-26 18:39:10 後端開發

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

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、兜底策略

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

作者:京東健康 牛金亮

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

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/553520.html

標籤:其他

上一篇:如何使用C++ 在Word檔案中創建串列

下一篇:返回列表

標籤雲
其他(159775) Python(38173) JavaScript(25456) Java(18138) C(15231) 區塊鏈(8268) C#(7972) AI(7469) 爪哇(7425) MySQL(7213) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5343) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4576) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1977) 功能(1967) Web開發(1951) HtmlCss(1948) C++(1922) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1862) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • 性能測驗監控指標及分析調優 | 京東云技術團隊

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

    uj5u.com 2023-05-26 18:39:10 more
  • 如何使用C++ 在Word檔案中創建串列

    串列分類是指在Word檔案中使用不同格式排序的串列,來幫助我們一目了然地表達出一段文字的主要內容。比如,當我們描述了某個主題的若干點,就可以用串列把它們一一表達出來,而不是寫成完整的段落形式。同時,串列也可以幫助我們做出精確的計算和比較,簡潔有效地表示出不同部分之間的關系。在Word檔案中創建串列可 ......

    uj5u.com 2023-05-26 18:38:47 more
  • Java的Atomic原子類

    Java SDK 并發包里提供了豐富的原子類,我們可以將其分為五個類別,這五個類別提供的方法基本上是相似的,并且每個類別都有若干原子類。 ......

    uj5u.com 2023-05-26 18:38:09 more
  • Hackathon 代碼黑客馬拉松采訪復盤

    AIGC Hackathon 2023 北京站 我參加了選手采訪提綱,這里我感覺有些點可以分享給大家。之前復盤的鏈接: 下面是采訪我的回答內容: ## 1. 請向大家簡單介紹一下自己吧? - 子木,社區名稱為程式員泥瓦匠,年齡三十歲,畢業于溫州醫科大學。 - 有8年SaaS經驗,曾在有贊和售后寶等S ......

    uj5u.com 2023-05-26 18:37:36 more
  • Rust async 編程

    # Rust async 編程 Asynchronous Programming in Rust: 中文書名《Rust 異步編程指南》: Rust語言圣經(Rust Course): ## 一、[Getting Started](https://rust-lang.github.io/async-b ......

    uj5u.com 2023-05-26 18:37:19 more
  • 【華為機試】單詞倒敘

    - 題目描述: 輸入單行英文句子,里面包含英文字母,空格以及,.?三種標點符號,請將句子內每個單詞進行倒序,并輸出倒序后的陳述句 - 輸入描述: 輸入字串 S, S 的長度 1≤N≤100 - 輸出描述: 輸出逆序后的字串。 - 解題思路: 遍歷給定句子,判斷如果字母,則插入到指定位置,如果是指定 ......

    uj5u.com 2023-05-26 18:36:39 more
  • 01.初識Python

    > 本教程計劃通過100天的時間,每天分享一篇關于python的知識點,與大家一起學習python這門編程語言。 Python 對初學者來說是一門很棒的語言: - 容易學 - 有一個積極的支持社區 - 在網路開發、游戲、資料科學方面提供多種機會。 ## Python的應用領域 目前Python在We ......

    uj5u.com 2023-05-26 18:23:04 more
  • Netty實戰(四)

    本節我們看看Netty的傳輸(全是干貨,自帶水杯 # 一、Java的NIO和OIO 流經網路的資料總是具有相同的型別:位元組。這些位元組是如何流動的主要取決于我們所說的網路傳輸。 ## 1.1 OIO 我們先來看一段Java的阻塞應用程式程式: ```java package com.example.j ......

    uj5u.com 2023-05-26 18:12:13 more
  • Python工具箱系列(三十三)

    Timescaledb 在物聯網時代,出現了大量以時間為中心海量產生的傳感器資料,稱為時序資料。這類資料的特點是: 資料記錄總有一個時間戳。 資料幾乎總是追加,不更新也不洗掉。 大量使用近期的資料。很少更新或者回填時間間隔的缺失資料。 與時間間隔頻率關系不大。但累積的資料量大,可能會有峰值。 對這類 ......

    uj5u.com 2023-05-26 18:11:53 more
  • 【python基礎】撰寫/運行hello world專案

    # 1.撰寫hello world專案 編程界每種語言的第一個程式往往都是輸出hello world。因此我們來看看,如何用Python輸出hello world。 1.如果你是初學者,main.py中的代碼暫時是無法看懂的,所以可以把main中的源代碼直接洗掉。如下所示 ![image](http ......

    uj5u.com 2023-05-26 17:58:40 more