近期在項(xiàng)目上遇到了多個(gè)系統(tǒng)性能問題播掷,都涉及到JVM調(diào)優(yōu),這里做個(gè)記錄揍异。
A項(xiàng)目:GC class unloading時(shí)間很長(zhǎng)
問題現(xiàn)象
非功能測(cè)試環(huán)境出現(xiàn)了壓測(cè)的機(jī)器GC日志里有:
[GC remark 2021-11-19T14:36:18.810......[Unloading, 8.2604164 secs]......]// 最長(zhǎng)的出現(xiàn)了33s多
網(wǎng)上查到跟這個(gè)很類似:記一次CMS unloading class 耗時(shí)長(zhǎng)調(diào)查
更詳細(xì)的原理可以參考:https://www.cnblogs.com/alchemystar/p/14861423.html
原因分析
查看了一下牍戚,系統(tǒng)內(nèi)存8G汽馋,起了幾個(gè)Java進(jìn)程不同,其中一個(gè)占了6G多拐云,程序運(yùn)行時(shí)系統(tǒng)內(nèi)存占用超過80%,此時(shí)用free或top可以查看到20G的swap使用量一般超過2G师抄,最多到5.5G,發(fā)生了大量的swap交換教硫,把一些不活躍的內(nèi)存塊交換到了磁盤叨吮。從而在下次GC掃描時(shí)又從磁盤交換回了內(nèi)存,導(dǎo)致了很長(zhǎng)時(shí)間的延遲瞬矩。(也可以用swapon -s查看具體在哪個(gè)盤上茶鉴。)
解決辦法
知道了原理,就很好解決:
1)如果內(nèi)存充足的情況下丧鸯,可以使用swapoff關(guān)閉掉swap蛤铜,需要有權(quán)限,且與運(yùn)維團(tuán)隊(duì)達(dá)成一致丛肢。
2)盡量不使用swap围肥,具體來說就是降低系統(tǒng)參數(shù)swappiness的值(默認(rèn)0-100)。此數(shù)值在Linux上默認(rèn)為60蜂怎,CentOS上默認(rèn)為30穆刻。可以降低到10或者1杠步,甚至是0氢伟,需要注意的是哪怕是0,也不會(huì)完全關(guān)閉掉swap幽歼,只會(huì)在內(nèi)存低水位時(shí)不使用swap朵锣,如果內(nèi)存到高水位(cat /proc/zoneinfo)比如到95%以上,還是會(huì)使用swap交換內(nèi)存到磁盤甸私。需要權(quán)限诚些,且與運(yùn)維達(dá)成一致。
$ cat /proc/sys/vm/swappiness30## 臨時(shí)性修改:$ sudo sysctl vm.swappiness=10## 永久性修改:## 在/etc/sysctl.conf 文件里添加如下參數(shù):vm.swappiness=10
Linux系統(tǒng)swap的介紹參考:swappiness參數(shù)的含義和設(shè)置 | 云上小悟
Swap的深度原理和控制行為參考:Linux SWAP 深度解讀 - 生活費(fèi) - 博客園
3)在無法和運(yùn)維團(tuán)隊(duì)達(dá)成一致的情況下皇型,可以控制內(nèi)存水位诬烹,就上面的case來說,直接控制xmx6g降低到xmx3g或者4g弃鸦,運(yùn)行一段時(shí)間绞吁,并未出現(xiàn)過長(zhǎng)時(shí)間的Unloading GC情況。
本文使用 文章同步助手 同步