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