1.身體檢查
做一次壓力測(cè)試,可以了解系統(tǒng)大致的性能
壓測(cè)建議:
- DB:壓測(cè)有寫(xiě)流量要先建影子表
- tair:壓測(cè)有寫(xiě)流量繞過(guò)tair寫(xiě)
- HSF:壓測(cè)流量繞過(guò)依賴(lài)應(yīng)用有寫(xiě)操作的HSF
2. 病因診斷
當(dāng)問(wèn)題復(fù)現(xiàn)的時(shí)候,就可以對(duì)系統(tǒng)開(kāi)始診斷了,對(duì)于一位醫(yī)生,如何分析身體檢查的結(jié)果數(shù)據(jù)是至關(guān)重要的热芹,這里推薦4個(gè)平臺(tái)
機(jī)器承載能力和系統(tǒng)異常結(jié)果:查看機(jī)器各項(xiàng)性能指標(biāo)情況
系統(tǒng)依賴(lài)和服務(wù)耗時(shí)結(jié)果:查看全鏈路的各個(gè)環(huán)節(jié)服務(wù)的調(diào)用情況
JVM堆內(nèi)存和線(xiàn)程詳情: 查看具體內(nèi)存和線(xiàn)程情況
數(shù)據(jù)庫(kù)和SQL問(wèn)題結(jié)果: 查看數(shù)據(jù)庫(kù)情況,是否存在慢sql
3. 對(duì)癥治療
優(yōu)化:在互聯(lián)網(wǎng)系統(tǒng)中,背景中描述的問(wèn)題可以當(dāng)成一個(gè)典型的秒殺場(chǎng)景來(lái)優(yōu)化解決沟涨,結(jié)合一些文章我將自己的思考整理為橫向優(yōu)化和縱向優(yōu)化,
縱向優(yōu)化
熱點(diǎn)隔離:禁止1%的請(qǐng)求影響99%的請(qǐng)求异吻,關(guān)鍵在于識(shí)別是那個(gè)環(huán)節(jié)是熱點(diǎn)
動(dòng)靜分離:靜態(tài)數(shù)據(jù)和動(dòng)態(tài)數(shù)據(jù)隔離
時(shí)間分片削峰:拉長(zhǎng)峰值裹赴,減輕系統(tǒng)壓力
依賴(lài)降級(jí):對(duì)于耗時(shí)長(zhǎng)的弱依賴(lài)做降級(jí)喜庞,對(duì)業(yè)務(wù)有影響這個(gè)需要加入開(kāi)關(guān)控制
橫向優(yōu)化
物理層:宿主機(jī)、數(shù)據(jù)庫(kù)棋返、緩存等
服務(wù)層:業(yè)務(wù)處理邏輯領(lǐng)域?qū)?br>
應(yīng)用層:客戶(hù)請(qǐng)求延都、頁(yè)面資源等
將橫縱結(jié)合可以實(shí)現(xiàn)多種優(yōu)化方案,這里舉例關(guān)于解決本文遇到的問(wèn)題而使用的優(yōu)化用策略:
物理層:
- 對(duì)耗時(shí)較長(zhǎng)的SQL查詢(xún)結(jié)果做緩存睛竣,減少數(shù)據(jù)庫(kù)查詢(xún)次數(shù)晰房,如:對(duì)活動(dòng)頁(yè)面查詢(xún)近半年所有活動(dòng)的結(jié)果放入緩存,緩存方案是本機(jī)緩存過(guò)期時(shí)間30秒射沟,這個(gè)功能對(duì)數(shù)據(jù)一致性會(huì)有30秒延遲殊者,所以需要加入開(kāi)關(guān)控制,日常情況下可以關(guān)閉緩存功能躏惋,在秒殺活動(dòng)時(shí)打開(kāi)緩存開(kāi)關(guān)—熱點(diǎn)隔離
- 對(duì)于慢SQL做索引優(yōu)化幽污,避免影響其他sql的查詢(xún),如:查詢(xún)每個(gè)人近半年參加的的活動(dòng)簿姨,對(duì)gmt_creat(活動(dòng)時(shí)間)加入索引距误,避免每次查詢(xún)數(shù)據(jù)庫(kù)掃描多余的數(shù)據(jù),縮短查詢(xún)耗時(shí)—熱點(diǎn)隔離
- 加大線(xiàn)程池扁位,數(shù)據(jù)庫(kù)線(xiàn)程池從10增大到20准潭,后續(xù)和DBA交流了解到數(shù)據(jù)庫(kù)線(xiàn)程池不能也不會(huì)加太大,因?yàn)橛锌赡軙?huì)拖垮其他的數(shù)據(jù)庫(kù)域仇,這里推薦DBA@志歉的Mysql原理介紹刑然,干貨滿(mǎn)滿(mǎn)。
- 單庫(kù)單表修改為分庫(kù)分表暇务,改造投入時(shí)間較長(zhǎng)先不考慮泼掠。
服務(wù)層:
- 對(duì)復(fù)雜的代碼查詢(xún)邏輯做拆分,將弱依賴(lài)查詢(xún)拆分垦细,同時(shí)對(duì)長(zhǎng)文本字段的DO對(duì)象查詢(xún)放到業(yè)務(wù)邏輯處理的最后執(zhí)行择镇,這樣從400個(gè)全量DO對(duì)象的長(zhǎng)文本堆存儲(chǔ)降為只查分頁(yè)中第一頁(yè)的5個(gè)DO對(duì)象,緩解堆空間的使用情況解決FullGc問(wèn)題括改。
- 對(duì)耗時(shí)較長(zhǎng)的弱依賴(lài)RPC服務(wù)添加降級(jí)處理開(kāi)關(guān)控制腻豌,這點(diǎn)會(huì)影響頁(yè)面?zhèn)€別邏輯展示,需要和業(yè)務(wù)方溝通—依賴(lài)降級(jí)嘱能。
- 活動(dòng)中心頁(yè)面接口是個(gè)通用型接口吝梅,有非”活動(dòng)中心頁(yè)面“的渠道請(qǐng)求該接口接口,請(qǐng)求中有復(fù)雜"活動(dòng)與用戶(hù)相關(guān)邏輯處理"也就是1078次數(shù)據(jù)庫(kù)查詢(xún)的原因惹骂,對(duì)特定渠道的查詢(xún)隔離避免活動(dòng)中心頁(yè)面請(qǐng)求也會(huì)有1078次數(shù)據(jù)庫(kù)查詢(xún)—熱點(diǎn)隔離苏携。
應(yīng)用層:
- 做限流控制,對(duì)影響活動(dòng)頁(yè)面的其他http頁(yè)請(qǐng)求—熱點(diǎn)隔離对粪、時(shí)間片削峰
- 頁(yè)面可以展示后兜叨,高峰流量可能會(huì)壓到點(diǎn)擊報(bào)名上穿扳,后續(xù)的考慮用點(diǎn)擊報(bào)名彈驗(yàn)證碼來(lái)應(yīng)對(duì)同一時(shí)間的高峰qps,但是后續(xù)壓測(cè)和ROI考慮暫時(shí)不需要:因?yàn)檫@個(gè)寫(xiě)是分庫(kù)整個(gè)鏈路耗時(shí)為34ms—時(shí)間片削峰国旷。
- 秒殺活動(dòng)單獨(dú)做活動(dòng)頁(yè)面承接,這樣就可以把一些靜態(tài)資源放到CDN上茫死,后端只返回動(dòng)態(tài)的數(shù)據(jù)跪但,但因?yàn)榍岸速Y源和投入時(shí)間問(wèn)題本次沒(méi)有開(kāi)發(fā)—?jiǎng)屿o分離
- 把底層邏輯改動(dòng)的對(duì)客戶(hù)的相關(guān)影響掛在頁(yè)面公告,防止增加用戶(hù)過(guò)量咨詢(xún)
4. 身體復(fù)檢
重新做一遍壓測(cè)峦萎,觀(guān)察性能問(wèn)題
- 優(yōu)化后壓力測(cè)試系統(tǒng)抗壓能力qps:20-> 1980屡久,性能提升80倍,同時(shí)支持水平擴(kuò)展爱榔。
- 接口流量高峰耗時(shí):從8567ms-> 45ms,
3.一次http服務(wù)從數(shù)據(jù)庫(kù)請(qǐng)求1078次減少到53次 - 慢sql已經(jīng)沒(méi)有被环。
5.優(yōu)化邏輯發(fā)布后系統(tǒng)Old區(qū)內(nèi)存空間從800Mb降低到100Mb左右,在qps峰值時(shí)未出現(xiàn)過(guò)一次FullGc