一次高IO下的GC分析之旅

编码前线 关注

2018.12.21 00:06 字数 597 阅读 45评论 0喜欢 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

一次高IO下的GC分析之旅的更多相关文章

  1. Golang适合高并发场景的原因分析

    http://blog.csdn.NET/ghj1976/article/details/27996095 典型的两个现实案例: 我们先看两个用Go做消息推送的案例实际处理能力. 360消息推送的数据 ...

  2. jvm系列:Java GC 分析

    Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...

  3. 在Linux下,如何分析一个程序达到性能瓶颈的原因

    0.在Linux下,如何分析一个程序达到性能瓶颈的原因,请分别从CPU.内存.IO.网络的角度判断是谁导致的瓶颈?注意现在的机器CPU是多核 1.用sar -n DEV 1 10 2.用iotop命令 ...

  4. jvm系列(九):Java GC 分析

    Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...

  5. jvm系列(五):Java GC 分析

    Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...

  6. 《Troubleshooting SQL Server》读书笔记-CPU使用率过高(下)

    <Troubleshooting SQL Server>读书笔记-CPU使用率过高(下) 第三章 High CPU Utilization. CPU使用率过高的常见原因 查询优化器会尽量从 ...

  7. 在linux系统中跟踪高IO等待

    原文作者:Jon Buys 原文地址:http://ostatic.com/blog/tracking-down-high-io-wait-in-linux 译者:Younger Liu,本作品采用知 ...

  8. JVM-Java GC分析

    如何获取JavaGC日志 用动态命令查看: jstat -gc 1262 2000 20  每隔20秒输入一次日志,总共输入20次 设置GC参数打印出日志 -XX:+PrintGC 输出GC日志 -X ...

  9. 【GC分析】Java GC日志查看

    Java中的GC有哪几种类型? 参数 描述 UseSerialGC 虚拟机运行在Client模式的默认值,打开此开关参数后, 使用Serial+Serial Old收集器组合进行垃圾收集. UsePa ...

随机推荐

  1. PHP7 错误及异常机制

    关键词 error 不能在编译期发现的运行期错误,比如试图用 echo 输出一个未赋值的变量,这类问题往往导致程序或逻辑无法继续下去而需要中断: exception 程序执行过程中出现意料之外的情况, ...

  2. Python应用RabbitMQ教程

    介绍 RabbitMQ是一个消息代理.它的工作就是接收和转发消息.你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处.在这个比喻中,RabbitMQ就扮演着邮箱.邮局以及邮 ...

  3. mac下开启phpredis扩展

    下载 官网下载php合适的版本:http://pecl.php.net/package/redis 这里我的php版本:7.1.23,下载的phpredis版本:5.0.0 配置安装 解包.重命名 s ...

  4. JS基础_字面量和变量

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. MySQL索引详解(优缺点,何时需要/不需要创建索引,索引及sql语句的优化)

     一.什么是索引? 索引是对数据库表中的一列或多列值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息. 二.索引的作用? 索引相当于图书上的目录,可以根据目录上的页码快速找到所需的内容,提 ...

  6. PHP进阶书籍

    [初阶](基础知识及入门) 01. <PHP与MySQL程序设计(第4版)>  http://item.jd.com/10701892.html 02. <深入浅出MySQL 数据库 ...

  7. The Multilinear Structure of ReLU Networks

    两种非常常见的非线性单元:rectified linear units (ReLUs) 和 leaky ReLUs 我们选取binary hinge loss进行二分类 对于多分类,我们可以定义mul ...

  8. php页面禁用错误报告

    //禁用错误报告 error_reporting(0);#or ini_set("display_errors","Off"); //开启错误报告 ini_se ...

  9. usb四种传输模式bulk

    当USB插入USB总线时,USB控制器会自动为该USB设备分配一个数字来标示这个设备.另外,在设备的每个端点都有一个数字来表明这个端点.USB设备驱动向USB控制器驱动请求的每次传输被称为一个事务(T ...

  10. java多线程之生产者消费者模型

    public class ThreadCommunication{ public static void main(String[] args) { Queue q = new Queue();//创 ...