• 一次高IO下的GC分析之旅


    一次高IO下的GC分析之旅

    96 
    编码前线 
    2018.12.21 00:06 字数 597 阅读 45评论 0

    起因:收到GC STW报警

    【监控系统】Total time for which application threads were stopped: 67.7651070 seconds, Stopping threads took: 0.0000240 seconds

    快速分析原因

    此处不分析具体GC日志,主要分析方法:

    • 从线上拷贝日志到本地

    • 打包成gc.zip格式

    • 上传到gceasy.io

    •  
      image

    找到原因

    找到是因为缺IO或内存资源导致高IO,并不是GC本身过程耗时太多(上一步GC的报告中获得):

     
    image

    通过监控系统,找到当时机器IO飙升(公司内部监控机器的平台,zabbix实时收集机器的一些状态):

     
    image

    深层次原因

    整个应用程序的停顿主要由两部分组成:由于JVM GC行为造成的停顿(T1->T2),以及为了记录JVM GC日志(T3->T4),系统调用write()被OS阻塞的时间。下面这张图展示了二者之间的关系。

     
    image

    解决方案

    首先,JVM实现完全可以解决掉这个问题。显然,如果将写GC日志的操作与可能会导致STW停顿的JVM GC处理过程分开,这个问题自然就不存在了。例如,JVM可以将记录GC日志的功能放到另一个线程中,独立来处理日志文件的写入,这样就不会增加STW停顿的时间了。但是,这种采用其他线程来处理的方式,可能会导致在JVM崩溃时丢失最后的GC日志信息。最好的方式,可能是提供一个JVM选项,让用户来选择适合的方式,但这个方法基本没办法我们自己来处理。
    由于后台IO造成的STW停顿时间,与IO的繁重程度有关,所以我们可以采用多种方式来降低后台IO的压力。例如,不要在同一节点上安装其他IO密集型的应用程序,减少其他类型的日志行为,提高日志回滚频率等等。

    我们最后的解决办法是将GC日志文件放到其他低IO磁盘上,把gc日志放到图中的/data2,很明显从iostat来看它的磁盘IO压力很小。

     
    image
  • 相关阅读:
    Object Files (.obj)
    使用IIS Microsoft的web服务器和ftp服务器
    关于matlab
    char, signed char, unsigned char的区别
    百度面试
    google笔试题_2011
    ioctl 函数与网络接口
    Unity之热更新:(三)XLua
    C#之设计模式:观察者模式
    C#:委托
  • 原文地址:https://www.cnblogs.com/vana/p/10837398.html
Copyright © 2020-2023  润新知