要解決的問題
- 系統(tǒng)要部署多少臺(tái)機(jī)器
- 每臺(tái)機(jī)器的內(nèi)存空間
- 每臺(tái)機(jī)器jvm堆內(nèi)存大小
- jvm內(nèi)存空間要多少,才能支撐這么多對(duì)象的創(chuàng)建 不至于進(jìn)程直接奔潰
內(nèi)存壓力計(jì)算
qps估算
日活用戶數(shù)量、高峰期時(shí)段多久、用戶行為涉及到的接口、接口中創(chuàng)建的對(duì)象大小
舉例:
(1) 假設(shè)用戶系統(tǒng)高峰期 1w+qps 時(shí), jvm內(nèi)存要在一秒內(nèi)能容納下這一萬多個(gè)用戶信息實(shí)例
(2) 每天100萬支付訂單的交易系統(tǒng),高峰期幾個(gè)小時(shí),平均到高峰期就是每秒100訂單左右,要能容納下這些訂單對(duì)象
處理耗時(shí)比較長的場(chǎng)景會(huì)比較復(fù)雜,進(jìn)行minor gc的時(shí)候會(huì)有 qps * n * timeout 多個(gè)對(duì)象還存活著(n為接口一次處理過程產(chǎn)生的對(duì)象個(gè)數(shù))計(jì)算每個(gè)對(duì)象的大小
處理流程耗時(shí)
然后計(jì)算出系統(tǒng)大概多久會(huì)進(jìn)行一次 minor gc(年輕代多久會(huì)塞滿)
對(duì)于高并發(fā)的系統(tǒng),如果請(qǐng)求耗時(shí)突然變成秒/十幾秒(或者有個(gè)別接口耗時(shí)久),就很容易進(jìn)入老年代: 系統(tǒng)并發(fā)較高 eden區(qū)很快就填滿,然后進(jìn)行 minor gc,慢接口引用的對(duì)象回收不掉,在多次minor gc后這些慢接口的對(duì)象就進(jìn)入到老年代了
實(shí)際場(chǎng)景
其實(shí)一般公司運(yùn)維提供的機(jī)器配置是固定的幾檔,如4核8G、8核16G 然后會(huì)有對(duì)應(yīng)的較為通用的jvm參數(shù)配置模板
而且線上服務(wù)情況錯(cuò)綜復(fù)雜、不會(huì)說一個(gè)時(shí)刻就只有一個(gè)鏈路在執(zhí)行,需要根據(jù)預(yù)期要抗的qps、目標(biāo)rt進(jìn)行壓測(cè),確定保證機(jī)器負(fù)載在健康水平下達(dá)到目標(biāo)需要多少臺(tái)機(jī)器,同時(shí)觀察gc情況,然后再具體根據(jù)minor gc stw、老年代增長速率、fullgc頻率和時(shí)長等進(jìn)行調(diào)整