jHiccup

152 阅读7分钟

为什么要介绍使用这个工具? 我们在性能调优的过程中, 比如GC优化过程, 想观察进程卡顿情况,就可以使用jHiccup。ZGC号称卡顿控制在10ms以内, 怎么客观地看到这个数字呢,使用jHiccup就可以做到这一点。

1 jHiccup简介

jHiccup是一个开源工具,用于测量与应用程序底层Java运行时平台相关的暂停和停滞(或“hiccups”)。这个新工具捕获Java虚拟机(JVM)、操作系统、管理程序(如果使用的话)和硬件对应用程序停滞和响应时间的总体影响。

jHiccup允许开发人员、系统操作员和性能工程师轻松地创建和分析响应时间配置文件,并清楚地确定应用程序延迟的原因是驻留在应用程序代码还是底层运行时平台中。jHiccup对应用程序是完全透明和非侵入性的,在操作中没有任何性能开销,并且与使用任何JVM的所有Java应用程序兼容。 jHiccup允许开发人员、系统操作员和性能工程师轻松地创建和分析响应时间配置文件,并清楚地确定应用程序延迟的原因是驻留在应用程序代码还是底层运行时平台中。jHiccup对应用程序是完全透明和非侵入性的,在操作中没有任何性能开销,并且与使用任何JVM的所有Java应用程序兼容。

通过一段代码来分析下它的原理,它通过启动一个线程来记录自从上次休眠以来的时间间隔。这个线程会休眠一毫秒(默认,可配置),然后醒来,记录自从上次醒来的时间,并重复这个过程。这里的关键是理解“hiccup”是指那些超出正常或预期的停顿。如果所有的停顿都恰好是100毫秒,那么系统运行得很平稳,没有额外的停顿发生,因此没有“hiccup”需要记录。这种设计是为了捕捉那些比正常操作更慢的异常停顿,而不是记录性能改善或者正常波动的情况。

        public void run() {
            final long resolutionNsec = (long)(config.resolutionMs * 1000L * 1000L);
            try {
                long shortestObservedDeltaTimeNsec = Long.MAX_VALUE;
                long timeBeforeMeasurement = Long.MAX_VALUE;
                while (doRun) {
                    if (config.resolutionMs != 0) {
                        TimeUnit.NANOSECONDS.sleep(resolutionNsec);
                        if (allocateObjects) {
                            // Allocate an object to make sure potential allocation stalls are measured.
                            lastSleepTimeObj = new Long(timeBeforeMeasurement);
                        }
                    }
                    final long timeAfterMeasurement = System.nanoTime();
                    final long deltaTimeNsec = timeAfterMeasurement - timeBeforeMeasurement;
                    timeBeforeMeasurement = timeAfterMeasurement;

                    if (deltaTimeNsec < 0) {
                        // On the very first iteration (which will not time the loop in it's entirety)
                        // the delta will be negative, and we'll skip recording.
                        continue;
                    }

                    if (deltaTimeNsec < shortestObservedDeltaTimeNsec) {
                        shortestObservedDeltaTimeNsec = deltaTimeNsec;
                    }

                    long hiccupTimeNsec = deltaTimeNsec - shortestObservedDeltaTimeNsec;

                    recorder.recordValueWithExpectedInterval(hiccupTimeNsec, resolutionNsec);
                }
            } catch (InterruptedException e) {
                if (config.verbose) {
                    log.println("# HiccupRecorder interrupted/terminating...");
                }
            }
        }

2 使用指南

2.1 下载jHiccup

Azul官网下载jHiccup。下载后,解压缩文件,你会找到 jHiccup.jar

2.2 使用 jHiccup 运行程序

java -javaagent:<path-to-jHiccup.jar> -jar your-app.jar

2.3 配置 jHiccup

  • -d:开始记录前的延迟时间(毫秒)
  • -i:报告间隔(默认为 5000 毫秒)
  • -l:日志文件名称
  • -c:启动一个控制进程(一个单独的java进程),记录操作系统和硬件的影响,默认不启用

例如: java -javaagent:path/to/jHiccup.jar="-c -l hiccuplog" -jar your-app.jar

2.4 生成日志文件

