幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

一次JVMGC长暂停的排查过程

  作者:京东科技徐传乐背景
  在高并发下,Java程序的GC问题属于很典型的一类问题,带来的影响往往会被进一步放大。不管是GC频率过快还是GC耗时太长,由于GC期间都存在StopTheWorld问题,因此很容易导致服务超时,引发性能问题。
  事情最初是线上某应用垃圾收集出现FullGC异常的现象,应用中个别实例FullGC时间特别长,持续时间约为1530秒,平均每2周左右触发一次;
  JVM参数配置Xms2048MXmx2048MXmn1024MXX:MaxPermSize512M
  排查过程
  分析GC日志
  GC日志它记录了每一次的GC的执行时间和执行结果,通过分析GC日志可以调优堆设置和GC设置,或者改进应用程序的对象分配模式。
  这里FullGC的reason是Ergonomics,是因为开启了UseAdaptiveSizePolicy,jvm自己进行自适应调整引发的FullGC。
  这份日志主要体现GC前后的变化,目前为止看不出个所以然来。
  开启GC日志,需要添加如下JVM启动参数:
  XX:PrintGCDetailsXX:PrintGCDateStampsXloggc:exportlogriskpillargc。log
  常见的YoungGC、FullGC日志含义如下:
  进一步查看服务器性能指标
  获取到了GC耗时的时间后,通过监控平台获取到各个监控项,开始排查这个时点有异常的指标,最终分析发现,在5。06分左右(GC的时点),CPU占用显著提升,而SWAP出现了释放资源、memory资源增长出现拐点的情况(详见下图红色框,橙色框中的变化是因修改配置导致,后面会介绍,暂且可忽略)
  JVM用到了swap?是因为GC导致的CPU突然飙升,并且释放了swap交换区这部分内存到memory?
  为了验证JVM是否用到swap,我们通过检查proc下的进程内存资源占用情况
  foriin(cdproc;lsgrep〔09〕awk0100);doawkSwap:{aa2}END{printi,a1024M}procismaps2devnull;donesortk2nrhead10head10表示取出前10个内存占用高的进程取出的第一列为进程的id第二列进程占用swap大小
  看到确实有用到305MB的swap
  这里简单介绍下什么是swap?
  swap指的是一个交换分区或文件,主要是在内存使用存在压力时,触发内存回收,这时可能会将部分内存的数据交换到swap空间,以便让系统不会因为内存不够用而导致oom或者更致命的情况出现。
  当某进程向OS请求内存发现不足时,OS会把内存中暂时不用的数据交换出去,放在swap分区中,这个过程称为swapout。
  当某进程又需要这些数据且OS发现还有空闲物理内存时,又会把swap分区中的数据交换回物理内存中,这个过程称为swapin。
  为了验证GC耗时与swap操作有必然关系,我抽查了十几台机器,重点关注耗时长的GC日志,通过时间点确认到GC耗时的时间点与swap操作的时间点确实是一致的。
  进一步查看虚拟机各实例swappiness参数,一个普遍现象是,凡是发生较长FullGC的实例都配置了参数vm。swappiness30(值越大表示越倾向于使用swap);而GC时间相对正常的实例配置参数vm。swappiness0(最大限度地降低使用swap)。
  swappiness可以设置为0到100之间的值,它是Linux的一个内核参数,控制系统在进行swap时,内存使用的相对权重。
  swappiness0:表示最大限度使用物理内存,然后才是swap空间
  swappiness100:表示积极的使用swap分区,并且把内存上的数据及时的交换到swap空间里面
  对应的物理内存使用率和swap使用情况如下
  至此,矛头似乎都指向了swap。
  问题分析
  当内存使用率达到水位线(vm。swappiness)时,linux会把一部分暂时不使用的内存数据放到磁盘swap去,以便腾出更多可用内存空间;
  当需要使用位于swap区的数据时,再将其换回内存中,当JVM进行GC时,需要对相应堆分区的已用内存进行遍历;
  假如GC的时候,有堆的一部分内容被交换到swap空间中,遍历到这部分的时候就需要将其交换回内存,由于需要访问磁盘,所以相比物理内存,它的速度肯定慢的令人发指,GC停顿的时间一定会非常非常恐怖;
  进而导致Linux对swap分区的回收滞后(内存到磁盘换入换出操作十分占用CPU与系统IO),在高并发QPS服务中,这种滞后带来的结果是致命的(STW)。
  问题解决
  至此,答案似乎很清晰,我们只需尝试把swap关闭或释放掉,看看能否解决问题?
  如何释放swap?
  1。设置vm。swappiness0(重启应用释放swap后生效),表示尽可能不使用交换内存
  a、临时设置方案,重启后不生效
  设置vm。swappiness为0
  sysctlvm。swappiness0
  查看swappiness值
  catprocsysvmswappiness
  b、永久设置方案,重启后仍然生效
  vietcsysctl。conf
  添加
  vm。swappiness0
  2。关闭交换分区swapoffa
  前提:首先要保证内存剩余要大于等于swap使用量,否则会报Cannotallocatememory!swap分区一旦释放,所有存放在swap分区的文件都会转存到物理内存上,可能会引发系统IO或者其他问题。
  a、查看当前swap分区挂载在哪?
  b、关停分区
  关闭swap交换区后的内存变化见下图橙色框,此时swap分区的文件都转存到了物理内存上
  关闭Swap交换区后,于2。23再次发生FullGC,耗时190ms,问题得到解决。
  疑惑
  1、是不是只要开启了swap交换区的JVM,在GC的时候都会耗时较长呢?
  2、既然JVM对swap如此不待见,为何JVM不明令禁止使用呢?
  3、swap工作机制是怎样的?这台物理内存为8g的server,使用了交换区内存(swap),说明物理内存不够使用了,但是通过free命令查看内存使用情况,实际物理内存似乎并没有占用那么多,反而Swap已占近1G?
  free:除了buffcache剩余了多少内存
  shared:共享内存
  buffcache:缓冲、缓存区内存数(使用过高通常是程序频繁存取文件)
  available:真实剩余的可用内存数
  大家可以想想,关闭交换磁盘缓存意味着什么?
  其实大可不必如此激进,要知道这个世界永远不是非0即1的,大家都会或多或少选择走在中间,不过有些偏向0,有些偏向1而已。
  很显然,在swap这个问题上,JVM可以选择偏向尽量少用,从而降低swap影响,要降低swap影响有必要弄清楚Linux内存回收是怎么工作的,这样才能不遗漏任何可能的疑点。
  先来看看swap是如何触发的?
  Linux会在两种场景下触发内存回收,一种是在内存分配时发现没有足够空闲内存时会立刻触发内存回收;另一种是开启了一个守护进程(kswapd进程)周期性对系统内存进行检查,在可用内存降低到特定阈值之后主动触发内存回收。
  通过如下图示可以很容易理解,详细信息参见:http:hbasefly。com20170524hbaselinux
  解答是不是只要开启了swap交换区的JVM,在GC的时候都会耗时较长
  笔者去查了一下另外的一个应用,相关指标信息请见下图。
  实名服务的QPS是非常高的,同样能看到应用了swap,GC平均耗时576ms,这是为什么呢?
  通过把时间范围聚焦到发生GC的某一时间段,从监控指标图可以看到swapUsed没有任何变化,也就是说没有swap活动,进而没有影响到垃级回收的总耗时。
  通过如下命令列举出各进程swap空间占用情况,很清楚的看到实名这个服务swap空间占用的较少(仅54。2MB)
  另一个显著的现象是实名服务FullGC间隔较短(几个小时一次),而我的服务平均间隔2周一次FullGC
  基于以上推测
  1、实名服务由于GC间隔较短,内存中的东西根本没有机会置换到swap中就被回收了,GC的时候不需要将swap分区中的数据交换回物理内存中,完全基于内存计算,所以要快很多
  2、将哪些内存数据置换进swap交换区的筛选策略应该是类似于LRU算法(最近最少使用原则)
  为了证实上述猜测,我们只需跟踪swap变更日志,监控数据变化即可得到答案,这里采用一段shell脚本实现!binbashechoedateymdHMSechoePIDSwapProcName拿出proc目录下所有以数字为名的目录(进程名是数字才是进程,其他如sys,net等存放的是其他信息)forpidinlslprocgrepdawk{print9}grepv〔09〕doif〔pideq1〕;thencontinue;figrepqSwapprocpidsmaps2devnullif〔?eq0〕;thenswap(gawkSwap{sum2;}END{printsum}procpidsmaps)统计占用的swap分区的大小单位是KBprocname(psauxgrepwpidawk!grep{for(i11;iNF;i){printf(s,i);}})取出进程的名字if〔swapgt0〕;then判断是否占用swap只有占用才会输出echoe{pid}{swap}{procname:0:100}fifidonesortk2nrhead10gawkF{排序取前10pid〔NR〕1;size〔NR〕2;name〔NR〕3;}END{for(id1;idlength(pid);id){if(size〔id〕1024)printf(10s15sKBs,pid〔id〕,size〔id〕,name〔id〕);elseif(size〔id〕1048576)printf(10s15。2fMBs,pid〔id〕,size〔id〕1024,name〔id〕);elseprintf(10s15。2fGBs,pid〔id〕,size〔id〕1048576,name〔id〕);}}
  由于上面图中2022。3。219:57:00至2022。3。219:58:00发生了一次FullGC,我们重点关注下这一分钟内swap交换区的变化即可,我这里每10s做一次信息采集,可以看到在GC时点前后,swap确实没有变化
  通过上述分析,回归本文核心问题上,现在看来我的处理方式过于激进了,其实也可以不用关闭swap,通过适当降低堆大小,也是能够解决问题的。
  这也侧面的说明,部署Java服务的Linux系统,在内存分配上并不是无脑大而全,需要综合考虑不同场景下JVM对Java永久代、Java堆(新生代和老年代)、线程栈、JavaNIO所使用内存的需求。
  总结
  综上,我们得出结论,swap和GC同一时候发生会导致GC时间非常长,JVM严重卡顿,极端的情况下会导致服务崩溃。
  主要原因是:JVM进行GC时,需要对对应堆分区的已用内存进行遍历,假如GC的时候,有堆的一部分内容被交换到swap中,遍历到这部分的时候就须要将其交换回内存;更极端情况同一时刻因为内存空间不足,就需要把内存中堆的另外一部分换到SWAP中去,于是在遍历堆分区的过程中,会把整个堆分区轮流往SWAP写一遍,导致GC时间超长。线上应该限制swap区的大小,如果swap占用比例较高应该进行排查和解决,适当的时候可以通过降低堆大小,或者添加物理内存。
  因此,部署Java服务的Linux系统,在内存分配上要慎重。
  以上内容希望可以起到抛转引玉的作用,如有理解不到位的地方烦请指出。

