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

200,000 Req/sec をさばく広告入札システムを支えるパフォーマンスチューニング術 ...

hiroisojp
December 15, 2018

200,000 Req/sec をさばく広告入札システムを支えるパフォーマンスチューニング術 #jjug_ccc #ccc_g6

JJUG CCC 2018 Fall で発表したスライドです。
(SlideShareより移行)

秒間20万リクエストをさばくWeb広告入札システム "Logicad" 開発におけるパフォーマンスチューニング術を紹介します。

私たちが日々観ているWebサイトの広告枠。それは、ページビューごとに広告を表示する権利がオークションにかけられ、自動入札によって枠の買い付けが行われ、入札額の最も高かった入札者の広告だけが表示される、という世界です。国内外の各社が最適な広告をベストな金額で入札・表示するため、日々アルゴリズムの改良やデータセットの変更などを繰り広げており、まさに技術者たちの闘いの世界と言えましょう。私たちも日々様々なコードの追加をしています。一方、そのオークションの開催期間はわずか100ミリ秒なので、その時間内に入札をしなければならないという制約があります。ゆえに、計算量とレスポンスタイムとを両立させることは、私たちにとっての絶対防衛ラインです。

Java 向けのプロファイラは世に数多ありますが、Logicad では Java 向けのツールではなく Linux 上で perf tools を用いてデータを集め、 FlameGraph を用いてアプリケーションのボトルネックを可視化・チューニングし、平均3ミリ秒のレイテンシを維持しています。

FlameGraph は、Netflix の Brendan Gregg 氏が開発したビジュアライズツールであり、perf tools の出力をグラフィカルに出力できます。ハードウェア内部の動作・OSの動作・アルゴリズムの問題などを特定し、このセッションでは Logicad 開発時に perf tools と FlameGraph を活用どのようにチューニングを行なっているか、および実際の Logicad での実例をデモでお見せします。

hiroisojp

December 15, 2018
Tweet

More Decks by hiroisojp

Other Decks in Programming