运行应用程序后,jHiccup 会生成日志文件,文件名由 -l 参数指定。不指定的话, 文件名称即是hiccuplog,如何有-c参数,还会生成一个hiccuplog.c

2.5 日志解析

2.5.1 方式1

从github上下载HistogramLogAnalyzer代码, 编译构建mvn clean package,运行即可。将生成的hiccuplog拖入其中,即可看到图形。

image.png image.png

2.5.2 方式2

使用jHiccup自带的工具(在jHiccup解压包里)

% jHiccupLogProcessor -i hiccuplog -o mylog

生成可读的文件内容如下, 可与上述图形中的数据进行对比

    #[Interval percentile log between 0.000 and <Infinite> seconds (relative to StartTime)]
    #[StartTime: 1725875182.187 (seconds since epoch), Mon Sep 09 17:46:22 CST 2024]
    Time: IntervalPercentiles:count ( 50% 90% Max ) TotalPercentiles:count ( 50% 90% 99% 99.9% 99.99% Max )
    5.182: I:4408 (   0.066   0.393  13.828 ) T:4408 (   0.066   0.393   7.864  12.059  13.828  13.828 )
    10.182: I:4460 (   0.066   0.229   5.276 ) T:8868 (   0.066   0.279   5.046  11.076  13.828  13.828 )
    15.182: I:4501 (   0.066   0.197   2.392 ) T:13369 (   0.066   0.246   3.506  10.289  13.107  13.828 )
    20.182: I:4404 (   0.066   0.311   9.241 ) T:17773 (   0.066   0.262   2.916   9.961  13.107  13.828 )
    25.182: I:4397 (   0.082   0.328   5.472 ) T:22170 (   0.066   0.279   2.408   9.437  12.845  13.828 )
    30.182: I:4489 (   0.066   0.197   4.882 ) T:26659 (   0.066   0.262   2.163   9.306  12.845  13.828 )
    35.182: I:4494 (   0.066   0.180   5.079 ) T:31153 (   0.066   0.246   1.884   8.913  12.386  13.828 )
    40.182: I:4465 (   0.066   0.213   4.096 ) T:35618 (   0.066   0.246   1.753   8.716  12.386  13.828 )
    45.182: I:4482 (   0.066   0.213  19.137 ) T:40100 (   0.066   0.246   1.786   9.044  15.139  19.137 )
    50.182: I:4477 (   0.066   0.213   4.178 ) T:44577 (   0.066   0.246   1.671   8.847  15.139  19.137 )
    55.182: I:4474 (   0.066   0.229   9.372 ) T:49051 (   0.066   0.246   1.671   8.454  15.139  19.137 )
    60.182: I:4476 (   0.066   0.229   5.046 ) T:53527 (   0.066   0.246   1.589   8.290  14.156  19.137 )
    65.182: I:4474 (   0.066   0.229   4.424 ) T:58001 (   0.066   0.246   1.524   7.995  14.156  19.137 )
    70.182: I:4396 (   0.066   0.328   4.882 ) T:62397 (   0.066   0.246   1.540   7.799  13.828  19.137 )
    75.182: I:4377 (   0.082   0.360   4.981 ) T:66774 (   0.066   0.246   1.524   7.406  13.828  19.137 )
    80.182: I:4475 (   0.066   0.229   4.489 ) T:71249 (   0.066   0.246   1.491   7.209  13.173  19.137 )
    85.182: I:4488 (   0.066   0.213   4.620 ) T:75737 (   0.066   0.246   1.475   6.914  13.173  19.137 )
    90.182: I:4476 (   0.066   0.229   3.260 ) T:80213 (   0.066   0.246   1.442   6.685  13.107  19.137 )
    95.182: I:4515 (   0.066   0.180   2.736 ) T:84728 (   0.066   0.246   1.393   6.357  13.107  19.137 )
    100.182: I:4476 (   0.066   0.229   3.965 ) T:89204 (   0.066   0.246   1.393   6.226  13.107  19.137 )
    105.182: I:4476 (   0.066   0.246   4.751 ) T:93680 (   0.066   0.246   1.360   6.029  12.845  19.137 )
    110.182: I:4490 (   0.066   0.213   4.456 ) T:98170 (   0.066   0.246   1.327   5.800  12.845  19.137 )
    115.182: I:4496 (   0.066   0.229  10.027 ) T:102666 (   0.066   0.246   1.327   5.833  12.386  19.137 )
    120.183: I:4415 (   0.066   0.311   4.522 ) T:107081 (   0.066   0.246   1.327   5.472  12.386  19.137 )
    125.182: I:4357 (   0.082   0.360   4.653 ) T:111438 (   0.066   0.246   1.343   5.374  12.124  19.137 )
    130.183: I:4484 (   0.066   0.213   4.915 ) T:115922 (   0.066   0.246   1.327   5.276  12.124  19.137 )
    135.182: I:4508 (   0.066   0.213   4.981 ) T:120430 (   0.066   0.246   1.311   5.210  12.059  19.137 )
    140.182: I:4477 (   0.066   0.229   4.227 ) T:124907 (   0.066   0.246   1.294   5.046  12.059  19.137 )
    145.182: I:4512 (   0.066   0.180   4.014 ) T:129419 (   0.066   0.246   1.262   4.981  12.059  19.137 )
    150.182: I:4501 (   0.066   0.213   4.817 ) T:133920 (   0.066   0.246   1.262   4.915  11.862  19.137 )
    155.182: I:4532 (   0.066   0.180   4.751 ) T:138452 (   0.066   0.246   1.245   4.850  11.862  19.137 )
    160.182: I:4487 (   0.066   0.213   4.981 ) T:142939 (   0.066   0.246   1.229   4.817  11.403  19.137 )
    165.182: I:4506 (   0.066   0.197   3.817 ) T:147445 (   0.066   0.229   1.212   4.719  11.403  19.137 )
    170.182: I:4426 (   0.066   0.311   5.210 ) T:151871 (   0.066   0.246   1.229   4.686  11.207  19.137 )
    175.182: I:4390 (   0.082   0.344   9.634 ) T:156261 (   0.066   0.246   1.245   4.719  11.207  19.137 )
    180.182: I:4492 (   0.066   0.197   5.112 ) T:160753 (   0.066   0.246   1.245   4.686  11.141  19.137 )
    185.182: I:4506 (   0.066   0.180   5.538 ) T:165259 (   0.066   0.246   1.229   4.653  11.141  19.137 )
    190.183: I:4498 (   0.066   0.197   4.456 ) T:169757 (   0.066   0.246   1.229   4.620  11.141  19.137 )
    195.182: I:4517 (   0.066   0.197   4.915 ) T:174274 (   0.066   0.246   1.212   4.588  11.076  19.137 )
    200.182: I:4461 (   0.066   0.246   4.817 ) T:178735 (   0.066   0.246   1.212   4.555  11.076  19.137 )
    205.183: I:4499 (   0.066   0.213   5.046 ) T:183234 (   0.066   0.246   1.196   4.522  10.879  19.137 )
    210.182: I:4472 (   0.066   0.246   5.243 ) T:187706 (   0.066   0.246   1.212   4.489  10.879  19.137 )
    215.182: I:4511 (   0.066   0.197   3.703 ) T:192217 (   0.066   0.229   1.180   4.424  10.813  19.137 )
    220.183: I:4405 (   0.082   0.328   5.276 ) T:196622 (   0.066   0.246   1.212   4.424  10.813  19.137 )
    225.183: I:4349 (   0.082   0.393   5.833 ) T:200971 (   0.066   0.246   1.229   4.424  10.420  19.137 )
    230.183: I:4461 (   0.066   0.246   4.522 ) T:205432 (   0.066   0.246   1.229   4.424  10.420  19.137 )
    235.183: I:4513 (   0.066   0.197   6.488 ) T:209945 (   0.066   0.246   1.212   4.424  10.420  19.137 )
    240.182: I:4464 (   0.066   0.246   4.522 ) T:214409 (   0.066   0.246   1.212   4.391  10.355  19.137 )
    245.182: I:4494 (   0.066   0.213   5.112 ) T:218903 (   0.066   0.246   1.212   4.391  10.355  19.137 )
    250.182: I:4468 (   0.066   0.262   4.129 ) T:223371 (   0.066   0.246   1.196   4.358  10.289  19.137 )
    255.183: I:4511 (   0.066   0.213   4.817 ) T:227882 (   0.066   0.246   1.196   4.358  10.289  19.137 )
    260.183: I:4500 (   0.066   0.213   5.308 ) T:232382 (   0.066   0.246   1.180   4.293  10.224  19.137 )
    265.183: I:4452 (   0.066   0.279   4.456 ) T:236834 (   0.066   0.246   1.180   4.293  10.224  19.137 )
    270.183: I:4314 (   0.082   0.426   5.112 ) T:241148 (   0.066   0.246   1.196   4.260  10.158  19.137 )
    275.182: I:4383 (   0.082   0.344   4.751 ) T:245531 (   0.066   0.246   1.196   4.260  10.158  19.137 )
    280.182: I:4484 (   0.066   0.213   4.063 ) T:250015 (   0.066   0.246   1.196   4.227  10.093  19.137 )
    285.182: I:4500 (   0.066   0.197   4.227 ) T:254515 (   0.066   0.246   1.196   4.227  10.093  19.137 )
    290.182: I:4490 (   0.066   0.229   4.817 ) T:259005 (   0.066   0.246   1.180   4.194  10.093  19.137 )
    295.183: I:4485 (   0.066   0.213   4.489 ) T:263490 (   0.066   0.246   1.180   4.194  10.027  19.137 )
    300.183: I:4472 (   0.066   0.229   5.210 ) T:267962 (   0.066   0.246   1.180   4.194  10.027  19.137 )
    305.183: I:4368 (   0.066   0.410  13.304 ) T:272330 (   0.066   0.246   1.229   4.293  10.224  19.137 )
    310.182: I:4493 (   0.066   0.197   5.407 ) T:276823 (   0.066   0.246   1.229   4.293  10.224  19.137 )
    315.182: I:4521 (   0.066   0.180   4.588 ) T:281344 (   0.066   0.246   1.212   4.260  10.158  19.137 )
    320.182: I:4431 (   0.066   0.295   5.112 ) T:285775 (   0.066   0.246   1.212   4.260  10.158  19.137 )
    325.182: I:4397 (   0.082   0.344   4.653 ) T:290172 (   0.066   0.246   1.212   4.227  10.093  19.137 )
    330.182: I:4493 (   0.066   0.213   4.260 ) T:294665 (   0.066   0.246   1.212   4.227  10.093  19.137 )
    335.182: I:4516 (   0.066   0.197   2.195 ) T:299181 (   0.066   0.246   1.212   4.227  10.093  19.137 )
    340.183: I:4496 (   0.066   0.213   5.079 ) T:303677 (   0.066   0.246   1.196   4.194  10.027  19.137 )
    345.182: I:4481 (   0.066   0.229   4.325 ) T:308158 (   0.066   0.246   1.196   4.194  10.027  19.137 )
    350.182: I:4475 (   0.066   0.229   3.785 ) T:312633 (   0.066   0.246   1.196   4.178  10.027  19.137 )
    355.182: I:4510 (   0.066   0.197  10.027 ) T:317143 (   0.066   0.246   1.180   4.194  10.027  19.137 )
    360.182: I:4486 (   0.066   0.229   4.915 ) T:321629 (   0.066   0.246   1.180   4.194  10.027  19.137 )
    365.182: I:4492 (   0.066   0.213   4.719 ) T:326121 (   0.066   0.246   1.180   4.194  10.027  19.137 )
    370.182: I:4430 (   0.066   0.295   4.014 ) T:330551 (   0.066   0.246   1.180   4.178   9.961  19.137 )
    375.182: I:4388 (   0.082   0.344   4.227 ) T:334939 (   0.066   0.246   1.180   4.178   9.961  19.137 )
    380.183: I:4506 (   0.066   0.197   4.555 ) T:339445 (   0.066   0.246   1.180   4.162   9.961  19.137 )
    385.182: I:4519 (   0.066   0.180   4.751 ) T:343964 (   0.066   0.246   1.163   4.145   9.896  19.137 )
    390.182: I:4478 (   0.066   0.229   4.358 ) T:348442 (   0.066   0.246   1.163   4.129   9.896  19.137 )
    395.182: I:4515 (   0.066   0.197   3.785 ) T:352957 (   0.066   0.246   1.163   4.129   9.830  19.137 )
    400.182: I:4468 (   0.066   0.246   5.669 ) T:357425 (   0.066   0.246   1.163   4.129   9.830  19.137 )
    405.182: I:4484 (   0.066   0.229  10.617 ) T:361909 (   0.066   0.246   1.163   4.145   9.830  19.137 )
    410.183: I:4486 (   0.066   0.213   3.850 ) T:366395 (   0.066   0.246   1.163   4.129   9.830  19.137 )
    415.182: I:4508 (   0.066   0.213   9.896 ) T:370903 (   0.066   0.246   1.163   4.145   9.830  19.137 )
    420.183: I:4437 (   0.066   0.279   6.029 ) T:375340 (   0.066   0.246   1.163   4.129   9.830  19.137 )
    425.182: I:4348 (   0.082   0.393  10.945 ) T:379688 (   0.066   0.246   1.180   4.162   9.896  19.137 )
    430.182: I:4504 (   0.066   0.197   3.326 ) T:384192 (   0.066   0.246   1.163   4.145   9.896  19.137 )
    435.182: I:4503 (   0.066   0.213   3.998 ) T:388695 (   0.066   0.246   1.163   4.145   9.896  19.137 )
    440.182: I:4489 (   0.066   0.213   3.097 ) T:393184 (   0.066   0.246   1.163   4.129   9.830  19.137 )
    445.182: I:4529 (   0.066   0.180   5.014 ) T:397713 (   0.066   0.246   1.147   4.112   9.830  19.137 )
    450.182: I:4470 (   0.066   0.246   3.965 ) T:402183 (   0.066   0.246   1.147   4.096   9.830  19.137 )
    455.182: I:4511 (   0.066   0.197   4.030 ) T:406694 (   0.066   0.246   1.147   4.080   9.830  19.137 )
    460.182: I:4491 (   0.066   0.213   4.784 ) T:411185 (   0.066   0.246   1.130   4.063   9.765  19.137 )
    465.182: I:4490 (   0.066   0.213   6.193 ) T:415675 (   0.066   0.246   1.130   4.063   9.765  19.137 )
    470.183: I:4437 (   0.066   0.279   4.850 ) T:420112 (   0.066   0.246   1.130   4.063   9.699  19.137 )
    475.182: I:4363 (   0.082   0.393  10.813 ) T:424475 (   0.066   0.246   1.147   4.112   9.830  19.137 )
    480.182: I:4496 (   0.066   0.197   4.456 ) T:428971 (   0.066   0.246   1.147   4.112   9.830  19.137 )
    485.182: I:4496 (   0.066   0.213   6.128 ) T:433467 (   0.066   0.246   1.130   4.112   9.830  19.137 )
    490.182: I:4488 (   0.066   0.229   5.177 ) T:437955 (   0.066   0.246   1.130   4.112   9.830  19.137 )
    495.182: I:4505 (   0.066   0.213   3.654 ) T:442460 (   0.066   0.246   1.130   4.096   9.765  19.137 )
    500.183: I:4484 (   0.066   0.213   4.030 ) T:446944 (   0.066   0.246   1.130   4.063   9.765  19.137 )
    505.182: I:4510 (   0.066   0.197   3.932 ) T:451454 (   0.066   0.246   1.130   4.063   9.699  19.137 )
    510.182: I:4484 (   0.066   0.229   9.175 ) T:455938 (   0.066   0.246   1.130   4.063   9.699  19.137 )
    515.182: I:4516 (   0.066   0.197   4.850 ) T:460454 (   0.066   0.246   1.114   4.063   9.634  19.137 )
    520.183: I:4438 (   0.066   0.262   4.686 ) T:464892 (   0.066   0.246   1.130   4.047   9.634  19.137 )
    525.182: I:4361 (   0.082   0.377   6.226 ) T:469253 (   0.066   0.246   1.130   4.063   9.634  19.137 )
    530.182: I:4492 (   0.066   0.229   4.325 ) T:473745 (   0.066   0.246   1.130   4.063   9.634  19.137 )
    535.183: I:4502 (   0.066   0.229   9.437 ) T:478247 (   0.066   0.246   1.130   4.080   9.634  19.137 )