RFR: JDK-8306441: Two phase segmented heap dump [v16]

Yi Yang yyang at openjdk.org
Mon Jul 10 06:13:17 UTC 2023


> ### Motivation and proposal
> Hi, heap dump brings about pauses for application's execution(STW), this is a well-known pain. JDK-8252842 have added parallel support to heapdump in an attempt to alleviate this issue. However, all concurrent threads competitively write heap data to the same file, and more memory is required to maintain the concurrent buffer queue. In experiments, we did not feel a significant performance improvement from that.
> 
> The minor-pause solution, which is presented in this PR, is a two-stage segmented heap dump:
> 
> - Phase 1(STW): Concurrent threads directly write data to multiple heap files.
> - Phase 2(Non-STW): Merge multiple heap files into one complete heap dump file. This process can happen outside safepoint.
> 
> Now concurrent worker threads are not required to maintain a buffer queue, which would result in more memory overhead, nor do they need to compete for locks. The changes in the overall design are as follows:
> 
> ![image](https://github.com/openjdk/jdk/assets/5010047/77e4764a-62b5-4336-8b45-fc880ba14c4a)
> <p align="center">Fig1. Before</p>
> 
> ![image](https://github.com/openjdk/jdk/assets/5010047/931ab874-64d1-4337-ae32-3066eed809fc)
> <p align="center">Fig2. After this patch</p>
> 
> ### Performance evaluation
> | memory | numOfThread | CompressionMode | STW | Total |
> | -------| ----------- | --------------- | --- | ---- |
> | 8g | 1 T | N | 15.612 | 15.612 |
> | 8g | 32 T | N | 2.561725 | 14.498 |
> | 8g | 32 T | C1 | 2.3084878 | 14.198 |
> | 8g | 32 T | C2 | 10.9355128 | 21.882 |
> | 8g | 96 T | N | 2.6790452 | 14.012 |
> | 8g | 96 T | C1 | 2.3044796 | 3.589 |
> | 8g | 96 T | C2 | 9.7585151 | 20.219 |
> | 16g | 1 T | N | 26.278 | 26.278 |
> | 16g | 32 T | N | 5.231374 | 26.417 |
> | 16g | 32 T | C1 | 5.6946983 | 6.538 |
> | 16g | 32 T | C2 | 21.8211105 | 41.133 |
> | 16g | 96 T | N | 6.2445556 | 27.141 |
> | 16g | 96 T | C1 | 4.6007096 | 6.259 |
> | 16g | 96 T | C2 | 19.2965783 | 39.007 |
> | 32g | 1 T | N | 48.149 | 48.149 |
> | 32g | 32 T | N | 10.7734677 | 61.643 |
> | 32g | 32 T | C1 | 10.1642097 | 10.903 |
> | 32g | 32 T | C2 | 43.8407607 | 88.152 |
> | 32g | 96 T | N | 13.1522042 | 61.432 |
> | 32g | 96 T | C1 | 9.0954641 | 9.885 |
> | 32g | 96 T | C2 | 38.9900931 | 80.574 |
> | 64g | 1 T | N | 100.583 | 100.583 |
> | 64g | 32 T | N | 20.9233744 | 134.701 |
> | 64g | 32 T | C1 | 18.5023784 | 19.358 |
> | 64g | 32 T | C2 | 86.4748377 | 172.707 |
> | 64g | 96 T | N | 26.7374116 | 126.08 |
> | 64g | 96 T | C1 | 16.8101551 | 17.938 |
> | 64g | 96 T | C2 | 80.1626621 | 169.003 |
> | 128g | 1 T | ...

Yi Yang has updated the pull request incrementally with two additional commits since the last revision:

 - whitespace
 - add test

-------------

Changes:
  - all: https://git.openjdk.org/jdk/pull/13667/files
  - new: https://git.openjdk.org/jdk/pull/13667/files/7cbb4a10..4d372dab

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=13667&range=15
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=13667&range=14-15

  Stats: 149 lines in 3 files changed: 133 ins; 0 del; 16 mod
  Patch: https://git.openjdk.org/jdk/pull/13667.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/13667/head:pull/13667

PR: https://git.openjdk.org/jdk/pull/13667


More information about the serviceability-dev mailing list