一、哪些因素會成為系統(tǒng)的瓶頸?
1、CPU,如果存在大量的計算,他們會長時間不間斷的占用CPU資源,導(dǎo)致其他資源無法爭奪到CPU而響應(yīng)緩慢,從而帶來系統(tǒng)性能問題,例如頻繁的FullGC,以及多線程造成的上下文頻繁的切換,都會導(dǎo)致CPU繁忙,一般情況下CPU使用率<75%比較合適。
2、內(nèi)存,Java內(nèi)存一般是通過jvm內(nèi)存進(jìn)行分配的,主要是用jvm中堆內(nèi)存來存儲Java創(chuàng)建的對象。內(nèi)存的讀寫速度非???,但是內(nèi)存空間又是有限的,當(dāng)內(nèi)存空間被占滿,對象無法回收時,就會導(dǎo)致內(nèi)存溢出或內(nèi)存泄漏。
3、磁盤I/O,磁盤的存儲空間要比內(nèi)存存儲空間大很多,但是磁盤的讀寫速度比內(nèi)存慢,雖然現(xiàn)在引入SSD固態(tài)硬盤,但是還是無法跟內(nèi)存速度相比。
4、網(wǎng)絡(luò),帶寬的大小,會對傳輸數(shù)據(jù)有很大影響,當(dāng)并發(fā)量增加時,網(wǎng)絡(luò)很容易就會成為瓶頸。
5、異常,Java程序,拋出異常,要對異常進(jìn)行捕獲,這個過程要消耗性能,如果在高并發(fā)的情況下,持續(xù)進(jìn)行異常處理,系統(tǒng)的性能會受影響。
6、數(shù)據(jù)庫,數(shù)據(jù)庫的操作一般涉及磁盤I/O的讀寫,大量的數(shù)據(jù)庫讀寫操作,會導(dǎo)致磁盤I/O性能瓶頸,進(jìn)而導(dǎo)致數(shù)據(jù)庫操作延遲。
7、當(dāng)在并發(fā)編程的時候,經(jīng)常會用多線程操作同一個資源,這個時候為了保證數(shù)據(jù)的原子性,就要使用到鎖,鎖的使用會帶來上下文切換,從而帶來性能開銷,在JDK1.6之后新增了偏向鎖、自旋鎖、輕量級鎖、鎖粗化、鎖消除。
二、哪些指標(biāo)做為衡量系統(tǒng)的性能
1、RT響應(yīng)時間,包括如下
1.1 數(shù)據(jù)庫響應(yīng)時間,即數(shù)據(jù)庫操作的時間
1.2 服務(wù)端響應(yīng)時間,服務(wù)端包括Nginx分發(fā)的請求所消耗的時間及服務(wù)端程序執(zhí)行所消耗的時間。
1.3 網(wǎng)絡(luò)響應(yīng)時間,網(wǎng)絡(luò)傳輸,網(wǎng)絡(luò)硬件需要對傳輸?shù)恼埱筮M(jìn)行解析所消耗的時間
1.4 客戶端響應(yīng)時間,一般Web、App客戶端,消耗時間可以忽略不計,但是如果客戶端存在大量的邏輯處理,消耗的時間有能能就會變長。
2、TPS吞吐量
2.1 磁盤吞吐量
IOPS(Input/Output Per Second)每秒的輸入輸出量,這種是單位時間內(nèi)系統(tǒng)能處理的I/O請求數(shù)量,I/O請求通常為讀或?qū)憯?shù)據(jù)操作請求,關(guān)注隨機(jī)讀寫性能,適用于隨機(jī)讀寫頻繁的應(yīng)用,如小文件存儲,郵件服務(wù)器。 數(shù)據(jù)吞吐量,這種是單位時間可以傳輸?shù)臄?shù)據(jù)量,對于大量順序讀寫頻繁的應(yīng)用,傳輸大量連續(xù)數(shù)據(jù),例如視頻編輯。
2.2 網(wǎng)絡(luò)吞吐量
指網(wǎng)絡(luò)傳輸時沒有丟幀的情況下,設(shè)備能夠接受的最大數(shù)據(jù)速率。網(wǎng)絡(luò)吞吐量不僅跟帶寬有關(guān)系,還跟CPU處理能力、網(wǎng)卡、防火墻、以及I/O等緊密聯(lián)系,吞吐量的大小由網(wǎng)卡的處理能力、內(nèi)部程序算法以及帶寬大小決定。
3、資源使用率
3.1 CPU使用率,首先可以先了解CPU的基本信息,包括物理CPU的個數(shù)、單個CPU的核數(shù),然后可以通過命令查看使用率,vmstat、mpstat、top
3.2 內(nèi)存使用率,free -m、vmstat、top
3.3 磁盤I/O, iostat、 iotop、
3.4 網(wǎng)絡(luò)I/O,netstat、ifconfig、tcpstat、
三、性能測試注意的問題
1、我們在做性能測試的時候,系統(tǒng)的運(yùn)行會越來越快,后面的訪問速度比我們第一次訪問的速度快了好幾倍,這是因為Java語言編譯的順序是,.java文件先編譯為.class文件,然后通過解釋器將.class的字節(jié)碼轉(zhuǎn)換成本地機(jī)器碼后,才能運(yùn)行。為了節(jié)約內(nèi)存和執(zhí)行效率,代碼最初被執(zhí)行時,解釋器會率先解釋執(zhí)行這段代碼。隨著代碼被執(zhí)行的次數(shù)增多,虛擬機(jī)發(fā)現(xiàn)某個方法或代碼運(yùn)行的特別頻繁,就被認(rèn)定為熱點(diǎn)代碼(Hot Spot Code)。為了提高熱點(diǎn)代碼的執(zhí)行效率,在運(yùn)行時虛擬機(jī)將會通過即時編譯器(JIT)把這些代碼編譯成為本地平臺相關(guān)的機(jī)器碼,然后儲存在內(nèi)存中,之后每次運(yùn)行代碼時,直接從內(nèi)存中獲取。這樣就會導(dǎo)致第一次系統(tǒng)運(yùn)行慢,后面訪問的速度快幾倍。
2、在做性能測試的時候,每次測試處理的數(shù)據(jù)集都是一樣的,但是結(jié)果卻有差異,這是因為測試時,伴隨著很多不穩(wěn)定因素,比如機(jī)器其他進(jìn)程的影響、網(wǎng)絡(luò)波動以及每個階段JVM垃圾回收的不同等。我們可以通過多次測試,將測試結(jié)果求平均,只要保證平均值在合理范圍之內(nèi),并且波動不是很大,這種情況,性能測試就算通過。
四、定位性能問題的時候,可以使用自下而上的策略分析排查
當(dāng)我們進(jìn)行壓測之后,我們會輸出一份性能測試報告,其中包括,RT、TPS、TP99,被壓服務(wù)器的CPU、內(nèi)存、I/O,以及JVM的GC頻率。通過這些指標(biāo)可以發(fā)現(xiàn)性能瓶頸。我們可以采用自下而上的方式進(jìn)行分析。
1、首先從操作系統(tǒng)層面,查看系統(tǒng)的CPU、內(nèi)存、I/O、網(wǎng)絡(luò)的使用率是否異常,再通過命令查找異常日志,最后通過日志分析,找到導(dǎo)致瓶頸的問原因。
2、還可以從Java應(yīng)用的JVM層面,查看JVM的垃圾回收頻率以及內(nèi)存分配情況是否存在異常,分析垃圾回收日志,找到導(dǎo)致瓶頸的原因。
3、如果系統(tǒng)和JVM層面都沒有出現(xiàn)異常情況,然后可以從應(yīng)用服務(wù)業(yè)務(wù)層查看是否存在性能瓶頸,例如,Java編程問題,讀寫數(shù)據(jù)庫瓶頸等。
五、優(yōu)化性能問題的時候,可以使用自上而下的策略進(jìn)行優(yōu)化
整體的調(diào)優(yōu)順序,我們可以從業(yè)務(wù)調(diào)優(yōu)到編程調(diào)優(yōu),最后再到系統(tǒng)調(diào)優(yōu)
1、應(yīng)用層調(diào)優(yōu)
首先是優(yōu)化代碼,代碼問題往往會因為消耗系統(tǒng)資源而暴漏出來,例如代碼導(dǎo)致內(nèi)存溢出,使JVM內(nèi)存用完,而發(fā)生頻繁的FullGC,導(dǎo)致CPU偏高。
其次是優(yōu)化設(shè)計,主要是優(yōu)化業(yè)務(wù)層和中間件層代碼,例如可以采用代理模式,放在頻繁調(diào)用的創(chuàng)建對象的場景里,共享一個創(chuàng)建對象,減少創(chuàng)建對象的消耗。
再次是優(yōu)化算法,選擇合適的算法降低時間復(fù)雜度。
2、中間件調(diào)優(yōu)
MySQL調(diào)優(yōu)
1)、表結(jié)構(gòu)與索引優(yōu)化。
主要是對數(shù)據(jù)庫設(shè)計、表結(jié)構(gòu)設(shè)計以及索引設(shè)置維度進(jìn)行的優(yōu)化,設(shè)計表結(jié)構(gòu)的時候,考慮數(shù)據(jù)庫的水平與垂直的拓展能力,提前規(guī)劃好將來數(shù)據(jù)量、讀寫量的增長,規(guī)劃好分庫分表方案。對字段選擇合適的數(shù)據(jù)類型,優(yōu)先選用較小的數(shù)據(jù)結(jié)構(gòu)。
2)、SQL語句優(yōu)化。
主要是對SQL語句進(jìn)行的優(yōu)化,使用explain來查看執(zhí)行計劃,來查看是否使用了索引,使用了哪些索引。也可以使用Profile命令分析語句執(zhí)行過程中各個分步的耗時。
3)、MySQL參數(shù)優(yōu)化。
主要是對MySQL服務(wù)的配置進(jìn)行優(yōu)化,例如連接數(shù)的管理,對索引緩存、查詢緩存、排序緩存等各種緩存大小進(jìn)行優(yōu)化
4)、硬件及系統(tǒng)配置。
對硬件設(shè)備和操作系統(tǒng)設(shè)置進(jìn)行優(yōu)化,例如調(diào)整操作系統(tǒng)參數(shù)、禁用swap、增加內(nèi)存、升級固態(tài)硬盤。
3、系統(tǒng)調(diào)優(yōu)
首先是操作系統(tǒng)調(diào)優(yōu),Linux操作的內(nèi)核參數(shù)設(shè)置可以進(jìn)行調(diào)優(yōu),已達(dá)到提供高性能的目的。
其次,JVM調(diào)優(yōu),設(shè)置合理的JVM內(nèi)存空間,以及垃圾回收算法來提高性能,例如,如果業(yè)務(wù)邏輯會創(chuàng)建大對象,我們就可以設(shè)置,將大的對象直接放到老年代中,這樣可以減少年輕代頻發(fā)發(fā)生YongGC,減少CPU的占用時間。
4、調(diào)優(yōu)的策略
首先是時間換取空間,有的時候系統(tǒng)對查詢速度要求不高,對存儲空間要求較高,這個時候我們可以考慮用時間換取空間。
其次是空間換取時間,用存儲空間提升訪問速度,典型的就是MySQL的分庫分表策略,MySQL表單數(shù)據(jù)存儲千萬以上的時候,讀寫性能就會下降,這個時候我們可以將數(shù)據(jù)進(jìn)行拆分,以達(dá)到查詢的時候,每個表的數(shù)據(jù)是少量的,以達(dá)到提升性能的目的。
5、兜底策略
系統(tǒng)調(diào)優(yōu)后,仍然還會存在性能問題,這個時候我們需要有兜底策略, 首先是限流,對系統(tǒng)的入口設(shè)置最大訪問限制,同時采取斷熔措施,返回沒有成功的請求。 其次是橫向擴(kuò)容,當(dāng)訪問量超過某一個閾值時,系統(tǒng)可以自動橫向增加服務(wù)。
作者:京東健康 牛金亮文章來源:http://www.zghlxwxcb.cn/news/detail-459978.html
內(nèi)容來源:京東云開發(fā)者社區(qū)文章來源地址http://www.zghlxwxcb.cn/news/detail-459978.html
到了這里,關(guān)于性能測試監(jiān)控指標(biāo)及分析調(diào)優(yōu) | 京東云技術(shù)團(tuán)隊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!