Pro Yearly is on sale from $80 to $50! »

Evaluating ZGC with HBase

Evaluating ZGC with HBase

2019/11/23
JJUG CCC 2019 Fall
#ccc_m6

53850955f15249a1a9dc49df6113e400?s=128

LINE Developers

November 23, 2019
Tweet

Transcript

  1. Evaluating ZGC with HBase LINE Corporation Shinya Yoshida 2019/11/23 JJUG

    CCC 2019 Fall #ccc_m6
  2. 自己紹介 • Shinya Yoshida • 開発1センター 開発開発1室 開発Z Part 開発HBase Unit server Z

    Part Other services
  3. コンテンツ • Garbage CollectorとZGC • ZGC+HBaseの評価評価 – YCSB – 本番環境のリクエストの評価リクエスト

  4. Garbage Collector • メモリ空間から不要なオブから不要なオブジェ不要なオブジェクトなオブジェクトをオブジェクトを除去する除去するする – 適切に除去するために除去するために除去するするために除去するためにアプリケーションを除去する止める必要める必要なオブジェクト • Stop The World(STW)

    • 回収方法 • メモリ分割(世代分け、リージョン分けリージョン分け) – 今回は時間の都合で話時間から不要なオブの評価都合で話さないで話さない話さないさなオブジェクトをい
  5. HBaseとGC • HBase = JVM上で動くで話さない動くくNoSQL – STW by GC Response

    time Service ⇒ Respon ⇒ Respon ↑JVM Pause Time ↓HBase Response time
  6. GC=ごみ収集収集/掃除

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

  8. GCアルゴリズム(回収方法) • 参照されていないされていなオブジェクトをい オブジェクト(ゴミを見つける)を除去する見つけるつける • 参照されていないカウント • Mark • Sweep/Compaction

    – ゴミを見つけるを除去する削除して、リージョン分け空間から不要なオブを除去する整理する • Copy(Relocate) – 参照されていないされているオブジェクトを除去する 別の場所に移すの評価場所に移すに除去するために移すす – Markと同時に除去するためにする場合で話さないと 別の場所に移す々に行う場合があに除去するために行う場合があるう場合がある場合で話さないがある
  9. フラグメンテーション がおきる アドレスが変わるわる アドレスが変わるわる 空間から不要なオブが余分に除去するために必要なオブジェクト Sweep/Compaction Copy

  10. 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
  11. STW • なオブジェクトをぜSTWが必要なオブジェクトか – 安全性(Must):ゴミ以外を回収ゴミを見つける以外を回収しないを除去する回収しなオブジェクトをい – 完全性(Option):ゴミ以外を回収ゴミを見つけるを除去するすべて回収しきる • STW時間から不要なオブは時間の都合で話アルゴリズムに除去するためによる –

    アプリケーションの評価並行う場合がある性 – どれぐら不要なオブジェい止める必要めなオブジェクトをいといけなオブジェクトをいか – 何に比例して増えに除去するために比例して増えるかして増えるかえるか
  12. GCアルゴリズムの評価STW時間から不要なオブ GCアルゴリズム Mark 回収 Old GC Sequential Parallel CMS(Deprecated) いつかFullGCが起きる可能性大きる可能性大

    G1GC 実行う場合がある中にアドレスが変に除去するためにアドレスが変わるわると大変わる ただし、リージョン分けSTW時間から不要なオブは時間の都合で話制御可能 アプリケーションスレッド実行う場合がある中にアドレスが変 アプリケーションスレッドSTW GC実行う場合がある
  13. ZGC • Ultra low pause time GC – 各STW時間から不要なオブを除去する絶対にに除去するために10ms以下にしたいに除去するためにしたい –

    Java 11で話さない導入(Experimental) 4つの評価四角が並んだあの図が並んだあの評価図が入るが入る
  14. GCアルゴリズムの評価STW時間から不要なオブ (2) GCアルゴリズム Mark 回収 Old GC Sequential Parallel CMS(Deprecated)

    いつかFullGCが起きる可能性大きる可能性大 G1GC 実行う場合がある中にアドレスが変に除去するためにアドレスが変わるわると大変わる ただし、リージョン分けSTW時間から不要なオブは時間の都合で話制御可能 ZGC STW時間から不要なオブは時間の都合で話スレッド数に比例に除去するために比例して増えるか 各STW:10ms以下にしたい? Shenandoah 各STW:10ms以下にしたい? アプリケーションスレッド実行う場合がある中にアドレスが変 アプリケーションスレッドSTW GC実行う場合がある
  15. 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)
  16. GCの評価選択

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

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

    オブジェクトサイズ • なオブジェクトをどなオブジェクトをど
  19. 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
  20. 僕達のの評価HBaseは時間の都合で話・・・? • レスポンスタイムが大事 • いっぱいメモリを除去する使ってキャッシュってキャッシュしたいしたい • CPUリソース余りがち – SQLは時間の都合で話無いい –

    シンプルなオブジェクトをGet/Scan/Put/Delete – IOとNetworkがほとんど • スループット/1台はそんなに大事は時間の都合で話そんなオブジェクトをに除去するために大事じゃなオブジェクトをい – スケールアウト前提 – ディスクとかメモリとかの評価ほう場合があるが厳しいしい マシンスペック例して増えるか • CPU: 40コア • メモリ: 256GB
  21. 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
  22. HBaseに除去するためには時間の都合で話ZGCが良さげなさそう場合がある! (Shenandoahで話さないも良さげな良さげないかも良さげなしれなオブジェクトをい)

  23. Evaluate ZGC with HBase By YCSB Using production requests

  24. YSCBで話さない評価 • テストクラスタで話さないHBase1.2.5+αを除去する構築 • Java11-eaで話さない動くかす (2018年8月実施のための評価ため) • ZGCを除去する有効にするに除去するためにする • ベンチマークツールYCSBで話さない評価

    – リンク入れる – STW時間から不要なオブとslow responseの評価時間から不要なオブ、リージョン分けスループット – 比較として今使ってとして今使ってキャッシュっているG1GCも良さげな
  25. STW時間から不要なオブ

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

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

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

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

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

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

  32. RPC Response JDK8+G1GC App Server

  33. RPC Response JDK8+G1GC Consumer RPC Info JDK13.0.1+ZGC JDK8+G1GC RPC Response

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

    App Server hbase-shadows
  35. JVM Pause Time ↑JVM Pause Time – HOST_A: ZGC –

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

  37. 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
  38. 大きなオブジェクトをオブジェクトの評価割当てはめるに除去するために弱い?い? List<Integer> 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; }
  39. Demo • ↑G1GC • ↓ZGC

  40. PageとLargePage • 1Page=4KB (環境のリクエスト依存) – 30MB分の評価Page = 7000 Page以上で動く •

    LargePage – 2MB (環境のリクエスト依存) – Page Flushの評価オーバヘッドが小さくなる?さくなオブジェクトをる?
  41. 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
  42. Demo • LargePageを除去する有効にするに除去するためにしてみ収集る

  43. HBase Reponse Time with ZGC + LP • 緑: ZGC

    • 青: G1GC 300 ms JVM Pause Time (緑: G1GC)
  44. まとめ • Javaに除去するために新しいしいGCが! – ZGC、リージョン分けShenandoah: まだExperimental – ちゃんと特性を除去する分かって選ぶことが大事 • 本番環境のリクエストの評価HBaseに除去するためにZGCを除去する適用する?する前に除去するために、リージョン分け

    本番環境のリクエストに除去するために来るリクエストをるリクエストを除去する再現して評価して評価 • Low JVM Pause != Low Response Time – LargePage使ってキャッシュう場合があると概ね良くなるね良くなる良さげなくなオブジェクトをる – Response Timeがより良さげなくなオブジェクトをるよう場合があるに除去するために更に調査に除去するために調査