Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Exploring ZGC over Java 11~15

Exploring ZGC over Java 11~15

Exploring ZGC over Java 11~15
Burikaigi2021

53850955f15249a1a9dc49df6113e400?s=128

LINE Developers
PRO

January 31, 2021
Tweet

Transcript

  1. Exploring ZGC over Java 11~15 Burikaigi2021 2021/1/30

  2. 自己紹介 • 吉田真也 – LINE株式会社 • LINE Platform Developmentセンター1 •

    Messaging Platform Development室 • Z Partチーム HBase Unit • LINEのメッセンジャーメッセンジャーのメッセンジャーサーバサイド、HBase関連ののメッセンジャーDev/Ops サーバ Other services
  3. Javaどれ使ってますか?使ってますか?ってますか? • Java 16 ea • Java 15 (2020 Late)

    • Java 14 (2020 Early) • Java 13 (2019 Late) • Java 12 (2019 Early) • Java 11 (2018 Late, LTS) • Java 10 (2018 Early) • Java 9 (2017 Late) • Java 8 (2014) • Java 7 (2011) • Java 6 (2006)
  4. GC気にしていますかにしていますか? • 世代別Serial • 世代別Parallel • CMS (Removed in Java

    14) • G1GC (Experimental in Java 6, Default in Java 9) • Epsilon GC (Introduced in Java 11)
  5. HW Evolution • 2006年 • 2019年 引用:https://www.dell.com/downloads/jp/products/pedge/PE1950_0906_final.pdf 引用:https://japancatalog.dell.com/c/wp-content/uploads/PowerEdge_Catalog_20191017.pdf

  6. ZGC Next generation Production ready Java15 STW: Stop The World,

    JVM Pause Time Low latency STW<=10ms Goal: <=1ms Scalable Up to TB scale Throughput reduction 15%
  7. Enable ZGC • -XX:+UseZGC • -Xms -Xmx • -XX:ConcGCThreads=<number> –

    基本的にはにはdefaultでOK • -XX:+UseLargePages -XX:AllocateHeapAt=/hugepages – Large pageを使う場合のみ使ってますか?う場合のみ場合のみのメッセンジャーみ
  8. ZGC Next generation Production ready Java15 STW: Stop The World,

    JVM Pause Time Low latency STW<=10ms Goal: <=1ms Scalable Up to TB scale Throughput reduction 15%
  9. ZGC: GCサイクル App thread GC thread STW 10ms ≦10ms STW

    10ms ≦10ms STW 10ms ≦10ms Mark start Conc mark Mark end Prepare for reloc Reloc start Conc reloc Conc remap STW 10ms ≦10ms
  10. ZGC: GCサイクル App thread GC thread STW 10ms ≦10ms STW

    10ms ≦10ms STW 10ms ≦10ms Mark start Conc mark Mark end Prepare for reloc Reloc start Conc reloc Conc remap STW 10ms ≦10ms
  11. ZGC: GCサイクル App thread GC thread STW 10ms ≦10ms STW

    10ms ≦10ms STW 10ms ≦10ms Mark start Conc mark Mark end Prepare for reloc Reloc start Conc reloc Conc remap STW 10ms ≦10ms Walk root set Thread stack Walk root set Thread stack Walk root set (Thread stack)
  12. ZGC: GCサイクル App thread GC thread STW 10ms ≦10ms STW

    10ms ≦10ms STW 10ms ≦10ms Mark start Conc mark Mark end Prepare for reloc Reloc start Conc reloc Conc remap STW 10ms ≦10ms Walk object graph Mark alive objects Choose relocation set Copy object to another page Walk object graph Update pointer to refer new location
  13. ZGC: GCサイクル App thread GC thread STW 10ms ≦10ms STW

    10ms ≦10ms STW 10ms ≦10ms Mark start Conc mark Mark end Prepare for reloc Reloc start Conc reloc Conc remap STW 10ms ≦10ms Walk object graph Mark alive objects Choose relocation set Copy object to another page Walk object graph Update pointer to refer new location
  14. ZGC: GCサイクル App thread GC thread STW 10ms ≦10ms STW

    10ms ≦10ms STW 10ms ≦10ms Mark start Conc remap &mark Mark end Prepare for reloc Reloc start Conc reloc STW 10ms ≦10ms Conc remap &mark Mark start GC(N) GC(N+1) GC(N-1)
  15. Concurrent relocateのメッセンジャー難しさしさ • Object o = obj.field; – oがAだと不整合不整合のみ A

    A’ O A A A’   GCがコピー
  16. Load barrier Object o = obj.field; <load barrier for o>

    // Use o • ポインタのメッセンジャー状態によってによってapp threadで処理をするを使う場合のみする – Mark: 未mark mark ⇒mark – Relocate/remap: 未relocate/remap relocate/remap ⇒mark
  17. Colored pointer • ポインタのメッセンジャー状態によってを使う場合のみアドレスに埋め込むに埋め込むめ込む込むむ • Mark済みフラグはみフラグははGCサイクルごと不整合にMarked0 or 1を使う場合のみ使ってますか?う場合のみ Unused(16 bits)

    Object Address (44 bits, Up to 16 TB) Remapped Finalizable Marked1 Marked0 Marked: 0000 0000 0000 0000 0010 0010 1101 0110 … 1011 0100 Remaped: 0000 0000 0000 0000 0100 0010 1101 0110 … 1011 0100
  18. Relocate and remap O A Marked(A) A A’ O A

    Marked(A) A’ A A’ ⇒ A’ A A’ O A A’ A A’ ⇒ A’ Remapped(A’) Relocate Remap
  19. 本当ににSTW<=10ms? • テスに埋め込むト用用HBaseクラスに埋め込むタ – 本番環境と同じと不整合同じじHBaseバージョン – 本番環境と同じに近いマシンスペッいマシンスに埋め込むペック – Java 11,

    15 + ZGC • 実アプリ、実ワーアプリ、実アプリ、実ワーワークロードを使う場合のみ再現して評価して評価 – LINEのメッセンジャーメッセンジャーのメッセンジャーと不整合あるテーブルのメッセンジャーワークロード
  20. Shadow hbase requests RPC Response JDK8+G1GC App Server 本番環境と同じ HBase

    client
  21. Consumer RPC Info JDK11.0.1+ZGC JDK15.0.1+ZGC RPC Response hbase-shadows Intercept テスに埋め込むト用環境と同じ

    Shadow hbase requests RPC Response JDK8+G1GC App Server 本番環境と同じ HBase client
  22. Shadow hbase requests Request count • 本番環境と同じ • テスに埋め込むト用環境と同じ

  23. JVM pause timeのメッセンジャーログはを使う場合のみ集めてみるめ込むてみる

  24. HBaseレスに埋め込むポンスに埋め込むタイム(Java 11) G1GC ZGC(ピンク、紫) 1,200 400 350 100 非表示 非表示

  25. ZGCと不整合のメッセンジャー関係 • HBase log 2019-10-17 16:51:42,763 WARN [RpcServer.default.RWQ.Fifo.write.handler=45,queue=20,port=xxxxx] ipc.RpcServer: (responseTooSlow):

    {"call":"Multi(org.apache.hadoop.hbase.protobuf.generated.ClientProtos$MultiRequest)","starttimems":1571298702070,"responsesiz e":10,"method":"Multi","param":"region= xxx,xxx.xxx., for 1 action(s) and 1st row key=xxx","processingtimems":693,"client":"xxx.xxx.xxx.xxx:xxx","queuetimems":69,"class":"HregionServer"} • GC log [2019-10-17T16:51:41.908+0900][139132][info][gc,phases ] GC(31) Concurrent Destroy Detached Pages 0.001ms [2019-10-17T16:51:42.067+0900][139132][info][gc,heap ] Page Cache Flushed: 14M requested, 14M(77272M->77258M) flushed [2019-10-17T16:51:42.069+0900][139132][info][gc,heap ] Page Cache Flushed: 32M requested, 32M(77258M->77226M) flushed [2019-10-17T16:51:42.073+0900][139132][info][gc,heap ] Page Cache Flushed: 32M requested, 32M(77226M->77194M) flushed … [2019-10-17T16:51:42.759+0900][139132][info][gc,heap ] Page Cache Flushed: 32M requested, 32M(72356M->72324M) flushed [2019-10-17T16:51:42.763+0900][139132][info][gc,heap ] Page Cache Flushed: 32M requested, 32M(72324M->72292M) flushed [2019-10-17T16:51:42.769+0900][139132][info][gc,heap ] Page Cache Flushed: 32M requested, 32M(72292M->72260M) flushed
  26. JVM STWが10ms以下でもでも 各アプリケーショアプリケーションがスに埋め込むレッドが詰まらないというまらないと不整合いう場合のみわけ ではない

  27. Page and Cache Memory 物理をするメモリ 仮想メモリメモリ ZGC U: Used, C:

    Cached U U C C U U C U U U U C C C U C
  28. Page and Cache Memory 物理をするメモリ 仮想メモリメモリ ZGC U: Used, C:

    Cached U U C C U U C U U U U C U C U C
  29. Detach page and reuse Memory 物理をするメモリ 仮想メモリメモリ ZGC U: Used,

    C: Cached, D: Detached U U D D U U C U U U U D U D U C U
  30. Flush page Memory 物理をするメモリ 仮想メモリメモリ ZGC U: Used, C: Cached,

    F: Flushed U U F F U U C U U U U F U F U C U
  31. Page Cache Flushのメッセンジャー改善 • Java 11 – GCのメッセンジャータイミングはで全てのてのメッセンジャーDetached pageを使う場合のみFlush •

    Java 13 – ZGC: Delete ZPages using ZSafeDelete • https://bugs.openjdk.java.net/browse/JDK-8220600 • Detached pageが発生するタイミングするタイミングはで極力Flush • Java 15 – ZGC: Introduce ZUnmapper to asynchronous unmap pages • https://bugs.openjdk.java.net/browse/JDK-8246220 • Page flushを使う場合のみ非同じ期にに
  32. HBaseレスに埋め込むポンスに埋め込むタイム(Java 15, ZGC) ※通常のワークロードのメッセンジャーワークロードのメッセンジャー3倍 60ms 110ms 非表示

  33. Response Time & JVM Pause 1.3ms 0.0ms

  34. Response Time & JVM Pause

  35. ZGCと不整合のメッセンジャー関係 • HBase log 2021-01-27 14:58:35,646 WARN [RpcServer.default.RWQ.Fifo.write.handler=251,queue=1,port=xxxxx] ipc.RpcServer: (responseTooSlow):

    {"call":"Multi(org.apache.hadoop.hbase.protobuf.generated.ClientProtos$MultiRequest)","multi.gets":0,"start timems":"1611727115562","responsesize":"10","method":"Multi","param":"xxx","processingtimems":84,"cli ent":"xxx.xxx.xxx.xxx:xxxxx","queuetimems":0,"multi.servicecalls":0,"class":"HregionServer","multi.mutation s":1} – 35.646-84ms = 35.562 • GC Log [2021-01-27T14:58:35.562+0900][27519][info ][safepoint ] Safepoint "ZRelocateStart", Time since last: 85766444 ns, Reaching safepoint: 643999 ns, At safepoint: 381759 ns, Total: 1025758 ns [2021-01-27T14:58:36.059+0900][27519][info ][gc,phases ] GC(4272) Concurrent Relocate 496.877ms
  36. ZGC: GCサイクル App thread GC thread STW 10ms ≦10ms STW

    10ms ≦10ms STW 10ms ≦10ms Mark start Conc remap &mark Mark end Prepare for reloc Reloc start Conc reloc STW 10ms ≦10ms Conc remap &mark Mark start GC(N) GC(N+1) GC(N)
  37. Load barrier Object o = obj.field; <load barrier for o>

    // Use o • ポインタのメッセンジャー状態によってによってapp threadで処理をするを使う場合のみする – Mark: 未mark mark ⇒mark – Relocate/remap: 未relocate/remap relocate/remap ⇒mark
  38. まと不整合め込む • ZGC – Java15でプロダクションレディに!に! – Load barrier, Colored pointer,

    仮想メモリメモリなどを使う場合のみ活用して並行ににGC • 性能評価 – 実アプリ、実ワーアプリケーション、実アプリ、実ワーワークロードに近いマシンスペッいテスに埋め込むト用環境と同じ – 『JVM STW』が概ねが概ねね10ms以下でも • アプリケーションスに埋め込むレッドが10ms以上詰まらないというまらないと不整合は言っていないっていない(重要) – 現して評価状、アプリケーションが詰まらないというまるケースに埋め込むがある • 大きい問題はきい問題ははJava 15までに修正済みフラグはみ • 今後の改善に期待のメッセンジャー改善に期に待