Slide 1

Slide 1 text

Evaluating ZGC with HBase LINE Corporation Shinya Yoshida 2019/11/23 JJUG CCC 2019 Fall #ccc_m6

Slide 2

Slide 2 text

自己紹介 ● Shinya Yoshida ● 開発1センター 開発開発1室 開発Z Part 開発HBase Unit server Z Part Other services

Slide 3

Slide 3 text

コンテンツ ● Garbage CollectorとZGC ● ZGC+HBaseの評価評価 – YCSB – 本番環境のリクエストの評価リクエスト

Slide 4

Slide 4 text

Garbage Collector ● メモリ空間から不要なオブから不要なオブジェ不要なオブジェクトなオブジェクトをオブジェクトを除去する除去するする – 適切に除去するために除去するために除去するするために除去するためにアプリケーションを除去する止める必要める必要なオブジェクト ● Stop The World(STW) ● 回収方法 ● メモリ分割(世代分け、リージョン分けリージョン分け) – 今回は時間の都合で話時間から不要なオブの評価都合で話さないで話さない話さないさなオブジェクトをい

Slide 5

Slide 5 text

HBaseとGC ● HBase = JVM上で動くで話さない動くくNoSQL – STW by GC Response time Service ⇒ Respon ⇒ Respon ↑JVM Pause Time ↓HBase Response time

Slide 6

Slide 6 text

GC=ごみ収集収集/掃除

Slide 7

Slide 7 text

ごみ収集収集/掃除 ● ゴミを見つけるを除去する見つけるつける ● ゴミを見つけるを除去する回収して、リージョン分け空間から不要なオブを除去する 整理するする

Slide 8

Slide 8 text

GCアルゴリズム(回収方法) ● 参照されていないされていなオブジェクトをい オブジェクト(ゴミを見つける)を除去する見つけるつける ● 参照されていないカウント ● Mark ● Sweep/Compaction – ゴミを見つけるを除去する削除して、リージョン分け空間から不要なオブを除去する整理する ● Copy(Relocate) – 参照されていないされているオブジェクトを除去する 別の場所に移すの評価場所に移すに除去するために移すす – Markと同時に除去するためにする場合で話さないと 別の場所に移す々に行う場合があに除去するために行う場合があるう場合がある場合で話さないがある

Slide 9

Slide 9 text

フラグメンテーション がおきる アドレスが変わるわる アドレスが変わるわる 空間から不要なオブが余分に除去するために必要なオブジェクト Sweep/Compaction Copy

Slide 10

Slide 10 text

Javaの評価GC GCアルゴリズム 回収方法 Young GC Sequential/Parallel Copy Old GC Sequential/Parallel Sweep&Compact Concurrent Mark & Sweep (Deprecated) Sweep G1GC Copy ZGC(Java11, Experimental) Copy Shenandoah(Java12, Experimental) Copy

Slide 11

Slide 11 text

STW ● なオブジェクトをぜSTWが必要なオブジェクトか – 安全性(Must):ゴミ以外を回収ゴミを見つける以外を回収しないを除去する回収しなオブジェクトをい – 完全性(Option):ゴミ以外を回収ゴミを見つけるを除去するすべて回収しきる ● STW時間から不要なオブは時間の都合で話アルゴリズムに除去するためによる – アプリケーションの評価並行う場合がある性 – どれぐら不要なオブジェい止める必要めなオブジェクトをいといけなオブジェクトをいか – 何に比例して増えに除去するために比例して増えるかして増えるかえるか

Slide 12

Slide 12 text

GCアルゴリズムの評価STW時間から不要なオブ GCアルゴリズム Mark 回収 Old GC Sequential Parallel CMS(Deprecated) いつかFullGCが起きる可能性大きる可能性大 G1GC 実行う場合がある中にアドレスが変に除去するためにアドレスが変わるわると大変わる ただし、リージョン分けSTW時間から不要なオブは時間の都合で話制御可能 アプリケーションスレッド実行う場合がある中にアドレスが変 アプリケーションスレッドSTW GC実行う場合がある

Slide 13

Slide 13 text

ZGC ● Ultra low pause time GC – 各STW時間から不要なオブを除去する絶対にに除去するために10ms以下にしたいに除去するためにしたい – Java 11で話さない導入(Experimental) 4つの評価四角が並んだあの図が並んだあの評価図が入るが入る

Slide 14

Slide 14 text

GCアルゴリズムの評価STW時間から不要なオブ (2) GCアルゴリズム Mark 回収 Old GC Sequential Parallel CMS(Deprecated) いつかFullGCが起きる可能性大きる可能性大 G1GC 実行う場合がある中にアドレスが変に除去するためにアドレスが変わるわると大変わる ただし、リージョン分けSTW時間から不要なオブは時間の都合で話制御可能 ZGC STW時間から不要なオブは時間の都合で話スレッド数に比例に除去するために比例して増えるか 各STW:10ms以下にしたい? Shenandoah 各STW:10ms以下にしたい? アプリケーションスレッド実行う場合がある中にアドレスが変 アプリケーションスレッドSTW GC実行う場合がある

