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

Evaluating ZGC with HBase

Evaluating ZGC with HBase

2019/11/23
JJUG CCC 2019 Fall
#ccc_m6

LINE Developers

November 23, 2019
Tweet

More Decks by LINE Developers

Other Decks in Technology

Transcript

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

    View full-size slide

  2. 自己紹介

    Shinya Yoshida

    開発1センター 開発開発1室 開発Z Part 開発HBase Unit
    server
    Z Part
    Other services

    View full-size slide

  3. コンテンツ

    Garbage CollectorとZGC

    ZGC+HBaseの評価評価
    – YCSB
    – 本番環境のリクエストの評価リクエスト

    View full-size slide

  4. Garbage Collector

    メモリ空間から不要なオブから不要なオブジェ不要なオブジェクトなオブジェクトをオブジェクトを除去する除去するする
    – 適切に除去するために除去するために除去するするために除去するためにアプリケーションを除去する止める必要める必要なオブジェクト

    Stop The World(STW)

    回収方法

    メモリ分割(世代分け、リージョン分けリージョン分け)
    – 今回は時間の都合で話時間から不要なオブの評価都合で話さないで話さない話さないさなオブジェクトをい

    View full-size slide

  5. HBaseとGC

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

    View full-size slide

  6. GC=ごみ収集収集/掃除

    View full-size slide

  7. ごみ収集収集/掃除

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

    View full-size slide

  8. GCアルゴリズム(回収方法)

    参照されていないされていなオブジェクトをい
    オブジェクト(ゴミを見つける)を除去する見つけるつける

    参照されていないカウント

    Mark

    Sweep/Compaction
    – ゴミを見つけるを除去する削除して、リージョン分け空間から不要なオブを除去する整理する

    Copy(Relocate)
    – 参照されていないされているオブジェクトを除去する
    別の場所に移すの評価場所に移すに除去するために移すす
    – Markと同時に除去するためにする場合で話さないと
    別の場所に移す々に行う場合があに除去するために行う場合があるう場合がある場合で話さないがある

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  11. STW

    なオブジェクトをぜSTWが必要なオブジェクトか
    – 安全性(Must):ゴミ以外を回収ゴミを見つける以外を回収しないを除去する回収しなオブジェクトをい
    – 完全性(Option):ゴミ以外を回収ゴミを見つけるを除去するすべて回収しきる

    STW時間から不要なオブは時間の都合で話アルゴリズムに除去するためによる
    – アプリケーションの評価並行う場合がある性
    – どれぐら不要なオブジェい止める必要めなオブジェクトをいといけなオブジェクトをいか
    – 何に比例して増えに除去するために比例して増えるかして増えるかえるか

    View full-size slide

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

    View full-size slide

  13. ZGC

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

    View full-size slide

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

    View full-size slide

  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)

    View full-size slide

  16. GCの評価選択

    View full-size slide

  17. GCを除去する選ぶに除去するためには時間の都合で話

    GCの評価特性(得意な部分、苦手ななオブジェクトを部分、リージョン分け苦手な部分なオブジェクトを部分)を除去する知るる

    アプリケーションの評価特性/ハードウェアを除去する考えるえる

    最も良さげなも良さげな良さげなさげなオブジェクトをGCを除去する選ぶ

    View full-size slide

  18. GCの評価特性

    スループット?応答時間から不要なオブ?(STW時間から不要なオブ)

    CPUコア数に比例

    メモリサイズ

    ライブオブジェクト率

    オブジェクトサイズ

    なオブジェクトをどなオブジェクトをど

    View full-size slide

  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

    View full-size slide

  20. 僕達のの評価HBaseは時間の都合で話・・・?

    レスポンスタイムが大事

    いっぱいメモリを除去する使ってキャッシュってキャッシュしたいしたい

    CPUリソース余りがち
    – SQLは時間の都合で話無いい
    – シンプルなオブジェクトをGet/Scan/Put/Delete
    – IOとNetworkがほとんど

    スループット/1台はそんなに大事は時間の都合で話そんなオブジェクトをに除去するために大事じゃなオブジェクトをい
    – スケールアウト前提
    – ディスクとかメモリとかの評価ほう場合があるが厳しいしい
    マシンスペック例して増えるか

    CPU: 40コア

    メモリ: 256GB

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

  23. Evaluate ZGC with HBase
    By YCSB
    Using production requests

    View full-size slide

  24. YSCBで話さない評価

    テストクラスタで話さないHBase1.2.5+αを除去する構築

    Java11-eaで話さない動くかす (2018年8月実施のための評価ため)

    ZGCを除去する有効にするに除去するためにする

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

    View full-size slide

  25. STW時間から不要なオブ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  32. RPC
    Response
    JDK8+G1GC
    App
    Server

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  38. 大きなオブジェクトをオブジェクトの評価割当てはめるに除去するために弱い?い?
    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;
    }

    View full-size slide

  39. Demo

    ↑G1GC

    ↓ZGC

    View full-size slide

  40. PageとLargePage

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

    LargePage
    – 2MB (環境のリクエスト依存)
    – Page Flushの評価オーバヘッドが小さくなる?さくなオブジェクトをる?

    View full-size slide

  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

    View full-size slide

  42. Demo

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

    View full-size slide

  43. HBase Reponse Time with ZGC + LP

    緑: ZGC

    青: G1GC
    300 ms
    JVM Pause Time (緑: G1GC)

    View full-size slide

  44. まとめ

    Javaに除去するために新しいしいGCが!
    – ZGC、リージョン分けShenandoah: まだExperimental
    – ちゃんと特性を除去する分かって選ぶことが大事

    本番環境のリクエストの評価HBaseに除去するためにZGCを除去する適用する?する前に除去するために、リージョン分け
    本番環境のリクエストに除去するために来るリクエストをるリクエストを除去する再現して評価して評価

    Low JVM Pause != Low Response Time
    – LargePage使ってキャッシュう場合があると概ね良くなるね良くなる良さげなくなオブジェクトをる
    – Response Timeがより良さげなくなオブジェクトをるよう場合があるに除去するために更に調査に除去するために調査

    View full-size slide