Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介 ● 吉田真也 – LINE株式会社 ● LINE Platform Developmentセンター1 ● Messaging Platform Development室 ● Z Partチーム HBase Unit ● LINEのメッセンジャーメッセンジャーのメッセンジャーサーバサイド、HBase関連ののメッセンジャーDev/Ops サーバ Other services

Slide 3

Slide 3 text

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)

Slide 4

Slide 4 text

GC気にしていますかにしていますか? ● 世代別Serial ● 世代別Parallel ● CMS (Removed in Java 14) ● G1GC (Experimental in Java 6, Default in Java 9) ● Epsilon GC (Introduced in Java 11)

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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%

Slide 7

Slide 7 text

Enable ZGC ● -XX:+UseZGC ● -Xms -Xmx ● -XX:ConcGCThreads= – 基本的にはにはdefaultでOK ● -XX:+UseLargePages -XX:AllocateHeapAt=/hugepages – Large pageを使う場合のみ使ってますか?う場合のみ場合のみのメッセンジャーみ

Slide 8

Slide 8 text

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%

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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)

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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)

Slide 15

Slide 15 text

Concurrent relocateのメッセンジャー難しさしさ ● Object o = obj.field; – oがAだと不整合不整合のみ A A’ O A A A’   GCがコピー

Slide 16

Slide 16 text

Load barrier Object o = obj.field; // Use o ● ポインタのメッセンジャー状態によってによってapp threadで処理をするを使う場合のみする – Mark: 未mark mark ⇒mark – Relocate/remap: 未relocate/remap relocate/remap ⇒mark

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

本当ににSTW<=10ms? ● テスに埋め込むト用用HBaseクラスに埋め込むタ – 本番環境と同じと不整合同じじHBaseバージョン – 本番環境と同じに近いマシンスペッいマシンスに埋め込むペック – Java 11, 15 + ZGC ● 実アプリ、実ワーアプリ、実アプリ、実ワーワークロードを使う場合のみ再現して評価して評価 – LINEのメッセンジャーメッセンジャーのメッセンジャーと不整合あるテーブルのメッセンジャーワークロード

Slide 20

Slide 20 text

Shadow hbase requests RPC Response JDK8+G1GC App Server 本番環境と同じ HBase client

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

Shadow hbase requests Request count ● 本番環境と同じ ● テスに埋め込むト用環境と同じ

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

JVM STWが10ms以下でもでも 各アプリケーショアプリケーションがスに埋め込むレッドが詰まらないというまらないと不整合いう場合のみわけ ではない

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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を使う場合のみ非同じ期にに

Slide 32

Slide 32 text

HBaseレスに埋め込むポンスに埋め込むタイム(Java 15, ZGC) ※通常のワークロードのメッセンジャーワークロードのメッセンジャー3倍 60ms 110ms 非表示

Slide 33

Slide 33 text

Response Time & JVM Pause 1.3ms 0.0ms

Slide 34

Slide 34 text

Response Time & JVM Pause

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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)

Slide 37

Slide 37 text

Load barrier Object o = obj.field; // Use o ● ポインタのメッセンジャー状態によってによってapp threadで処理をするを使う場合のみする – Mark: 未mark mark ⇒mark – Relocate/remap: 未relocate/remap relocate/remap ⇒mark

Slide 38

Slide 38 text

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