Slide 15

Slide 15 text

ZGCの評価仕組みみ収集 ● アプリケーションを除去する動くかしなオブジェクトをがら不要なオブジェ、リージョン分けオブジェクトの評価アドレスを除去する 変わるえる仕組みみ収集 ● JJUG CCC 2018 Springで話さないあった発表を見てくださいを除去する見つけるてください – https://speakerdeck.com/yokotaso/ introduction-to-modern-gc – https://blog.cybozu.io/entry/ 2018/05/29/080000 – By @yokotaso(Cybozu)

Slide 16

Slide 16 text

GCの評価選択

Slide 17

Slide 17 text

GCを除去する選ぶに除去するためには時間の都合で話 ● GCの評価特性(得意な部分、苦手ななオブジェクトを部分、リージョン分け苦手な部分なオブジェクトを部分)を除去する知るる ● アプリケーションの評価特性/ハードウェアを除去する考えるえる ● 最も良さげなも良さげな良さげなさげなオブジェクトをGCを除去する選ぶ

Slide 18

Slide 18 text

GCの評価特性 ● スループット?応答時間から不要なオブ?(STW時間から不要なオブ) ● CPUコア数に比例 ● メモリサイズ ● ライブオブジェクト率 ● オブジェクトサイズ ● なオブジェクトをどなオブジェクトをど

Slide 19

Slide 19 text

GCごとの評価特性 各STW時間から不要なオブ スループット 最も良さげな適なオブジェクトをCPU コア数に比例 最も良さげな適なオブジェクトをヒープ サイズ ∞ 85% 100% 1GB 8GB 512GB 8TB〜 0ms 100ms 1s 1 2 4 8 16 32+ 31GB 128GB 2TB Sequential/Parallel G1GC Shenandoah/ZGC

Slide 20

Slide 20 text

僕達のの評価HBaseは時間の都合で話・・・? ● レスポンスタイムが大事 ● いっぱいメモリを除去する使ってキャッシュってキャッシュしたいしたい ● CPUリソース余りがち – SQLは時間の都合で話無いい – シンプルなオブジェクトをGet/Scan/Put/Delete – IOとNetworkがほとんど ● スループット/1台はそんなに大事は時間の都合で話そんなオブジェクトをに除去するために大事じゃなオブジェクトをい – スケールアウト前提 – ディスクとかメモリとかの評価ほう場合があるが厳しいしい マシンスペック例して増えるか ● CPU: 40コア ● メモリ: 256GB

Slide 21

Slide 21 text

GCごとの評価特性に除去するために当てはめるては時間の都合で話める 各STW時間から不要なオブ スループット 最も良さげな適なオブジェクトをCPU コア数に比例 最も良さげな適なオブジェクトをヒープ サイズ ∞ 85% 100% 1GB 8GB 512GB 8TB〜 0ms 100ms 1s 1 2 4 8 16 32+ 31GB 128GB 2TB Sequential/Parallel G1GC Shenandoah/ZGC

Slide 22

Slide 22 text

HBaseに除去するためには時間の都合で話ZGCが良さげなさそう場合がある! (Shenandoahで話さないも良さげな良さげないかも良さげなしれなオブジェクトをい)

Slide 23

Slide 23 text

Evaluate ZGC with HBase By YCSB Using production requests

Slide 24

Slide 24 text

YSCBで話さない評価 ● テストクラスタで話さないHBase1.2.5+αを除去する構築 ● Java11-eaで話さない動くかす (2018年8月実施のための評価ため) ● ZGCを除去する有効にするに除去するためにする ● ベンチマークツールYCSBで話さない評価 – リンク入れる – STW時間から不要なオブとslow responseの評価時間から不要なオブ、リージョン分けスループット – 比較として今使ってとして今使ってキャッシュっているG1GCも良さげな

Slide 25

Slide 25 text

STW時間から不要なオブ

Slide 26

Slide 26 text

レスポンスタイム G1GC ZGC Slow Response閾値 35ms

Slide 27

Slide 27 text

結果(スループット) Higher value (Bold) is better

Slide 28

Slide 28 text

なオブジェクトをんか良さげなさげなオブジェクトをの評価で話さない 本番に除去するために適用する?する?

Slide 29

Slide 29 text

そんなオブジェクトを簡単にはできないに除去するためには時間の都合で話で話さないきなオブジェクトをい

Slide 30

Slide 30 text

Java11≦で話さない動くかす(今は時間の都合で話Java8) ZGC(Experimental機能)を除去する有効にするに除去するためにする YSCBの評価ワークロードは時間の都合で話あくまで話さない仮想

Slide 31

Slide 31 text

本番環境のリクエストの評価リクエストと 同じリクエストで話さない試したいしたい

Slide 32

Slide 32 text

RPC Response JDK8+G1GC App Server

Slide 33

Slide 33 text

RPC Response JDK8+G1GC Consumer RPC Info JDK13.0.1+ZGC JDK8+G1GC RPC Response App Server hbase-shadows

Slide 34

Slide 34 text

