? ? ? ? 性能壓測(cè)是當(dāng)服務(wù)上線前,或者之后重要需求發(fā)布流程中惩猫,需要做的必要測(cè)試芝硬;以模擬真實(shí)流量的方式,獲取當(dāng)前系統(tǒng)的性能指標(biāo)轧房、是否存著高并發(fā)隱患拌阴、瓶頸等信息的手段。
性能壓測(cè)處于什么位置奶镶?或者說什么時(shí)候去做呢迟赃?如何做陪拘?
如何做好線上環(huán)境的性能壓測(cè)、全鏈路壓測(cè)纤壁,如何做到壓測(cè)結(jié)果準(zhǔn)確無誤左刽,不影響外部環(huán)境、不污染數(shù)據(jù)酌媒,需要深入思考欠痴。
一、測(cè)試分類
按照上線流程:
? ??單元測(cè)試
? ??集成測(cè)試
? ??兼容性測(cè)試(前端秒咨、客戶端)
? ??性能測(cè)試
運(yùn)維階段:
????安全測(cè)試
????容災(zāi)測(cè)試(故障恢復(fù)測(cè)試)
由上可以看出斋否,性能測(cè)試是應(yīng)用服務(wù)在上線過程中的一個(gè)流程,除非是內(nèi)部系統(tǒng)拭荤,訪問量少茵臭,否則都應(yīng)當(dāng)做一下性能測(cè)試。
安全測(cè)試又叫滲透測(cè)試舅世,是運(yùn)維和研發(fā)需要關(guān)注的問題旦委;尤其是對(duì)數(shù)據(jù)安全要求高的系統(tǒng)。當(dāng)一個(gè)服務(wù)穩(wěn)定運(yùn)行后雏亚,模擬一些攻擊手段缨硝,防止SQL注入、網(wǎng)絡(luò)攻擊罢低、腳本攻擊等查辩。
容災(zāi)測(cè)試是容災(zāi)方式的驗(yàn)證,容災(zāi)方式包括:雙機(jī)房建設(shè)网持、異地多活宜岛、兩地三中心。
二功舀、壓測(cè)目的
????了解吞吐量
????瓶頸值
????系統(tǒng)隱患
可用:一次請(qǐng)求萍倡,到達(dá)服務(wù)器,有回應(yīng)辟汰;那么針對(duì)這次請(qǐng)求列敲,服務(wù)是可用的,無論返回成功或者失敗帖汞。
不可用是指請(qǐng)求沒有返回戴而,長(zhǎng)時(shí)間等待,沒有應(yīng)答翩蘸,客戶端不知道結(jié)果所意。
高可用級(jí)別:99%、99.9%、99.99%扁眯、99.999%
大家經(jīng)常說的系統(tǒng)可用性達(dá)到三個(gè)9壮莹,就是指99.9%。
高可靠:是指服務(wù)可靠姻檀,數(shù)據(jù)可靠命满。請(qǐng)求返回是成功,數(shù)據(jù)寫入正確绣版,分布式環(huán)境下數(shù)據(jù)一致性等胶台。
三、壓測(cè)指標(biāo)
四杂抽、實(shí)現(xiàn)流程
1. 壓測(cè)工具選型
? ?Jmeter +?Influxdb +?Grafana +?Collectd
2.壓測(cè)環(huán)境準(zhǔn)備
? ??服務(wù)環(huán)境
? ??壓測(cè)機(jī)
? ??數(shù)據(jù)庫
? ??Redis
? ??MQ
3.壓測(cè)數(shù)據(jù)準(zhǔn)備
? ??日活數(shù)據(jù):數(shù)據(jù)要真實(shí)诈唬、流量真實(shí),結(jié)果才能越接近線上真實(shí)性能指標(biāo)缩麸。
? ??數(shù)據(jù)隔離:防止污染真實(shí)用戶數(shù)據(jù)
? ??數(shù)據(jù)恢復(fù)
? ??熱點(diǎn)數(shù)據(jù)
? ??壓測(cè)預(yù)熱:盡量模擬線上真實(shí)環(huán)境情況铸磅,如緩存命中率
4.壓測(cè)開發(fā)設(shè)計(jì)
? ??擋板
? ??Mock數(shù)據(jù)
? ??流量識(shí)別
? ??壓測(cè)場(chǎng)景
? ??加壓策略
擋板:是用來攔截調(diào)用第三方的請(qǐng)求,防止壓測(cè)對(duì)第三方造成影響杭朱;提前設(shè)計(jì)好擋板邏輯阅仔,識(shí)別壓測(cè)流量,執(zhí)行擋板邏輯弧械,并且為了真實(shí)八酒,還可以合理延遲一定時(shí)間再返回Mock數(shù)據(jù)。
流量識(shí)別:nginx做負(fù)載均衡刃唐,upstream?轉(zhuǎn)發(fā)服務(wù)器ip 時(shí)羞迷,可以獲取http請(qǐng)求Header的參數(shù),我們可以給壓測(cè)流量header加標(biāo)記參數(shù)画饥,nginx獲取參數(shù)判斷后衔瓮,轉(zhuǎn)發(fā)壓測(cè)流量到壓測(cè)機(jī)器。
5.監(jiān)控
監(jiān)控很重要荒澡,可以說是壓測(cè)中最為重要的地方报辱,如果沒有監(jiān)控,或者監(jiān)控不準(zhǔn)確单山,會(huì)嚴(yán)重影響壓測(cè)本身準(zhǔn)確性。監(jiān)控?cái)?shù)據(jù)不詳細(xì)幅疼,也會(huì)影響性能調(diào)優(yōu)米奸。
一般我們需要監(jiān)控的如下:
? ??CPU、內(nèi)存
? ??IO:網(wǎng)絡(luò)爽篷、磁盤
? ??Http請(qǐng)求悴晰、接口方法
? ??JVM
? ??中間件
? ??數(shù)據(jù)庫負(fù)載
? ??帶寬占用
其中對(duì)接口和方法的監(jiān)控需要有,而且要準(zhǔn)確,是定位性能問題的有效手段铡溪,越細(xì)化越好漂辐。
以下是一些監(jiān)控工具:?
通過上圖可以直觀的看出JVM堆內(nèi)存的增長(zhǎng)情況和GC回收頻率哈扮、回收后內(nèi)存大小纬纪。如果回收后的內(nèi)存在持續(xù)增高,且當(dāng)前請(qǐng)求沒有增長(zhǎng)滑肉,說明有內(nèi)存泄露包各,具體什么對(duì)象泄漏,需要通過jmap等命令靶庙,查看堆內(nèi)存heap的詳情问畅。
對(duì)比GC前后的對(duì)象數(shù)量,分析是哪些沒有回收六荒。
五护姆、性能優(yōu)化
注意:
慎重優(yōu)化,謹(jǐn)記二八原則 和 Amdahl定律恬吕。
優(yōu)化一定要伴隨著壓測(cè)签则,通過性能指標(biāo)、數(shù)據(jù)對(duì)比來論證和調(diào)整铐料,否則沒有意義渐裂。
1.優(yōu)化目標(biāo)
? ? ? ?提升吞吐量
????????降低 RT
2.優(yōu)化方向
????????硬件層面:CPU、內(nèi)存擴(kuò)容钠惩、換SSD固態(tài)硬盤
????????軟件層面:集群擴(kuò)容柒凉、代碼優(yōu)化、存儲(chǔ)優(yōu)化(緩存篓跛、數(shù)據(jù)庫)膝捞、減少IO
3.優(yōu)化方式
????????代碼優(yōu)化:請(qǐng)求合并、異步愧沟、Cache蔬咬、池化
????????JVM調(diào)優(yōu)
????????Linux調(diào)優(yōu)
JVM調(diào)優(yōu)
1. 調(diào)優(yōu)關(guān)注點(diǎn)
????????減少JVM不可用時(shí)間:STW(Stop the word)
????????GC 頻率
????????安全點(diǎn)SafePoint
安全點(diǎn)是需要注意的問題,很多初學(xué)者會(huì)忽略安全點(diǎn)線程等待時(shí)間沐寺,其實(shí)STW時(shí)間包括安全點(diǎn)等待時(shí)間林艘。
2. 常用GC回收器
????ParNew + CMS ????(低延遲、低核混坞、小內(nèi)存場(chǎng)景)
????G1???????????????????????? (高吞吐量狐援、高核钢坦、大內(nèi)存)
G1只有在多核CPU,大內(nèi)存情況下,才能體現(xiàn)出它的優(yōu)勢(shì)啥酱,如果內(nèi)存過小爹凹,表現(xiàn)反而不如ParNew+CMS。
那么到底多大算大內(nèi)存呢镶殷?
根據(jù)R大給出的建議是:以堆內(nèi)存8g為限禾酱,大于8g用G1,小于8g用CMS批钠。
3. JVM參數(shù)分類
????-:標(biāo)準(zhǔn)參數(shù)宇植,所有JVM都必須實(shí)現(xiàn),且向后兼容埋心。
????-X :非標(biāo)準(zhǔn)參數(shù)指郁,默認(rèn)JVM實(shí)現(xiàn)該參數(shù),不保證向后兼容拷呆。
????-XX:非stable參數(shù)闲坎,不同JVM有所不同,將來可能會(huì)取消茬斧。
4. G1關(guān)鍵參數(shù)
????-Xms16g?? -Xmx16g???
????-XX:+UseG1GC??? -XX:MaxGCPauseMillis=50??? -XX:InitiatingHeapOccupancyPercent=60? ?
????-verbose:gc ???-Xloggc:logs/gc_%p.log??? -XX:+DisableExplicitGC
????-XX:-UseLargePages? -XX:+PrintGCApplicationStoppedTime? -XX:-OmitStackTraceInFastThrow?
????-XX:+PrintSafepointStatistics? -XX:PrintSafepointStatisticsCount=1
需要注意的是腰懂,G1最好不要加新生代大小參數(shù)?-Xmn ,如果固定了新生代大小项秉,G1就沒法根據(jù) -XX:MaxGCPauseMillis 設(shè)定的最大期望GC時(shí)間绣溜,動(dòng)態(tài)調(diào)整堆內(nèi)存的新生代和老年代大小,相當(dāng)于-XX:MaxGCPauseMillis 失效了娄蔼。除非你很熟悉G1原理怖喻,加了新生代大小,配合其他參數(shù)岁诉,也可以調(diào)優(yōu)出一個(gè)不錯(cuò)的結(jié)果锚沸。否則還是交給G1本身的自動(dòng)調(diào)整吧。
5. GC 日志
2020-01-09T11:05:34.836+0800: [GC pause (G1 Evacuation Pause) (young) ……
[Eden: 8576.0M(8576.0M)->0.0B(8576.0M) Survivors: 16.0M->16.0M Heap: 8643.7M(14.0G)->68.2M(14.0G)]
[Times: user=0.05 sys=0.04, real=0.02 secs]
2020-01-09T11:05:34.863+0800: 2043140.818: Total time for which application threads were stopped:0.0286394 seconds, Stopping threads took: 0.0002674 seconds
2020-01-09T12:01:10.488+0800: 2046476.443: Application time: 3335.6250688 seconds
2020-01-09T12:01:10.490+0800: 2046476.444: [GC pause (G1 Evacuation Pause) (young) 2046476.444:
gc日志中 Stopping threads took 就是安全點(diǎn)時(shí)涕癣,線程的等待時(shí)間哗蜈,所以STW時(shí)間應(yīng)該是:GC時(shí)間 + 安全點(diǎn)等待時(shí)間。
如果 Stopping threads took 較大坠韩,說明代碼程序是有問題的距潘,需要深入查看;
具體什么情況會(huì)導(dǎo)致安全點(diǎn)時(shí)間過長(zhǎng)只搁,請(qǐng)參考:
HBase實(shí)戰(zhàn):記一次Safepoint導(dǎo)致長(zhǎng)時(shí)間STW的踩坑之旅
Linux調(diào)優(yōu)
我在對(duì)業(yè)務(wù)項(xiàng)目绽昼、RocketMQ、Redis须蜗、codis集群、Elasticsearch、Hbase等進(jìn)行優(yōu)化過程中明肮,經(jīng)常遇到一些相同的問題菱农,我總結(jié)了下,主要有以下:
慎用交換區(qū)swap
? ? ? ? 優(yōu)化方式:禁止swapping 或者設(shè)置?swappiness = 1
? ? ? ? swapping會(huì)導(dǎo)致gc過程從毫秒級(jí)變成分鐘級(jí)
善用 /dev/shm/
? ? ? ?/dev/shm/ 是linux的文件內(nèi)存系統(tǒng)柿估,是共享內(nèi)存循未,直接從物理內(nèi)存中開辟,根據(jù)使用情況會(huì)動(dòng)態(tài)擴(kuò)容秫舌。
針對(duì)一些寫入文件的妖,IO性能要求高的場(chǎng)景,可以使用/dev/shm/足陨,例如gc日志存放嫂粟。
高并發(fā)場(chǎng)景下,如果打開安全點(diǎn)日志墨缘,安全點(diǎn)日志是在安全點(diǎn)內(nèi)打印星虹,是同步的,所以日志寫入文件速度镊讼,會(huì)嚴(yán)重影響gc快慢宽涌;應(yīng)當(dāng)將gc日志配置改為:
-Xloggc:/dev/shm/gc_%p.log
其他linux調(diào)優(yōu),一般大點(diǎn)的公司蝶棋,都會(huì)有自己的運(yùn)維團(tuán)隊(duì)卸亮,運(yùn)維就會(huì)做基本的優(yōu)化,例如tcp連接優(yōu)化等玩裙,這里只介紹運(yùn)維可能忽略的兼贸,不知道的點(diǎn),這時(shí)候就需要研發(fā)同學(xué)介入献酗,找運(yùn)維做好應(yīng)用相關(guān)的Linux內(nèi)核優(yōu)化寝受。