走过茫茫戈壁,都是姐妹兄弟戈壁你也可以来战!备受职场精英们关注的十一届玄奘之路商学院戈壁挑战赛即将于5月20日mdash;26日正式开赛,挑战赛将秉承ldquo;理想、行动、坚持rdquo;的理念,带来又一次徒步穿越无人……住酒店时哪些东西千万别碰?不要被吓到哦(图)现在很多人都会在外出旅行或者是外出办公的时候选择住酒店,很多人可能会说选择连锁酒店干净卫生安全有保障,但是实际情况真的是这样吗?在住酒店的时候我们需要注意哪些问题呢?关于个人隐……国庆出境旅游推荐让你放肆玩临近中秋国庆假期,对于准备好调休放长假的白领们而言,想要选择出境长线的游客不妨考虑选择这些国度。阿联酋特色:ldquo;沙漠之花rdquo;体验极致奢华阿联酋……美国宇航局担心SpaceX的星际飞船可能会破坏其标志性的发射星舰SN8在火球中爆炸SpaceX近期刚刚获得美国联邦航空管理局的许可,可以将其完全可重复使用的星际飞船火箭从德克萨斯州发射到轨道上,但另一个监管障碍可能会阻止它实现首席……梦露离世后细节金发被剃光,脸上布满斑点,身体填充塑料下葬【前言】1962年8月5日凌晨,美国加利福尼亚州的一处公寓里,聚集了许多身份各异的人。他们中有私人医生,管家,甚至还有警察。能让他们同时出现的原因,就是此时躺在床上……上了年纪还是随性一点,鞋子怎么舒适怎么穿高跟鞋好看但我更喜欢穿平跟的。高跟鞋火辣漂亮,但逛一圈商场下来,脚好痛。一般来说只要穿着高跟鞋,逛商场是很舒服的。但高跟鞋实在太磨人的脚了,如果不小心崴到脚那就更痛……全球十大疯狂购物天堂(图)一个购物天堂可能不会像历史上著名的集市(比如伊斯坦布尔的大集市)或是像有显赫的标志性建筑的购物街(比如香榭丽大街)出名,但是它绝对会以特色建筑风格或服务吸全世界的游客。近日,我……秋浓情更浓享受最美乡村婺源之韵秋天是婺源最淡定的季节。天空的颜色变得纯净而透明,阳光里有了轻盈的味道。金黄的水稻连绵着青山与粉黛般的村落相依在蓝天白云下,如水彩画般明艳动人。脚步一踏入婺源的山里,你就……意大利旅游攻略让你尽情畅游意大利意大利,有太多美妙的地方值得细细品味:文艺复兴的发源地,当代欧洲文明的精神故乡,世界文化遗产最多的地方。。。意大利男人的帅气从来都蜚声世界。然而意大利毕竟在太遥远的远方,有着完……在日本开车,是一种怎样的体验?和很多国家一样,日本的城市中交通堵塞也很严重。但当你开到日本的乡村和山间的时候,可是非常愉悦的体验。左侧行车的国度在日本,车行左边,司机坐在右手边。大部分的日本公路是免费……巴厘岛旅游攻略时差巴厘岛处于东8区,与中国无时差。但印尼首都雅加达比北京时间慢一小时,游客如果在雅加达转机要注意调整时间。气候巴厘岛气候属于热带海岛型气候,气候常年炎热,全……走到世界的尽头乌斯怀亚(图)我能想到的最浪漫的事,就是牵着你的手,一起走到世界的尽头。这个ldquo;世界的尽头rdquo;,就是阿根廷乌斯怀亚,有人类居住的最南端的城市,出了乌斯怀亚港口1000海里,就……
头晕反复,小心是癫痫在作祟9岁的女孩悦悦(化名)活泼,健康,从小连感冒都很少发生。但是,今年悦悦的身体却突然出现了问题。开始她经常头晕,有时在家里写着作业,就感到天旋地转,站都站不住。开始悦悦家长以为只……北向资金连续五日净买入,昨日净买入近59亿元,增持食品饮料812月5日,三大指数涨跌不一,沪指涨1。76,深成指涨0。92,创业板指跌0。26。据21投资通智能监测,北向资金已连续五日净买入,昨日净买入58。93亿元,其中沪股通净……曾经有那么两年时间,我们既不用担心感染又可以随时出行有些东西真的有流量,比如打脸类的,但是我累了,我没有什么任务,头条的流量我能有一点流量钱,但是真不多。我是信奉这个世界是唯物的。唯物的意思就是现实发生的,比任何猜想……10种常见梨的区别和口感!哪种最适合熬水喝?详细解答,建议收梨是生活中比较常见的一种的水果。不仅脆甜、多汁,而且营养也是十分的丰富。富含膳食纤维、维生素、胡萝卜素等等营养成分。梨的性味归经是甘、酸、性凉,具有生津、润肺、清热解毒之……数聚生慧以智促治深圳龙岗走出智慧化升级新路来源:【人民网】人工智能作为引领新一轮科技革命和产业变革的战略性技术,为城市高质量发展赋能,帮助城市迈向智能化。广东省深圳市龙岗区围绕数字先锋,智慧龙岗建设目标,基……这个冬季时装搭配知性与摩登邂逅感知摩登舒适的质简美学,ClubMonaco2022冬日系列与你温暖邂逅针织演绎轻松自如的格调,以简练风格阐述质简的时装语言。层次针织与别致纹理,谱写冬日浪漫旋律。……适合年末发圈的文案短句来源:覔文案(ID:Miwenan2022)作者:蛋卷(覔文案主笔)风已经有了冬天的味道,这一年又接近了尾声。年年岁岁终有一别,每到年末都会有一些对过去的怅惘……凭什么?崩盘的赛博朋克2077销量居然还能破2000万?冬日生活打卡季近日,CDRP宣布《赛博朋克2077》总销量超过2000万套。CRRD表示了对各位冤种玩家鼎力支持的感谢,并且也表示新的DLC《往日之影》正在全力开发……是选一加Ace,还是一加AcePro?5个维度分析对比告诉你是选一加Ace,还是一加AcePro?,经常有朋友有这样的疑问,从产品定位来看,一加AcePro是一加Ace的升级版,定位会更高一些,而且这两款手机的售价相差800元,性价比都……探索3年,小米13给出高端新答卷,涨价趋势不可逆从今年双十一的高端旗舰排行榜来看,苹果依旧牢牢占据了绝对的优势。但是今年的iPhone14系列也打破了一个历史记录,那就是降幅最快的iPhone。仅仅是一个月的时间左右,iPh……迎新春各地喜庆氛围越来越浓假日市场人气旺央视网消息:新年来临,各地的喜庆氛围越来越浓,假日市场也是供应丰富。迎新年河南山西花卉市场人气旺在河南新乡、山西太原的花卉市场,各色鲜花争奇斗艳,各类绿植生机盎然,……深耕UPS近卅年,科士达数据中心业务稳健,新能源ampamp(报告出品方分析师:华福证券邓伟)1数据中心为基本盘可攻可守,新能源打造第二增长曲线1。1深耕UPS近卅年,全球UPS市场的领先者源于福建宁德霞浦,壮大于深圳,深耕……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网