范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

一次JVMGC长暂停的排查过程

  作者:京东科技 徐传乐背景
  在高并发下,Java程序的GC问题属于很典型的一类问题,带来的影响往往会被进一步放大。不管是「GC频率过快」还是「GC耗时太长」,由于GC期间都存在Stop The World问题,因此很容易导致服务超时,引发性能问题。
  事情最初是线上某应用垃圾收集出现Full GC异常的现象,应用中个别实例Full GC时间特别长,持续时间约为 15~30秒, 平均每2周左右触发一次;
  JVM参数配置"-Xms2048M –Xmx2048M –Xmn1024M –XX:MaxPermSize=512M"
  排查过程
  Ø  分析GC 日志
  GC 日志它记录了每一次的 GC 的执行时间和执行结果,通过分析 GC 日志可以调优堆设置和 GC 设置,或者改进应用程序的对象分配模式。
  这里Full GC的reason是Ergonomics,是因为开启了UseAdaptiveSizePolicy,jvm自己进行自适应调整引发的Full GC。
  这份日志主要体现GC前后的变化,目前为止看不出个所以然来。
  开启GC日志,需要添加如下 JVM 启动参数:
  -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/export/log/risk_pillar/gc.log
  常见的 Young GC、Full GC 日志含义如下:
  Ø  进一步查看服务器性能指标
  获取到了GC耗时的时间后,通过监控平台获取到各个监控项,开始排查这个时点有异常的指标,最终分析发现,在5.06分左右(GC的时点),CPU占用显著提升,而SWAP出现了释放资源、memory资源增长出现拐点的情况(详见下图红色框,橙色框中的变化是因修改配置导致,后面会介绍,暂且可忽略)
  JVM用到了 swap ?是因为GC导致的CPU突然飙升,并且释放了swap交换区这部分内存到memory?
  为了验证JVM是否用到swap,我们通过检查proc下的进程内存资源占用情况
  for i in $( cd /proc;ls |grep "^[0-9]"|awk " $0 >100") ;do awk "/Swap:/{a=a+$2}END{print ""$i"",a/1024"M"}" /proc/$i/smaps 2>/dev/null ; done | sort -k2nr | head -10 # head -10 表示 取出 前10个内存占用高的进程 # 取出的第一列为进程的id 第二列进程占用swap大小
  看到确实有用到305MB的swap
  这里简单介绍下什么是 swap ?
  swap指的是一个交换分区或文件,主要是在内存使用存在压力时,触发内存回收,这时可能会将部分内存的数据交换到swap空间,以便让系统不会因为内存不够用而导致oom或者更致命的情况出现。
  当某进程向OS请求内存发现不足时,OS会把内存中暂时不用的数据交换出去,放在swap分区中,这个过程称为swap out。
  当某进程又需要这些数据且OS发现还有空闲物理内存时,又会把swap分区中的数据交换回物理内存中,这个过程称为swap in。
  为了验证GC耗时与swap操作有必然关系,我抽查了十几台机器,重点关注耗时长的GC日志,通过时间点确认到GC耗时的时间点与swap操作的时间点确实是一致的。
  进一步查看虚拟机各实例 swappiness 参数,一个普遍现象是,凡是发生较长Full GC的实例都配置了参数 vm.swappiness = 30(值越大表示越倾向于使用swap);而GC时间相对正常的实例配置参数 vm.swappiness = 0(最大限度地降低使用swap)。
  swappiness 可以设置为 0 到 100 之间的值,它是Linux的一个内核参数,控制系统在进 行swap时,内存使用的相对权重。
  Ø swappiness=0: 表示最大限度使用物理内存,然后才是 swap空间
  Ø swappiness=100: 表示积极的使用swap分区,并且把内存上的数据及时的交换到swap空间里面
  对应的物理内存使用率和swap使用情况如下
  至此,矛头似乎都指向了swap。
  Ø  问题分析
  当内存使用率达到水位线(vm.swappiness)时,linux会把一部分暂时不使用的内存数据放到磁盘swap去,以便腾出更多可用内存空间;
  当需要使用位于swap区的数据时,再将其换回内存中,当JVM进行GC时,需要对相应堆分区的已用内存进行遍历;
  假如GC的时候,有堆的一部分内容被交换到swap空间中,遍历到这部分的时候就需要将其交换回内存,由于需要访问磁盘,所以相比物理内存,它的速度肯定慢的令人发指,GC停顿的时间一定会非常非常恐怖;
  进而导致Linux对swap分区的回收滞后(内存到磁盘换入换出操作十分占用CPU与系统IO),在高并发/QPS服务中,这种滞后带来的结果是致命的(STW)。
  Ø  问题解决
  至此,答案似乎很清晰,我们只需尝试把swap关闭或释放掉,看看能否解决问题?
  如何释放swap?
  1. 设置vm.swappiness=0(重启应用释放swap后生效),表示尽可能不使用交换内存
  a、 临时设置方案,重启后不生效
  # 设置vm.swappiness为0
  sysctl vm.swappiness=0
  # 查看swappiness值
  cat /proc/sys/vm/swappiness
  b、 永久设置方案,重启后仍然生效
  vi /etc/sysctl.conf
  # 添加
  vm.swappiness=0
  2. 关闭交换分区swapoff –a
  前提:首先要保证内存剩余要大于等于swap使用量,否则会报Cannot allocate memory!swap分区一旦释放,所有存放在swap分区的文件都会转存到物理内存上,可能会引发系统IO或者其他问题。
  a、 查看当前swap分区挂载在哪?
  b、 关停分区
  关闭swap交换区后的内存变化见下图橙色框,此时swap分区的文件都转存到了物理内存上
  关闭Swap交换区后,于2.23再次发生Full GC,耗时190ms,问题得到解决。
  Ø  疑惑
  1、 是不是只要开启了swap交换区的JVM,在GC的时候都会耗时较长呢?
  2、 既然JVM对swap如此不待见,为何JVM不明令禁止使用呢?
  3、 swap工作机制是怎样的?这台物理内存为8g的server,使用了交换区内存(swap),说明物理内存不够使用了,但是通过free命令查看内存使用情况,实际物理内存似乎并没有占用那么多,反而Swap已占近1G?
  free:除了buff/cache剩余了多少内存
  shared:共享内存
  buff/cache:缓冲、缓存区内存数(使用过高通常是程序频繁存取文件)
  available:真实剩余的可用内存数
  大家可以想想,关闭交换磁盘缓存意味着什么?
  其实大可不必如此激进,要知道这个世界永远不是非0即1的,大家都会或多或少选择走在中间,不过有些偏向0,有些偏向1而已。
  很显然,在swap这个问题上,JVM可以选择偏向尽量少用,从而降低swap影响,要降低swap影响有必要弄清楚Linux内存回收是怎么工作的,这样才能不遗漏任何可能的疑点。
  先来看看swap是如何触发的?
  Linux会在两种场景下触发内存回收,一种是在内存分配时发现没有足够空闲内存时会立刻触发内存回收;另一种是开启了一个守护进程(kswapd进程)周期性对系统内存进行检查,在可用内存降低到特定阈值之后主动触发内存回收。
  通过如下图示可以很容易理解,详细信息参见:http://hbasefly.com/2017/05/24/hbase-linux/
  解答是不是只要开启了swap交换区的JVM,在GC的时候都会耗时较长
  笔者去查了一下另外的一个应用,相关指标信息请见下图。
  实名服务的QPS是非常高的,同样能看到应用了swap,GC平均耗时 576ms,这是为什么呢?
  通过把时间范围聚焦到发生GC的某一时间段,从监控指标图可以看到swapUsed没有任何变化,也就是说没有swap活动,进而没有影响到垃级回收的总耗时。
  通过如下命令列举出各进程swap空间占用情况,很清楚的看到实名这个服务swap空间占用的较少(仅54.2MB)
  另一个显著的现象是实名服务Full GC间隔较短(几个小时一次),而我的服务平均间隔2周一次Full GC
  基于以上推测
  1、 实名服务由于 GC 间隔较短,内存中的东西根本没有机会置换到swap中就被回收了,GC的时候不需要将swap分区中的数据交换回物理内存中,完全基于内存计算,所以要快很多
  2、 将哪些内存数据置换进swap交换区的筛选策略应该是类似于LRU算法(最近最少使用原则)
  为了证实上述猜测,我们只需跟踪swap变更日志,监控数据变化即可得到答案,这里采用一段shell 脚本实现 #!/bin/bash  echo -e `date +%y%m%d%H%M%S`  echo -e "PID		Swap		Proc_Name"   #拿出/proc目录下所有以数字为名的目录(进程名是数字才是进程,其他如sys,net等存放的是其他信息)  for pid in `ls -l /proc | grep ^d | awk "{ print $9 }"| grep -v [^0-9]`  do      if [ $pid -eq 1 ];then continue;fi      grep -q "Swap" /proc/$pid/smaps 2>/dev/null      if [ $? -eq 0 ];then          swap=$(gawk "/Swap/{ sum+=$2;} END{ print sum }" /proc/$pid/smaps) #统计占用的swap分区的 大小 单位是KB          proc_name=$(ps aux | grep -w "$pid" | awk "!/grep/{ for(i=11;i<=NF;i++){ printf("%s ",$i); }}") #取出进程的名字          if [ $swap -gt 0 ];then #判断是否占用swap 只有占用才会输出              echo -e "${pid}	${swap}	${proc_name:0:100}"      fi     fi done | sort -k2nr | head -10 | gawk -F"	" "{ #排序取前 10      pid[NR]=$1;      size[NR]=$2;      name[NR]=$3;  }  END{      for(id=1;id<=length(pid);id++)      {      if(size[id]<1024)          printf("%-10s	%15sKB	%s ",pid[id],size[id],name[id]);      else if(size[id]<1048576)          printf("%-10s	%15.2fMB	%s ",pid[id],size[id]/1024,name[id]);     else      printf("%-10s	%15.2fGB	%s ",pid[id],size[id]/1048576,name[id]);      }  }"
  由于上面图中 2022.3.2 19:57:00 至 2022.3.2 19:58:00 发生了一次Full GC,我们重点关注下这一分钟内swap交换区的变化即可,我这里每10s做一次信息采集,可以看到在GC时点前后,swap确实没有变化
  通过上述分析,回归本文核心问题上,现在看来我的处理方式过于激进了,其实也可以不用关闭swap,通过适当降低堆大小,也是能够解决问题的。
  这也侧面的说明,部署Java服务的Linux系统,在内存分配上并不是无脑大而全,需要综合考虑不同场景下JVM对Java永久代 、Java堆(新生代和老年代)、线程栈、Java NIO所使用内存的需求。
  总结
  综上,我们得出结论,swap和GC同一时候发生会导致GC时间非常长,JVM严重卡顿,极端的情况下会导致服务崩溃。
  主要原因是:JVM进行GC时,需要对对应堆分区的已用内存进行遍历,假如GC的时候,有堆的一部分内容被交换到swap中,遍历到这部分的时候就须要将其交换回内存;更极端情况同一时刻因为内存空间不足,就需要把内存中堆的另外一部分换到SWAP中去,于是在遍历堆分区的过程中,会把整个堆分区轮流往SWAP写一遍,导致GC时间超长。线上应该限制swap区的大小,如果swap占用比例较高应该进行排查和解决,适当的时候可以通过降低堆大小,或者添加物理内存。
  因此,部署Java服务的Linux系统,在内存分配上要慎重。
  以上内容希望可以起到抛转引玉的作用,如有理解不到位的地方烦请指出。