Transcript

  1. ULS Powered by Copyright © 2011-2018 UL Systems, Inc. All

    rights reserved. Proprietary & Confidential 200,000 Req/sec をさばく 広告入札システムを支えるパフォーマンスチューニング術 2018/12/15 ウルシステムズ株式会社 http://www.ulsystems.co.jp mailto:[email protected] Tel: 03-6220-1420 Fax: 03-6220-1402 #jjug_ccc #ccc_g6
  2. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 1 #jjug_ccc #ccc_g6 1. 自己紹介 2. Logicadについて 3. 広告業界におけるRTB 4. アーキテクチャ概要 5. Logicadにおける Java パフォーマンスチューニング 6. Java の外側にも目を向ける 7. まとめ 8. QA アジェンダ
  3. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 2 #jjug_ccc #ccc_g6 自己紹介 磯田 浩靖 • 所属:ウルシステムズ株式会社 • 連絡先:[email protected] • twitter:hiroisojp • 認定スクラムマスタ 山崎 良祐 • 所属:ソネット・メディア・ネットワークス株式会社 • 連絡先:[email protected] • twitter : nappa • 認定肩こりマスタ
  4. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 3 #jjug_ccc #ccc_g6 • 余談: AWS re:Invent 2018 に行ってきました – Amazon Corretto の情報はとくに得てないです – Java の父・James Gosling さんがいたらしい すぐ近くにいたはずなのに全然気づかなかった (帰宅してから twitter で知った) re:Invent & Amazon Corretto
  5. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 4 #jjug_ccc #ccc_g6 Logicadについて • お客様 – ソネット・メディア・ネットワークス株式会社 • 主な事業内容 – DSP事業 • Logicad を提供 • RTBを活用した広告配信最適化 • 機械学習・人工知能を活用したDMPによる広告配信精度の向上 • プロジェクト支援概要 – DSP/RTBシステム開発支援 – VALIS-Engine(機械学習・人工知能)開発支援 2018/11からロゴが 新しくなりました
  6. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 5 #jjug_ccc #ccc_g6 1. 自己紹介 2. Logicadについて 3. 広告業界におけるRTB 4. アーキテクチャ概要 5. Logicadにおける Java パフォーマンスチューニング 6. Java の外側にも目を向ける 7. まとめ 8. QA
  7. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 6 #jjug_ccc #ccc_g6 • 広告配信はオークション形式で実施 RTB(リアルタイムビッディング)の概要 AD WebサイトA に、XYZさんが来ました。 誰か広告を出したい方いませんか? Webサイト SSP 事業者 DSP3 DSP2 DSP1 3円 2円 1円 ID=XYZ 訪問通知 入札リクエスト &レスポンス 本日お話する のはココ
  8. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 7 #jjug_ccc #ccc_g6 • 入札に勝つと広告を表示する権利を得ることができる • 表示された広告に応じて売上が発生するビジネスモデル RTB(リアルタイムビッディング)の概要 AD WebサイトA に、XYZさんが来ました。 誰か広告を出したい方いませんか? Webサイト SSP 事業者 DSP3 DSP2 DSP1 3円 2円 1円 ID=XYZ 訪問通知 ①広告配信  リクエスト 本日お話する のはココ WIN ②広告配信レスポンス ③Webサイトに  広告表示用の  URLを設定
  9. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 8 #jjug_ccc #ccc_g6 • タイムアウトが発生するとオークションに参加できない – オークションの開催期間はわずか100ミリ秒 性能要求を満たせないと会社の存続に関わる AD WebサイトA に、XYZさんが来ました。 誰か広告を出したい方いませんか? Webサイト SSP 事業者 DSP3 DSP2 DSP1 3円 2円 1円 ID=XYZ 訪問通知 入札リクエスト &レスポンス 本日お話する のはココ タイムアウトが多く発生すると 他のDSPに権利をもっていかれて、 ビジネスとして成り立たない!
  10. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 9 #jjug_ccc #ccc_g6 スループット向上 単位時間あたりの処理能力を高めて、 よりたくさん捌く レイテンシの低減 要求〜結果が返ってくるまでの時間 をできるだけ短くする Client Server 1回あたりの処理が 高速であること 同時にたくさん 捌くことができること 悩める性能要求 Client Server Client Client タイムアウトを減らして売上を確保するためには・・・ 両方を経済合理的な範囲で最適化する
  11. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 10 #jjug_ccc #ccc_g6 ネットワークレイテンシ • ネットワークレイテンシ • 入札処理のレイテンシ – 最適な広告を選択する処理 オークションに関わるレイテンシ 入札処理のレイテンシ SSP 事業者 DSP 最大 100ミリ秒
  12. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 11 #jjug_ccc #ccc_g6 ネットワークレイテンシ • ネットワークレイテンシは一定ではない – 伝送距離の長さによって決まる 通信相手 往復時間 東京~東京 約1~2ミリ秒 東京〜大阪 約7~10ミリ秒 東京~台湾 約65ミリ秒 東京〜西海岸 約120ミリ秒 東京〜ドイツ 約210〜290ミリ秒
  13. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 12 #jjug_ccc #ccc_g6 ネットワークレイテンシ • ネットワークレイテンシは一定ではない – 伝送距離の長さによって決まる 通信相手 往復時間 東京~東京 約1~2ミリ秒 東京〜大阪 約7~10ミリ秒 東京~台湾 約65ミリ秒 東京〜西海岸 約120ミリ秒 東京〜ドイツ 約210〜290ミリ秒 ただし、オークションの開催期間はわずか100ミリ秒
  14. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 13 #jjug_ccc #ccc_g6 光速が遅い https://imgur.com/gallery/litaH
  15. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 14 #jjug_ccc #ccc_g6 ネットワークレイテンシ • 台湾と接続する場合 65ミリ 100ミリ ココから先は タイムアウトに なってしまう
  16. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 15 #jjug_ccc #ccc_g6 オークションのレイテンシ • 入札処理が加わるとさらにタイムアウトは増える – 最適化アルゴリズム(機械学習)、最適な広告入札の機能開発 によって処理時間は増えてしまう 65ミリ 100ミリ 入札処理が加わって タイムアウトになった分
  17. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 16 #jjug_ccc #ccc_g6 入札処理のレイテンシは平均3ミリ秒! • Logicadの入札処理は平均3ミリ秒! – 機能が増えてもレイテンシを短くできればタイムアウトが減らせる – 高速化が売上につながる、最適化アルゴリズムに使える時間が増える 65ミリ 100ミリ 入札処理を短くすることが できればもっとタイムアウトが 減らせる
  18. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 17 #jjug_ccc #ccc_g6 • 処理ボリューム – 約4億ユニークブラウザ – 約3,000億 req/月 • 約100億 req/日 • 約22万 req/sec (参考)Logicadの処理ボリューム 補足: 20万->22万とJJUG応募時点より増えました
  19. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 18 #jjug_ccc #ccc_g6 1. 自己紹介 2. Logicadについて 3. 広告業界におけるRTB 4. アーキテクチャ概要 5. Logicadにおける Java パフォーマンスチューニング 6. Java の外側にも目を向ける 7. まとめ 8. QA
  20. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 19 #jjug_ccc #ccc_g6 ・広告商品情報 広告に表示する文章、画像URL、 サイズなどの情報を格納 ・ユーザ情報 ・広告予算消化情報 リアルタイムに扱う情報を格納 入札サーバ Java (netty) Logicadのアーキテクチャ概要 SSP nginx 入札サーバ 入札サーバ 入札サーバ 入札サーバ 入札サーバ X X X X ・広告キャンペーン情報 事前定義、定期的にロードする 必要がある情報を格納 ・アドフラウド情報 3rd Partyから提供された 情報を格納 Aerospike (KVS) RDS Redis 広告商品 情報サーバ (gRPC)
  21. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 20 #jjug_ccc #ccc_g6 ・広告商品情報 広告に表示する文章、画像URL、 サイズなどの情報を格納 ・ユーザ情報 ・広告予算消化情報 リアルタイムに扱う情報を格納 入札サーバ Java (netty) Logicadのアーキテクチャ概要 SSP nginx 入札サーバ 入札サーバ 入札サーバ 入札サーバ 入札サーバ X X X X ・広告キャンペーン情報 事前定義、定期的にロードする 必要がある情報を格納 ・アドフラウド情報 3rd Partyから提供された 情報を格納 Aerospike (KVS) RDS Redis 広告商品 情報サーバ (gRPC) スループットを上げたい場合は スケールアウト(入札サーバを増やす)でも 一定の効果はあるがコストも増加 入札サーバ
  22. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 21 #jjug_ccc #ccc_g6 ・広告商品情報 広告に表示する文章、画像URL、 サイズなどの情報を格納 ・ユーザ情報 ・広告予算消化情報 リアルタイムに扱う情報を格納 入札サーバ Java (netty) Logicadのアーキテクチャ概要 SSP nginx 入札サーバ 入札サーバ 入札サーバ 入札サーバ 入札サーバ X X X X ・広告キャンペーン情報 事前定義、定期的にロードする 必要がある情報を格納 ・アドフラウド情報 3rd Partyから提供された 情報を格納 Aerospike (KVS) RDS Redis 広告商品 情報サーバ (gRPC) 1台あたりのレイテンシを低減させる ことができれば、スループットも向上し、コスト もスケールアウトよりかからない
  23. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 22 #jjug_ccc #ccc_g6 スループット向上 1. スケールアウト(並列化)によって実現 2. レイテンシを低減することによっても向上 レイテンシとスループット レイテンシの低減 1. サーバ1台あたりの処理高速化によって実現 入札サーバ ココの遅延 ココの処理数 SSP 入札サーバ SSP
  24. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 23 #jjug_ccc #ccc_g6 スループット向上 1. スケールアウト(並列化)によって実現 2. レイテンシを低減することによっても向上 レイテンシとスループット レイテンシの低減 1. サーバ1台あたりの処理高速化によって実現 入札サーバ ココの遅延 ココの処理数 SSP 入札サーバ SSP 3ミリ秒を維持・高速化する = パフォーマンスチューニングの主体
  25. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 24 #jjug_ccc #ccc_g6 1. 自己紹介 2. Logicadについて 3. 広告業界におけるRTB 4. アーキテクチャ概要 5. Logicadにおける Java パフォーマンスチューニング 6. FlameScope 7. Java の外側にも目を向ける 8. まとめ 9. QA
  26. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 25 #jjug_ccc #ccc_g6 • 高速化するにはホットスポットをみつけることが必要 • 場当たり的にやるのではなく、ツールやプロファイラによっ て計測して目星をつける 「推測するな、計測せよ」という格言もある • デプロイ前に必ず計測 →現状維持を目標としてまずは最適化 • 数値だけでなく、パッとみでわかる=可視化する Logicadにおけるパフォーマンスチューニング
  27. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 26 #jjug_ccc #ccc_g6 • CPU workload のホットスポットの 特定に perf と FlameGraphを利用 • FlameGraph – NetflixのBrendan Gregg氏が開発したツール – https://github.com/brendangregg/FlameGraph • JMeter – 負荷テストツール 本日詳しく話をするツール Logicadにおけるパフォーマンスチューニング
  28. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 27 #jjug_ccc #ccc_g6 perf.data perf record • FlameGraph は perf の結果をグラフ化するツール FlameGraphとperfの関係 perf script • perf – Linux向けのプロファイラ – 通常は C, C++プログラムの プロファイリングに用いる • perf-map-agent – JVMTI を使って Java メソッドと perf 出力結果との対応関係を紐 付け • FlameGraph – perf-map-agentで出力された 結果をグラフ化 7f89a84819e0 160 Ljava/lang/String;::<init> 7f89a8481d80 1e8 Ljava/lang/Class;::getModifiers 7f89a84820e0 c0 Ljava/lang/Float;::valueOf 7f89a8482400 100 Lorg/msgpack/io/LinkedBufferInput;::require テキスト perf-map-agent FlameGraphの スクリプトを用いる バイナリ
  29. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 28 #jjug_ccc #ccc_g6 • FlameGraph は perf の結果をグラフ化するツール FlameGraph
  30. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 29 #jjug_ccc #ccc_g6 • この例では CPU 時間を可視化 FlameGraph 一定時間の全体(30秒など) 全体から見た相対的な処理時間の割合 下から上に行くほど メソッドの呼び出し元になる
  31. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 30 #jjug_ccc #ccc_g6 下から上に行くほど メソッドの呼び出し先になる FlameGraphの見方 • 縦軸:メソッドコールの流れを表示
  32. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 31 #jjug_ccc #ccc_g6 • 横軸:メソッドの処理時間の割合を表示 FlameGraphの見方 あるメソッド の例 自身の処理が3〜4割程度占めているがそれ以外は他のメソッドの処理で時間がかかっている グラフ全体の処理時間全体の 占める割合も表示される String:::startsWithで2割 HashMap$KeyIterator:::nextで4割
  33. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 32 #jjug_ccc #ccc_g6 FlameGraphの見方 • 対象があらかじめわかっている場合は、正規表現検索で該当箇所 をハイライトでき、パッと探せる マッチしている箇所が紫色で ハイライトされる
  34. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 33 #jjug_ccc #ccc_g6 FlameGraphの見方について、 Logicadの実際のグラフを用いて デモでお見せします FlameGraph デモ
  35. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 34 #jjug_ccc #ccc_g6 • どのようなグラフの波形を確認すればよいのか? • A. 幅を取っているところをまず見る – 高速化できると全体に対する寄与が大きいため 全体に対して幅を取っている箇所 FlameGraphを用いてのホットスポットの発見方法
  36. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 35 #jjug_ccc #ccc_g6 • どのようなグラフの波形を確認すればよいのか? • A. 小さい幅のところは省く – 小さい幅を高速化しても全体に対する寄与が小さいため 高速化しても微々たるもの FlameGraphを用いてのホットスポットの発見方法 高速化しても微々たるもの
  37. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 36 #jjug_ccc #ccc_g6 • どのようなグラフの波形を確認すればよいのか? • A. 修正前後で比較 – 幅が膨らんでる箇所があると、コードの変更によりデグレ(処理が遅くなっ ている)している可能性があるため FlameGraphを用いてのホットスポットの発見方法 デグレの可能性あり Before After
  38. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 37 #jjug_ccc #ccc_g6 FlameGraphでの ホットスポット発見方法について、 Logicadの実際のグラフを用いて デモでお見せします FlameGraph デモ
  39. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 38 #jjug_ccc #ccc_g6 • チューニングとデグレを計測しながら進める FlameGraphでのチューニング 改善 別の処理が相対的に増えるので 新たな改善箇所を見つける デグレして いないことを 確認
  40. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 39 #jjug_ccc #ccc_g6 • あるSSPから計測されたレスポンスタイムの比較 高速化に取り組んだ結果
  41. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 40 #jjug_ccc #ccc_g6 (参考)FlameGraphによるパフォーマンス計測方法 ⑤FlameGraph実行 ③perf取得 アプリサーバ Java ストレスサーバ JMeter ②大量リクエスト ①JVMオプション  設定&起動 ターミナルetc ④perf-map-agent実行 • FlameGraph取得の流れ
  42. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 41 #jjug_ccc #ccc_g6 (参考)JVMオプション設定&起動 • JVMオプションに以下を追加 -XX:+PreserveFramePointer -XX:-Inline • -XX:+PreserveFramePointer – これによりメソッドの呼び出し先メソッドが判る • -XX:-Inline – 呼び出し頻度の多いメソッドがインライン化 (呼び出し元に展開)されることを抑制 – perfで小さいメソッドが見えなくならないようにする
  43. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 42 #jjug_ccc #ccc_g6 • 十分な時間の負荷を与えて JIT (Just-in-time Compile) させる • Logicadでは負荷はJMeterで実施 (参考)大量リクエスト アプリサーバ Java ストレスサーバ JMeter Logicadでは、 約200万リクエスト 約200並列を5〜10分程度与え続けて実施
  44. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 43 #jjug_ccc #ccc_g6 • perf record で当該PIDの (もしくは全体)サンプリング取得 • perfバイナリ(perf.data)が取得で きる (参考)perf取得 # perf record -F 99 -a -g -- sleep 30 30秒間、99Hz のサンプリングで取得する例
  45. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 44 #jjug_ccc #ccc_g6 • perf-map-agent を実行 • perf-<PID>.mapが生成される (参考)perf-map-agent実行 # java -cp attach-main.jar:$JAVA_HOME/lib/tools.jar net.virtualvoid.perf.AttachOnce <PID> 7f89a8481680 200 Lsun/misc/Unsafe;::getLongVolatile 7f89a84819e0 160 Ljava/lang/String;::<init> 7f89a8481d80 1e8 Ljava/lang/Class;::getModifiers 7f89a84820e0 c0 Ljava/lang/Float;::valueOf 7f89a8482400 100 Lorg/msgpack/io/LinkedBufferInput;::require 7f89a8482820 60 Ljava/util/BitSet;::wordIndex 7f89a8482b00 180 Lio/grpc/okhttp/AsyncFrameWriter$WriteRunnable;::run 7f89a8483040 160 Lnet/citrusleaf/CitrusleafClient;::getResult 7f89a84834c0 e0 Lcom/aerospike/client/AerospikeException$Timeout;::<init> 7f89a8483840 4a0 Ljava/math/BigInteger;::multiplyToLen
  46. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 45 #jjug_ccc #ccc_g6 • FlameGraphのスクリプトで グラフ化 # perf script | stackcollapse-perf.pl | flamegraph.pl --color=java --hash > /tmp/flame_graph.svg (参考)FlameGraph実行 ブラウザで表示するとグラフとして見れる
  47. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 46 #jjug_ccc #ccc_g6 1. 自己紹介 2. Logicadについて 3. 広告業界におけるRTB 4. アーキテクチャ概要 5. Logicadにおける Java パフォーマンスチューニング 6. Java の外側にも目を向ける 7. まとめ 8. QA
  48. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 47 #jjug_ccc #ccc_g6 Java その外側に目を向ける必要性 • ここまでは Java のコードかつ CPU バウンドの 処理を調べるケースの話 – デプロイごとに実施するレギュラーな作業としての計測と最適化 としてはこれで十分 • そうでない場所にもレイテンシ源はいっぱいある – リアルワールドでは急にレイテンシが増えたり消えたりする
  49. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 48 #jjug_ccc #ccc_g6 数字が物語る あるSSPから計測された当社レスポンスタイム平均
  50. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 49 #jjug_ccc #ccc_g6 数字が物語る 曰く「御社のレスポンスタイムが悪化しています」 ここが
  51. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 50 #jjug_ccc #ccc_g6
  52. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 51 #jjug_ccc #ccc_g6 なんとなく • なんとなく JavaVM が疑われがち • システム全体としてレイテンシを改善するには Java の外側も含めて全体的に目を向ける必要がある • もっと言うと、Java の無罪を証明する方法を Java エンジニアが持つべき
  53. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 52 #jjug_ccc #ccc_g6 DSP Java の外側の世界 SSP kernel nginx kernel JVM Java Bytecode Hardware Hardware LAN インターネット
  54. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 53 #jjug_ccc #ccc_g6 DSP そとの世界は広い SSP kernel nginx kernel JVM Java Bytecode Hardware Hardware LAN インターネット 本当に ギルティ?
  55. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 54 #jjug_ccc #ccc_g6 DSP たとえば… SSP kernel nginx kernel JVM Java Bytecode Hardware Hardware LAN インターネット 実はココが 問題だったり
  56. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 55 #jjug_ccc #ccc_g6 • 世界各社の ISP が公開している、Web から ping/traceroute をたたけるツール • オープンな Looking Glass のリストは http://www.traceroute.org/ • SSP が Looking Glass を公開してくれていると 大変ありがたい • シンガポール →東京間の通信が北米周りになったり 😱 したときに使う Looking Glass
  57. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 56 #jjug_ccc #ccc_g6 ある SSP (AppNexus) の Looking Glass traceroute コマンドの パラメータを入力 (ふつうは自社側IPアドレス)
  58. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 57 #jjug_ccc #ccc_g6
  59. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 58 #jjug_ccc #ccc_g6 シンガポール っぽいホスト名 東京っぽい ホスト名 自社までの パケット 往復時間(RTT) = 約70msec
  60. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 59 #jjug_ccc #ccc_g6 DSP たとえば… SSP kernel nginx kernel JVM Java Bytecode Hardware Hardware LAN インターネット 実はココが 問題だったり
  61. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 60 #jjug_ccc #ccc_g6 計測せよ nginx Java HTTP Request HTTP Response HTTP Request HTTP Response
  62. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 61 #jjug_ccc #ccc_g6 計測せよ nginx Java HTTP Request HTTP Response HTTP Request HTTP Response ここの時間 と… ここの時間 との差は…
  63. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 62 #jjug_ccc #ccc_g6 計測せよ nginx Java HTTP Request HTTP Response HTTP Request HTTP Response 1. nginx が動いているマシンと、JavaVM が動いているマシンの 両方で tcpdump -w a.cap -i eth0 -s 65535 tcp port 80 (約60秒間) 2. a.cap を tshark でテキストファイルに変換 3. 同一の HTTP Request, Response となっている組を抽出して タイムスタンプからレスポンスタイムを割り出すプログラム (Ruby製) に食わせる 4. 結果… 詳しくは割愛
  64. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 63 #jjug_ccc #ccc_g6 nginx がわりとレイテンシ源になってた件
  65. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 64 #jjug_ccc #ccc_g6 nginx がわりとレイテンシ源になってた件 nginx 起因のレイテンシ
  66. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 65 #jjug_ccc #ccc_g6 銀の弾丸はない • Java の外側にも問題がよくみつかる • いろいろな計測手法を駆使して見つけ出す • 計測によって新しく見えるものもある
  67. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 66 #jjug_ccc #ccc_g6 Flame Scope • Flame Scope – Flame Graph を時間単位でスライスして 可視化するツール – Netflix が OSS にて公開 – https://github.com/Netflix/flamescope • 以下、CPU使用率ほぼ100%となるよう負荷をかけ、 サンプリングレート 49Hz で120秒間取得した perf の結果を Flame Scope でビジュアライズした 例を紹介します。CPUコアは28個です。 ( perf record -F 49 -a -g -- sleep 120 )
  68. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 67 #jjug_ccc #ccc_g6
  69. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 68 #jjug_ccc #ccc_g6 Flame Scope 上での時間の流れ 0秒 1秒 2秒 時間の流れ
  70. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 69 #jjug_ccc #ccc_g6 秒 ミリ秒 1マス 1/49 秒 1列1秒
  71. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 70 #jjug_ccc #ccc_g6 色が濃い = 28個のCPUコア が稼働している 色が薄いところ = CPUコア28個の ほとんどが idle 状態
  72. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 71 #jjug_ccc #ccc_g6 とても濃い色になってるセル = perf がつけるタイムスタンプのズレに起因するものと考えられる (原因不明)
  73. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 72 #jjug_ccc #ccc_g6 約500msec の白いところ (1コアしか稼働していない!)
  74. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 73 #jjug_ccc #ccc_g6 何かに起因して HTTP Request をさばく 処理が待機させられている
  75. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 74 #jjug_ccc #ccc_g6 ココだけを クローズアップ! して flame graph 生成
  76. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 75 #jjug_ccc #ccc_g6
  77. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 76 #jjug_ccc #ccc_g6 拡大すると…
  78. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 77 #jjug_ccc #ccc_g6
  79. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 78 #jjug_ccc #ccc_g6
  80. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 79 #jjug_ccc #ccc_g6 RollingFileAppender;::rollover sys_write sys_read sys_unlink
  81. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 80 #jjug_ccc #ccc_g6 何が起こっていたのか • logback の RollingFileAppender の rollover が発生していた – rollover はファイルのコピーによって行われる – 大きいサイズのログを rollover すると時間がかかる • rollover 中はログ出力が一時止まる →info, err, warn 等のログ出力メソッドの実行が  rollover 完了まで待たされる
  82. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 81 #jjug_ccc #ccc_g6 Minor GC Minor GC Minor GC Minor GC
  83. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 82 #jjug_ccc #ccc_g6 !?
  84. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 83 #jjug_ccc #ccc_g6 何が起こっていたのか • 裏で pmap コマンドが実行されていた (ネイティブコードの メモリリーク監視のため定期実行) • pmap コマンドは /proc ファイルシステムを叩く • どうやら /proc のうちどっかを参照しているときに ユーザランドのプロセス実行が止まるらしい
  85. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 84 #jjug_ccc #ccc_g6 CPU 使用率の罠 • CPU使用率がほぼ100%ということは 「みっちり」とレイテンシに最適化されている ということを意味しない – 意外に CPU コアは遊んでいる • 計測しないと気づかない – pmap の監視がこんなに影響を与えているとは まったく気づかなかった
  86. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 85 #jjug_ccc #ccc_g6 1. 自己紹介 2. Logicadについて 3. 広告業界におけるRTB 4. アーキテクチャ概要 5. Logicadにおける Java パフォーマンスチューニング 6. Java の外側にも目を向ける 7. まとめ 8. QA
  87. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 86 #jjug_ccc #ccc_g6 • FlameGraphを用いてホットスポットを可視化しています – メソッドレベルでグラフィカルに把握できます • FlameScope、その他のツールを駆使し日々高速化にとりくんでます – 2016年 から 2018年で5ミリ秒から3ミリ秒に高速化しました • 高速化はハマるといくらでもチューニングできる余地がありますが、経済合理 性を踏まえてコスパのよい部分にフォーカスしましょう • 今後もJavaを使って高速化を続けます! まとめ
  88. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved.

    Proprietary & Confidential Powered by 87 #jjug_ccc #ccc_g6 お問い合わせ先 mailto: [email protected] https://www.ulsystems.co.jp/