RPC Response JDK8+G1GC Consumer RPC Info JDK13.0.1+ZGC JDK8+G1GC RPC*3 Response App Server hbase-shadows

Slide 35

Slide 35 text

JVM Pause Time ↑JVM Pause Time – HOST_A: ZGC – HOST_B (Green plot): G1GC 100ms

Slide 36

Slide 36 text

HBaseレスポンスタイム(ms)は時間の都合で話? ↑G1GC ↓ZGC(ピンク、リージョン分け紫) 1,200 400 350 100

Slide 37

Slide 37 text

GCログを除去する読むとむと [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.077+0900][139132][info][gc,heap ] Page Cache Flushed: 32M requested, 32M(77194M->77162M) flushed [2019-10-17T16:51:42.082+0900][139132][info][gc,heap ] Page Cache Flushed: 32M requested, 32M(77162M->77130M) flushed [2019-10-17T16:51:42.086+0900][139132][info][gc,heap ] Page Cache Flushed: 32M requested, 32M(77130M->77098M) flushed [2019-10-17T16:51:42.091+0900][139132][info][gc,heap ] Page Cache Flushed: 32M requested, 32M(77098M->77066M) flushed [2019-10-17T16:51:42.095+0900][139132][info][gc,heap ] Page Cache Flushed: 32M requested, 32M(77066M->77034M) flushed ... [2019-10-17T16:51:42.729+0900][139132][info][gc,heap ] Page Cache Flushed: 32M requested, 32M(72548M->72516M) flushed [2019-10-17T16:51:42.734+0900][139132][info][gc,heap ] Page Cache Flushed: 32M requested, 32M(72516M->72484M) flushed [2019-10-17T16:51:42.739+0900][139132][info][gc,heap ] Page Cache Flushed: 32M requested, 32M(72484M->72452M) flushed [2019-10-17T16:51:42.745+0900][139132][info][gc,heap ] Page Cache Flushed: 32M requested, 32M(72452M->72420M) flushed [2019-10-17T16:51:42.749+0900][139132][info][gc,heap ] Page Cache Flushed: 32M requested, 32M(72420M->72388M) flushed [2019-10-17T16:51:42.755+0900][139132][info][gc,heap ] Page Cache Flushed: 32M requested, 32M(72388M->72356M) 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 38

Slide 38 text

大きなオブジェクトをオブジェクトの評価割当てはめるに除去するために弱い?い? List sizes = asList( 512, kb(1), kb(10), kb(50), kb(500), mb(1), mb(10), mb(20), mb(30)); for (int i = 0; i < 20; i++) { new Thread(() -> { while (true) { int size = takeRandom(sizes); long[] nanos = allocate(size, 50); sort(nanos); long maxMs = NANOSECONDS.toMillis(nanos[49]); if (maxMs > 100) { loggingTop20(size, nanos); } sleep(10); } }).start(); } long[] allocate(int nBytes, int nTimes) { long[] nanos = new long[nTimes]; for (int i = 0; i < nTimes; i++) { long start = nanoTime(); BLACKHOLE.accept(new byte[nBytes]); nanos[i] = nanoTime() - start; } return nanos; }

Slide 39

Slide 39 text

Demo ● ↑G1GC ● ↓ZGC

Slide 40

Slide 40 text

PageとLargePage ● 1Page=4KB (環境のリクエスト依存) – 30MB分の評価Page = 7000 Page以上で動く ● LargePage – 2MB (環境のリクエスト依存) – Page Flushの評価オーバヘッドが小さくなる?さくなオブジェクトをる?

Slide 41

Slide 41 text

Use LargePage from ZGC ● # echo 65,536 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages – 65,536 = 128GB (ヒープサイズ+α) / 2MB) / 2MB (Linuxの評価LargePageサイズ) ● # mkdir /hugepages ● # mount -t hugetlbfs -o uid=123 nodev /hugepages ● $ java … -XX:+UseLargePages -XX:Zpath=/hugepages … ● https://wiki.openjdk.java.net/display/zgc/Main#Main-Enablin gLargePagesOnLinux

Slide 42

Slide 42 text

Demo ● LargePageを除去する有効にするに除去するためにしてみ収集る

Slide 43

Slide 43 text

HBase Reponse Time with ZGC + LP ● 緑: ZGC ● 青: G1GC 300 ms JVM Pause Time (緑: G1GC)

Slide 44

Slide 44 text

まとめ ● Javaに除去するために新しいしいGCが! – ZGC、リージョン分けShenandoah: まだExperimental – ちゃんと特性を除去する分かって選ぶことが大事 ● 本番環境のリクエストの評価HBaseに除去するためにZGCを除去する適用する?する前に除去するために、リージョン分け 本番環境のリクエストに除去するために来るリクエストをるリクエストを除去する再現して評価して評価 ● Low JVM Pause != Low Response Time – LargePage使ってキャッシュう場合があると概ね良くなるね良くなる良さげなくなオブジェクトをる – Response Timeがより良さげなくなオブジェクトをるよう場合があるに除去するために更に調査に除去するために調査