深夜,31岁宝妈难过发圈儿子读学前班,我对他的教育已失去信心大家好,我是心理医生梓宸爸爸深夜,好不容易哄娃睡着觉,拿出手机一看,已经十二点多了,趁着清闲的时间抓紧刷了刷朋友圈,却被一个朋友发的消息震惊到了感觉自己快要崩溃了,儿子才读学前班,20年过去了,说帮陈宝莲养儿子的曾志伟和梁家辉,履行承诺了吗2002年,29岁的陈宝莲刚生完儿子,就从24楼一跃而下,最后不治身亡。闻知死讯,娱乐圈无数人前来悼念。其中就有演员曾志伟和梁家辉的身影。他们都是陈宝莲生前的好朋友,于是悲痛不已的春天,我想去田野里采一朵花欣赏生活的美打碗花和牵牛花很像,但却不是一种花,打碗花花冠和叶子更小,攀爬能力也远远比不上牵牛花朋友圈常看到有人晒爱人送的花,配文是玫瑰,其实绝大部分都是月季桂花和腊梅在欧洲不怎么能见到,于是2022无量山樱花谷的樱花就要绽放了南涧樱花谷摄影之家客栈翻新改造竣工酬客记南涧县距大理约100公里。七年前的2015,我与南涧樱花谷那一大片深谷茶地里的樱花结下了不解之缘。自古有黄山归来不看山的说法。经常看到苍洱坝图集树龄2500年,公冶长书院夫妻银杏树身披金甲在山东省安丘市石埠子镇孟家旺村,怀隐着一处景致幽雅香火鼎盛的传统古文化旅游名胜城顶山公冶长书院。当年孔子与公冶长夫妇亲手所植的两棵银杏树就位于此。记者李旭旭郭晓妮历经两千多年的风雨看!万物和谐共生的故事在这里上演栖息在国家湿地公园绥宁花园阁的白鹭李永智摄光明图片蓝天白云下的邵阳资江两岸唐明业摄光明图片美丽中国万里行湖南邵阳南山国家公园内,喜欢热闹的白颈长尾雉呼朋引伴来相聚,习惯独处的黑熊不看!万物和谐共生的故事在这里上演栖息在国家湿地公园绥宁花园阁的白鹭李永智摄光明图片蓝天白云下的邵阳资江两岸唐明业摄光明图片美丽中国万里行湖南邵阳南山国家公园内,喜欢热闹的白颈长尾雉呼朋引伴来相聚,习惯独处的黑熊不福建邵武被授予国字号绿水青山就是金山银山实践创新基地11月19日,在江西南昌举行的第十届中国生态文明论坛,对第六批国家生态文明建设示范区第六批绿水青山就是金山银山实践创新基地进行表彰授牌。市委书记陈显卿代表邵武市接受生态环境部黄润秋日本的一个奇特姓氏,不管你如何取名,译成中文后都像在骂自己姓氏对于每个人而言都是非常重要的,中国有着悠久的姓氏文化,如今已流传下来的姓氏就有5000多种。不光是中国,作为隔海邻邦的日本,也有着独特的姓氏文化。如今日本已留有的姓氏足有十三万认真聊聊光伏屋顶之争的终局难题是什么?图片来源视觉中国作者鹿尧,编辑桑明强提到战略性产业,光伏是绕不开的话题。回顾国内光伏产业发展和演变的二十多年,可以说是跌宕起伏从世纪初面对国外技术封锁和垄断,艰难开始技术自研,随着顶级科学期刊撤回天使粒子论文,张首晟等4位华人为通讯作者(图片来源视觉中国)世界顶级科学期刊撤回华人科学家团队发表曾被视为诺奖级发现的天使粒子研究论文,引发行业热议。钛媒体App11月21日消息,科学(Science)杂志于11月17日
聚焦高质量发展丨乌拉盖三大绿色产业守护天边草原新华网呼和浩特1月5日电(李国栋戴薇宁)乌拉盖草原位于内蒙古自治区锡林郭勒盟东北部,可利用草原面积650余万亩,是世界上保存最完好的天然草原之一,因此也成为众多展示壮美草原风光影片科学创新正在衰退,我们不确定原因(boonchaiwedmakawand盖蒂图片社)根据周三发布的对数百万份研究论文和专利的分析,尽管知识量不断增加,但突破性科学发现和技术创新的速度正在放缓。主要作者迈克尔帕克(iPhone14ProMax灵动岛陷烧屏门!网友吐槽秒变火烧岛在iPhone14Pro系列上,苹果动刀砍掉祖传的刘海设计,取而代之的是让人眼前一亮的灵动岛。然而,近日有海外用户表示,自己的iPhone14ProMax灵动岛区域出现了烧屏问题。别了优酷,其实你是我无法靠近地缘,不要把世界很酷变很苦头条创作挑战赛视频平台这几年如火如荼,有一种是参与性比较强的,比如百度的好看视频,字节的西瓜视频,以及抖音快手等等。还有一种是基本纯观赏视频,比如优酷爱奇艺搜狐等等。当然他们也有很我国科学家在云南发现2。44亿年前奇异罗平龙尖嘴长吻的四脚蛇化石,全长超过半米。中科院古脊椎动物与古人类研究所科研人员在云南省罗平县中三叠世海相地层(2。44亿年前)发现一种新的肿肋龙科爬行动物,代表了多指节型鳍龙类最早出现前列腺增生,尿闭不通,我从少阳论,行疏利少阳之法,复水道通畅何为少阳?少阳包括足少阳胆经和手少阳三焦经系统,为气机升降出入的枢纽。灵枢本输少阳属肾,肾上连肺,故将两脏说明少阳与肺肾密切相连。难经六十六难曰三焦者主通行三气,经历于五脏六腑。三我国唯一的跨省5A景区,两省各自收门票,哪边景色好至今争论不休去年,我国公布了第40批5A级旅游景区,12家旅游景区跻身5A行列。其中,有一个景区是我们目前唯一跨省域并由两省各自运营的景区黄河壶口瀑布。壶口瀑布位于陕西山西两省的省界上,因此不约基奇能否成为历史第四位连续三届获得最有价值球员奖项的球员?尼古拉约基奇的赛季,以及他为成为有史以来第4位连续3次获得MVP奖项的球员所做的努力。尼古拉约基奇(NikolaJokic)带领掘金队在竞争异常激烈的西部联盟中名列前茅。赛季开始前越南的独角兽跻身日经指数亚洲十大值得期待的公司之列日经亚洲报刚刚公布了2023年亚洲10家卓越企业名单,其中包括被认为是越南第一家科技独角兽的VNG股份公司。在对这10家公司的介绍中,日经亚洲强调指出,在经历了因冲突通货膨胀和旷日网上流传数据靠谱吗?我国社会保障水平与发达国家差距有多大?近期网络上流传一种说法,我国每年的社会保障支出占GDP的比重只有3左右,与发达国家的差距实在是太大了。据说,我国每年的社会保障支出占GDP的比重只有3左右,这一点是上海财经大学校长越南老街省政企代表团到河口县考察交流1月5日,越南老街省工贸厅和企业代表团到红河哈尼族彝族自治州河口瑶族自治县考察交流,与由河口县中国(云南)自由贸易试验区红河片区等机构人员组成的中方代表团举行会谈。中方代表向越方介