Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Evaluating ZGC with HBase
LINE Developers
PRO
November 23, 2019
Technology
3
3.9k
Evaluating ZGC with HBase
2019/11/23
JJUG CCC 2019 Fall
#ccc_m6
LINE Developers
PRO
November 23, 2019
Tweet
Share
More Decks by LINE Developers
See All by LINE Developers
LINEポイントクラブにおける PerlからKotlinへの移行を振り返る / The migration from Perl to Kotlin at LINE Point Club
line_developers
PRO
0
190
Server-side Kotlin in LINE Messaging API
line_developers
PRO
0
190
LIFF Deep Dive 2022
line_developers
PRO
1
810
LINEのData Platform室が実践する大規模分散環境のCapacity Planning
line_developers
PRO
0
900
LINEスタンプの実例紹介 小さく始める障害検知・対応・振り返りの 改善プラクティス
line_developers
PRO
3
2k
読者のことを考えて書いてみよう / Write with your reader in mind
line_developers
PRO
3
380
登壇者をどうやって確保するのか問題
line_developers
PRO
1
190
Machine Learning at LINE
line_developers
PRO
2
230
自分が書いた文章をレビューしてもらうときの心構え / Readiness for having your writing reviewed
line_developers
PRO
3
470
Other Decks in Technology
See All in Technology
Oracle Database Technology Night #55 Oracle Autonomous Database 再入門
oracle4engineer
PRO
1
140
セマフォでタスクの同時実行数制限
hankehly
0
110
失敗から学ぶAWSコスト管理入門 ~想定の50倍以上の請求がきた話~
msato
0
470
Building smarter apps with machine learning, from magic to reality
picardparis
4
3.1k
Spotify物理コントローラーがほしい
miso
0
180
[SRE NEXT 2022]メルカリグループにおけるSREs
srenext
0
600
ヘキサゴナルアーキテクチャを利用したLambda 関数のドメインモデルの実装 Live
fatsushi
3
680
[SRE NEXT 2022]KaaS桶狭間の戦い 〜Yahoo! JAPANのSLI/SLOを用いた統合監視〜
srenext
0
680
プログラミング未経験の学生をエンジニアにしてきたノウハウを公開
shinofumijp
0
210
⚡Lightdashを試してみた
k_data_analyst
0
220
モダンデータスタックとかの話(データエンジニアのお仕事とは)
foursue
0
500
E2E自動テスト導入・運用をめぐる先入観と実際に起きたこと / Preconceptions and What Happened with E2E Testing
ak1210
5
1.4k
Featured
See All Featured
Building Applications with DynamoDB
mza
83
4.6k
Testing 201, or: Great Expectations
jmmastey
21
5.4k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
224
49k
Designing on Purpose - Digital PM Summit 2013
jponch
106
5.6k
Why You Should Never Use an ORM
jnunemaker
PRO
47
5.6k
No one is an island. Learnings from fostering a developers community.
thoeni
9
1.1k
Web Components: a chance to create the future
zenorocha
303
40k
What's in a price? How to price your products and services
michaelherold
229
9.3k
Intergalactic Javascript Robots from Outer Space
tanoku
261
25k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
181
15k
Git: the NoSQL Database
bkeepers
PRO
415
59k
The Cult of Friendly URLs
andyhume
68
4.7k
Transcript
Evaluating ZGC with HBase LINE Corporation Shinya Yoshida 2019/11/23 JJUG
CCC 2019 Fall #ccc_m6
自己紹介 • Shinya Yoshida • 開発1センター 開発開発1室 開発Z Part 開発HBase Unit server Z
Part Other services
コンテンツ • Garbage CollectorとZGC • ZGC+HBaseの評価評価 – YCSB – 本番環境のリクエストの評価リクエスト
Garbage Collector • メモリ空間から不要なオブから不要なオブジェ不要なオブジェクトなオブジェクトをオブジェクトを除去する除去するする – 適切に除去するために除去するために除去するするために除去するためにアプリケーションを除去する止める必要める必要なオブジェクト • Stop The World(STW)
• 回収方法 • メモリ分割(世代分け、リージョン分けリージョン分け) – 今回は時間の都合で話時間から不要なオブの評価都合で話さないで話さない話さないさなオブジェクトをい
HBaseとGC • HBase = JVM上で動くで話さない動くくNoSQL – STW by GC Response
time Service ⇒ Respon ⇒ Respon ↑JVM Pause Time ↓HBase Response time
GC=ごみ収集収集/掃除
ごみ収集収集/掃除 • ゴミを見つけるを除去する見つけるつける • ゴミを見つけるを除去する回収して、リージョン分け空間から不要なオブを除去する 整理するする
GCアルゴリズム(回収方法) • 参照されていないされていなオブジェクトをい オブジェクト(ゴミを見つける)を除去する見つけるつける • 参照されていないカウント • Mark • Sweep/Compaction
– ゴミを見つけるを除去する削除して、リージョン分け空間から不要なオブを除去する整理する • Copy(Relocate) – 参照されていないされているオブジェクトを除去する 別の場所に移すの評価場所に移すに除去するために移すす – Markと同時に除去するためにする場合で話さないと 別の場所に移す々に行う場合があに除去するために行う場合があるう場合がある場合で話さないがある
フラグメンテーション がおきる アドレスが変わるわる アドレスが変わるわる 空間から不要なオブが余分に除去するために必要なオブジェクト Sweep/Compaction Copy
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
STW • なオブジェクトをぜSTWが必要なオブジェクトか – 安全性(Must):ゴミ以外を回収ゴミを見つける以外を回収しないを除去する回収しなオブジェクトをい – 完全性(Option):ゴミ以外を回収ゴミを見つけるを除去するすべて回収しきる • STW時間から不要なオブは時間の都合で話アルゴリズムに除去するためによる –
アプリケーションの評価並行う場合がある性 – どれぐら不要なオブジェい止める必要めなオブジェクトをいといけなオブジェクトをいか – 何に比例して増えに除去するために比例して増えるかして増えるかえるか
GCアルゴリズムの評価STW時間から不要なオブ GCアルゴリズム Mark 回収 Old GC Sequential Parallel CMS(Deprecated) いつかFullGCが起きる可能性大きる可能性大
G1GC 実行う場合がある中にアドレスが変に除去するためにアドレスが変わるわると大変わる ただし、リージョン分けSTW時間から不要なオブは時間の都合で話制御可能 アプリケーションスレッド実行う場合がある中にアドレスが変 アプリケーションスレッドSTW GC実行う場合がある
ZGC • Ultra low pause time GC – 各STW時間から不要なオブを除去する絶対にに除去するために10ms以下にしたいに除去するためにしたい –
Java 11で話さない導入(Experimental) 4つの評価四角が並んだあの図が並んだあの評価図が入るが入る
GCアルゴリズムの評価STW時間から不要なオブ (2) GCアルゴリズム Mark 回収 Old GC Sequential Parallel CMS(Deprecated)
いつかFullGCが起きる可能性大きる可能性大 G1GC 実行う場合がある中にアドレスが変に除去するためにアドレスが変わるわると大変わる ただし、リージョン分けSTW時間から不要なオブは時間の都合で話制御可能 ZGC STW時間から不要なオブは時間の都合で話スレッド数に比例に除去するために比例して増えるか 各STW:10ms以下にしたい? Shenandoah 各STW:10ms以下にしたい? アプリケーションスレッド実行う場合がある中にアドレスが変 アプリケーションスレッドSTW GC実行う場合がある
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)
GCの評価選択
GCを除去する選ぶに除去するためには時間の都合で話 • GCの評価特性(得意な部分、苦手ななオブジェクトを部分、リージョン分け苦手な部分なオブジェクトを部分)を除去する知るる • アプリケーションの評価特性/ハードウェアを除去する考えるえる • 最も良さげなも良さげな良さげなさげなオブジェクトをGCを除去する選ぶ
GCの評価特性 • スループット?応答時間から不要なオブ?(STW時間から不要なオブ) • CPUコア数に比例 • メモリサイズ • ライブオブジェクト率 •
オブジェクトサイズ • なオブジェクトをどなオブジェクトをど
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
僕達のの評価HBaseは時間の都合で話・・・? • レスポンスタイムが大事 • いっぱいメモリを除去する使ってキャッシュってキャッシュしたいしたい • CPUリソース余りがち – SQLは時間の都合で話無いい –
シンプルなオブジェクトをGet/Scan/Put/Delete – IOとNetworkがほとんど • スループット/1台はそんなに大事は時間の都合で話そんなオブジェクトをに除去するために大事じゃなオブジェクトをい – スケールアウト前提 – ディスクとかメモリとかの評価ほう場合があるが厳しいしい マシンスペック例して増えるか • CPU: 40コア • メモリ: 256GB
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
HBaseに除去するためには時間の都合で話ZGCが良さげなさそう場合がある! (Shenandoahで話さないも良さげな良さげないかも良さげなしれなオブジェクトをい)
Evaluate ZGC with HBase By YCSB Using production requests
YSCBで話さない評価 • テストクラスタで話さないHBase1.2.5+αを除去する構築 • Java11-eaで話さない動くかす (2018年8月実施のための評価ため) • ZGCを除去する有効にするに除去するためにする • ベンチマークツールYCSBで話さない評価
– リンク入れる – STW時間から不要なオブとslow responseの評価時間から不要なオブ、リージョン分けスループット – 比較として今使ってとして今使ってキャッシュっているG1GCも良さげな
STW時間から不要なオブ
レスポンスタイム G1GC ZGC Slow Response閾値 35ms
結果(スループット) Higher value (Bold) is better
なオブジェクトをんか良さげなさげなオブジェクトをの評価で話さない 本番に除去するために適用する?する?
そんなオブジェクトを簡単にはできないに除去するためには時間の都合で話で話さないきなオブジェクトをい
Java11≦で話さない動くかす(今は時間の都合で話Java8) ZGC(Experimental機能)を除去する有効にするに除去するためにする YSCBの評価ワークロードは時間の都合で話あくまで話さない仮想
本番環境のリクエストの評価リクエストと 同じリクエストで話さない試したいしたい
RPC Response JDK8+G1GC App Server
RPC Response JDK8+G1GC Consumer RPC Info JDK13.0.1+ZGC JDK8+G1GC RPC Response
App Server hbase-shadows
RPC Response JDK8+G1GC Consumer RPC Info JDK13.0.1+ZGC JDK8+G1GC RPC*3 Response
App Server hbase-shadows
JVM Pause Time ↑JVM Pause Time – HOST_A: ZGC –
HOST_B (Green plot): G1GC 100ms
HBaseレスポンスタイム(ms)は時間の都合で話? ↑G1GC ↓ZGC(ピンク、リージョン分け紫) 1,200 400 350 100
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
大きなオブジェクトをオブジェクトの評価割当てはめるに除去するために弱い?い? 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; }
Demo • ↑G1GC • ↓ZGC
PageとLargePage • 1Page=4KB (環境のリクエスト依存) – 30MB分の評価Page = 7000 Page以上で動く •
LargePage – 2MB (環境のリクエスト依存) – Page Flushの評価オーバヘッドが小さくなる?さくなオブジェクトをる?
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
Demo • LargePageを除去する有効にするに除去するためにしてみ収集る
HBase Reponse Time with ZGC + LP • 緑: ZGC
• 青: G1GC 300 ms JVM Pause Time (緑: G1GC)
まとめ • Javaに除去するために新しいしいGCが! – ZGC、リージョン分けShenandoah: まだExperimental – ちゃんと特性を除去する分かって選ぶことが大事 • 本番環境のリクエストの評価HBaseに除去するためにZGCを除去する適用する?する前に除去するために、リージョン分け
本番環境のリクエストに除去するために来るリクエストをるリクエストを除去する再現して評価して評価 • Low JVM Pause != Low Response Time – LargePage使ってキャッシュう場合があると概ね良くなるね良くなる良さげなくなオブジェクトをる – Response Timeがより良さげなくなオブジェクトをるよう場合があるに除去するために更に調査に除去するために調査