アドテク×scala×パフォーマンスチューニング
DESCRIPTION
アドテク×Scala meetup 2014-11-20 http://connpass.com/event/8384/TRANSCRIPT
![Page 1: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/1.jpg)
×
~ パフォーマンス改善の心構えと勘ドコロ ~
アドテク × Scala meetup 2014-11-20 @mogproject
アドテク パフォーマンス チューニング
Scala×
![Page 2: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/2.jpg)
Agenda
Demand Side Science の紹介
パフォーマンスチューニング概論
開発フェーズ別のポイント
![Page 3: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/3.jpg)
水谷 陽介 (@mogproject)
Scala Conference in Japan 2013 のスタッフ参加を機に2013年4月 Demand Side Science 入社
フルスタックエンジニア (笑)
前職は SIer のインフラエンジニア (9年)
自己紹介
![Page 8: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/8.jpg)
2012年11月Demand Side Science 株式会社設立
DSS のこれまで
Demand× Side
Science×
![Page 9: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/9.jpg)
2013年
プライベート DSP パッケージ fractale を開発
DSS のこれまで
Demand× Side
Platform×
![Page 10: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/10.jpg)
リアルタイム広告取引 (RTB) における、広告主側のシステム
DSP とは
Supply Side Platform
![Page 11: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/11.jpg)
2013年12月 インターネット広告代理店 オプト グループに参入
2014年10月 ダイナミック・クリエイティブツール unis 提供開始
DSS のこれまで
× ×
![Page 12: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/12.jpg)
ロジックに従って、動的に広告を生成 http://www.opt.ne.jp/news/pr/detail/id=2492
unis
![Page 13: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/13.jpg)
ベンチャーマインドとオプトグループの 強みを活かしつつ
DSS のこれから
Demand× Side
Science×
![Page 14: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/14.jpg)
サイエンスを軸に 様々なプロダクトを生み出していきたい
DSS のこれから
???× ???
Science×
![Page 15: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/15.jpg)
みんなが
DSS のこれから
広告主 ×メディア 利用者×Marketer Publishers Consumer
![Page 16: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/16.jpg)
ハッピーになれる世界を目指して
DSS のこれから
Win × Win Win×
![Page 17: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/17.jpg)
Demand Side Science は
DSS と Scala
創業以来×全てのプロダクトで
Scala を採用しています×
![Page 18: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/18.jpg)
システム構成イメージRDBMS NOSQL
ログストレージ キャッシュ
ログ集計 機械学習
キャッシュ生成 etc.
![Page 19: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/19.jpg)
JavaScript のチューニングについては 今回は触れません
システム構成イメージ
![Page 20: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/20.jpg)
Agenda
Demand Side Science の紹介
パフォーマンスチューニング概論
開発フェーズ別のポイント
![Page 21: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/21.jpg)
システムの課題の解消
インフラコストの削減
パフォーマンスチューニングの目的
![Page 22: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/22.jpg)
高負荷時のアプリケーションの挙動に問題発生
ある条件下でレイテンシー(応答時間) が悪化
バッチ処理の所要時間が目標を超過
開発ツールの動作が遅い
システムの課題の解消
![Page 23: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/23.jpg)
アドテク分野では特に重要
コストが肥大化しがち 大量トラフィック 厳しい応答性能 大規模データベース・ログデータ
配信量増による利益 > インフラ投資額でなければ、そもそもビジネスが成り立たない
インフラコストの削減
![Page 24: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/24.jpg)
パフォーマンスチューニング自体の コスト (≒ エンジニアの労働時間) と
リスク (未知のトラブルを引き起こす可能性) を意識
目的を見失ってはいけない
単純なインフラ増強が最適解の場合も多い
目標を達成できたら、適当な所で手を引く
![Page 25: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/25.jpg)
を繰り返す (場当たり的な対応はNG)
パフォーマンスチューニングの基本
メトリクスの測定
× ボトルネックの特定
仮説を立てて調整×
参考: http://www.atmarkit.co.jp/ait/articles/0501/29/news011.html
![Page 26: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/26.jpg)
http://ja.wikipedia.org/wiki/パレートの法則
“プログラムの処理にかかる時間の 80%
はコード全体の 20% の部分が占める”
— パレートの法則
![Page 27: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/27.jpg)
※個人の感想です。何の根拠もありません。
ボトルネックの傾向
その他 1%
ネットワーク 4%
JVMパラメータ 5%
ライブラリ 5%
OS 10%
Scala 10%
非同期処理・スレッド 15%
データベース (RDBMS/NOSQL)
50%
![Page 28: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/28.jpg)
“正しい実装さえしていれば これまで経験してきたシステムの大半は
I/O バウンド だった”
— 弊社フルスタックエンジニア
※個人的な感想です ※機械学習アルゴリズムは除く
![Page 29: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/29.jpg)
I/O の 3大要素
メモリ × ディスク
ネットワーク×
![Page 30: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/30.jpg)
一般的なPCのオペレーション処理時間
http://norvig.com/21-days.html#answers
CPU命令 1 ナノ秒 = 1/1,000,000,000 秒
CPU L1キャッシュから読み込み 0.5 ナノ秒
CPU 分岐予測の失敗 5 ナノ秒
CPU L2キャッシュから読み込み 7 ナノ秒
mutex のロック/アンロック 25 ナノ秒
メインメモリにアクセス 100 ナノ秒
1Gbps ネットワークで 2KB 送信 20,000 ナノ秒
メインメモリから 1MB 順次読み込み 250,000 ナノ秒
ディスクのシーク 8,000,000 ナノ秒
ディスクから 1MB 順次読み込み 20,000,000 ナノ秒
日本~アメリカ西海岸間のパケット転送往復 150,000,000 ナノ秒=150ミリ秒
http://itpro.nikkeibp.co.jp/article/COLUMN/20100119/343461/
![Page 31: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/31.jpg)
もしもCPU命令1回に1秒かかるならCPU命令 1秒
CPU L1キャッシュから読み込み 0.5秒
CPU 分岐予測の失敗 5秒
CPU L2キャッシュから読み込み 7秒
mutex のロック/アンロック 0.5分
メインメモリにアクセス 1.5分
1Gbps ネットワークで 2KB 送信 5.5分
メインメモリから 1MB 順次読み込み 3日
ディスクのシーク 3ヶ月
ディスクから 1MB 順次読み込み 6.5ヶ月
日本~アメリカ西海岸間のパケット転送往復 5年
https://www.coursera.org/course/reactive week3-2
![Page 32: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/32.jpg)
間寛平 アースマラソン ヨットで太平洋横断
千葉 ~ ロサンゼルス (片道)
2009-01-03 -> 2009-03-11
70日で達成
ちなみに
http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%BC%E3%82%B9%E3%83%9E%E3%83%A9%E3%82%BD%E3%83%B3#.E3.83.A8.E3.83.83.E3.83.88.EF.BC.9A.E5.8D.83.E8.91.89_-
_.E3.83.AD.E3.82.B5.E3.83.B3.E3.82.BC.E3.83.AB.E3.82.B9
![Page 33: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/33.jpg)
バッチ処理で 10KB 程度の小さなファイルを
ディスクから 100万個 読み込んでいた
合計サイズ:
10KB × 1,000,000 ≒ 10GB
本当にあった怖い話
![Page 34: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/34.jpg)
100万回のシークが発生すると8ms × 106 + 20ms × 10,000 ≒ 8,200 sec ≒ 2.5 h
もし10GBのファイル1個で1回のシークで済むと
8ms × 1 + 20ms × 10,000 ≒ 200 sec ≒ 3.5 min
本当にあった怖い話
![Page 35: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/35.jpg)
√
ディスクヘッドの気持ちを考えよう
http://en.wikipedia.org/wiki/Hard_disk_drive
![Page 36: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/36.jpg)
JVM におけるトレードオフの関係
JVM パフォーマンス・トライアングル
メモリ占有空間 ↓
情報処理量 ↑ 応答時間 ↓
Memory Footprint
Throughput Latency
アプリケーションの 最長停止時間 ≒ Full GC の時間
![Page 37: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/37.jpg)
言い換えると
JVM パフォーマンス・トライアングル
省メモリ
情報処理量 応答速度
Compactness
Throughput Responsiveness
![Page 38: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/38.jpg)
C × T × R = k (定数)
JVM パフォーマンス・トライアングル
k に対して C, T, R のどこに比重を置くか変えるのがチューニング
k を増加させるのが最適化 (Optimization)
(Twitter社ソフトウェアエンジニアの発表)
http://www.beyondlinux.com/files/pub/qconhangzhou2011/Everything%20I%20ever%20learned%20about%20JVM%20performance%20tuning%20@twitter%28Attila%20Szegedi%29.pdf
![Page 39: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/39.jpg)
Agenda
Demand Side Science の紹介
パフォーマンスチューニング概論
開発フェーズ別のポイント
![Page 40: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/40.jpg)
1. 要件定義/フィージビリティ 2. 方式設計 3. 環境設計 4. 環境構築/プログラミング 5. システムテスト 6. 運用/保守
開発フェーズ
パフォーマンスに影響がありそうな ポイントを中心に取り上げます
![Page 41: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/41.jpg)
性能要件について関係者の合意を得る
要件定義/フィージビリティ
想定ユーザーID数
日本のインターネット人口: 約1億人
日本のユニークブラウザ数: 2億~数億 増加率は? 情報を保持する期間は? デバイス/ブラウザの種別は? オプトアウトしているユーザの割合は?
![Page 42: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/42.jpg)
要件定義/フィージビリティ
広告配信要求数 月間 impression 数
月間10億件の場合=> 平均すると 400 QPS (Query Per Second)
=> ピーク率 250% とすると 1,000 QPS
RTBの場合、入札率は? 勝率は?
目標応答時間は? コンテンツの容量は?
増加計画は? Cookie Sync リクエストの量は?
![Page 43: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/43.jpg)
要件定義/フィージビリティ
トラッカー受信量 トラッカー発生のタイミング 広告クリックの確率は? コンバージョン(商品購入など)の発生確率は?
![Page 44: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/44.jpg)
要件定義/フィージビリティ
集計に関する要件 集計すべき指標 ユニーク数の集計は必要か? 集計から除外すべき条件はあるか? 誰が、いつ見るのか 広告代理店が二次加工をして広告主にレポートしている? 更新頻度 集計データの保持期間
![Page 45: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/45.jpg)
要件定義/フィージビリティ
ビジネスサイドの制約 売上計画 年末商戦に合わせたい、年度内に売上目標を達成したい、など インフラ予算
![Page 46: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/46.jpg)
市場の変化が激しいアドテクの世界で 正確な見積りを行うのは至難の業であるが、 仮置きでもよいので数字を出すことが大事
要件定義/フィージビリティ
アーキテクチャ設計には前提が必要 性能テストには目標が必要
![Page 47: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/47.jpg)
アーキテクチャ設計 フレームワーク選択
Webフレームワーク データベース選択
RDBMS NOSQL
方式設計
![Page 48: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/48.jpg)
並行プログラミングモデルの設計 ブロッキングをいかに減らすか Future ベース コールバックを利用した関数合成が基本
Actor ベース メッセージパッシング
スレッドプールの設計 スレッドプールのサイズの適正値は本番環境で性能テストを行うまでわからない
方式設計
![Page 49: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/49.jpg)
データベース設計 アクセスパターン/ルックアップ回数
1レコードあたりのサイズ サイズが一定でない場合は分布をモデル化 レコード数 増加率/保持期間 メモリ使用量 DB単体の性能をまず実測する
環境設計
![Page 50: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/50.jpg)
ログ設計 ディスク容量の見積りでは圧縮率を考慮
キャッシュ設計 Redis など、バックアップのために 2倍のキャパシティが必要な場合もあるので注意
環境設計
![Page 51: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/51.jpg)
この段階では、最適化よりも簡潔さ・明快さを優先したほうがよい
“正しいプログラムを速くすることは、
速いプログラムを正しくするより
はるかに、はるかに簡単だ。”
— C++ Coding Standards―101のルール、ガイドライン、ベストプラクティス (C++ in-depth series)
環境構築/プログラミング
![Page 52: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/52.jpg)
— Donald Knuth
“時期尚早な最適化は諸悪の根源だ。”
![Page 53: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/53.jpg)
— Jon Bentley
“一方で、効率性は無視できない。”
![Page 54: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/54.jpg)
線形より悪いアルゴリズムはできるだけ避ける
推測するな、計測すべしhttp://ja.wikipedia.org/wiki/UNIX哲学
環境構築/プログラミング
![Page 55: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/55.jpg)
sbt コンソールの中で OpenJDK jmh
(Java のベンチマークツール Java Microbenchmark Harness) を使うためのプラグインhttps://github.com/ktoso/sbt-jmh
マイクロベンチマーク: sbt-jmh
![Page 56: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/56.jpg)
addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.1.6")
マイクロベンチマーク: sbt-jmh
plugins.sbt
jmhSettingsbuild.sbt
import org.openjdk.jmh.annotations.Benchmark class YourBench { @Benchmark def yourFunc(): Unit = ??? // 計測したい処理を書く}
YourBench.scala
アノテーションを付けるだけ
![Page 57: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/57.jpg)
> run -i 3 -wi 3 -f 1 -t 1
マイクロベンチマーク: sbt-jmh
sbt コンソールを起動し、ベンチマーク実行
計測回数
ウォーミング アップ回数
全体の試行回数スレッド数
![Page 58: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/58.jpg)
[info] Benchmark Mode Samples Score Score error Units[info] c.g.m.u.ContainsBench.listContains thrpt 3 41.033 25.573 ops/s[info] c.g.m.u.ContainsBench.setContains thrpt 3 6.810 1.569 ops/s
マイクロベンチマーク: sbt-jmh
実行結果 (抜粋)
デフォルトではスループット (単位時間あたりの処理回数) が表示される。 (大きほど良い)
http://mogproject.blogspot.jp/2014/10/micro-benchmark-in-scala-using-sbt-jmh.html
![Page 59: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/59.jpg)
Scala 最適化の例
Scala コレクションを正しく使う
関数呼び出しよりも再帰を使う今年の Scala Matsuri で Martin Odersky 先生が発言
高速化ライブラリを試してみる
![Page 60: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/60.jpg)
def f(xs: List[Int], acc: List[Int] = Nil): List[Int] = { if (xs.length < 4) { (xs.sum :: acc).reverse } else { val (y, ys) = xs.splitAt(4) f(ys, y.sum :: acc) }}
本当にあった怖い話 その2
List[Int] の要素を 4つずつグループにして それぞれの和を求める処理を再帰で
scala> f((1 to 10).toList)res1: List[Int] = List(10, 26, 19)
実行例
![Page 61: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/61.jpg)
本当にあった怖い話 その2
List#length の計算量はリストの長さに比例
パラメータ xs の長さを n とすると O(n)
実装は LinearSeqOptimized#lengthhttps://github.com/scala/scala/blob/v2.11.4/src/library/scala/collection/LinearSeqOptimized.scala#L35-43
![Page 62: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/62.jpg)
本当にあった怖い話 その2
関数 f を実行すると、xs.length はn / 4 + 1 回評価される。
つまり f の実行回数も n に比例する
従って、関数 f の計算量は O(n2)
n が大きくなると急速に性能が劣化する
![Page 63: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/63.jpg)
本当にあった怖い話 その2
ちなみに、組み込みメソッドを使えば 1行で書ける
scala> (1 to 10).grouped(4).map(_.sum).toListres2: List[Int] = List(10, 26, 19)
![Page 64: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/64.jpg)
ScalaBlitz
![Page 65: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/65.jpg)
マクロ機能を利用して Scala コレクションの利用を最適化するライブラリ
http://scala-blitz.github.io/
Scala Days 2014 での発表https://parleys.com/play/53a7d2c6e4b0543940d9e549/chapter0/about
ScalaBlitz
![Page 66: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/66.jpg)
システム機能テスト システム間インターフェーステスト 性能テスト 信頼性テスト セキュリティテスト 運用性テスト
システムテスト
![Page 67: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/67.jpg)
単体負荷テスト
シナリオ負荷テスト 現実のユーザ操作を模した負荷
エージング(連続稼働)テスト
性能テスト
![Page 68: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/68.jpg)
Apache 付属
シンプルなベンチマークツールhttp://httpd.apache.org/docs/2.2/programs/ab.html
単純な要件であればこれで十分 最新バージョンの利用を推奨(Amazon Linux プリインストールのバージョンでバグに苦しめられた) コマンド実行例
ab - Apache Bench
ab -C <Cookie名=値> -n <リクエスト件数> -c <同時実行数> “<URL>“
![Page 69: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/69.jpg)
実行結果の例 (一部)
ab - Apache Bench
Benchmarking example.com (be patient)Completed 1200 requestsCompleted 2400 requests(略)Completed 10800 requestsCompleted 12000 requestsFinished 12000 requests(略)Concurrency Level: 200Time taken for tests: 7.365 secondsComplete requests: 12000Failed requests: 0Write errors: 0Total transferred: 166583579 bytesHTML transferred: 160331058 bytesRequests per second: 1629.31 [#/sec] (mean)Time per request: 122.751 [ms] (mean)Time per request: 0.614 [ms] (mean, across all concurrent requests)Transfer rate: 22087.90 [Kbytes/sec] received(略)Percentage of the requests served within a certain time (ms) 50% 116 66% 138 75% 146 80% 150 90% 161 95% 170 98% 185 99% 208 100% 308 (longest request)
Requests per second = QPS
![Page 71: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/71.jpg)
Apache JMeter の時代は終わった
GUI でシナリオを作るのはつらい
Gatling なら
負荷シナリオを Scala DSL で書ける 必読記事
WEB+DB PRESS Vol.83 (2014/10月) 「Javaの鉱脈」http://gihyo.jp/magazine/wdpress/archive/2014/vol83
筆者 @ryushi さんのブログ http://blog.satotaichi.info/gatling-is-awesome-loadtester
Gatling
![Page 72: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/72.jpg)
負荷をかける側のリソースにも注意 サーバ (PC) のリソース
ネットワークルータの CPU がボトルネックになったことも
一度に 2箇所以上の調整をしない
変更履歴やログファイルをきちんと残す
テスト & チューニングの日々
![Page 73: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/73.jpg)
運用/保守
ログ出力 × 異常検知
トレンド可視化×
![Page 74: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/74.jpg)
日常的にログを記録し、監視する アプリケーションログ GCログ プロファイラー 各種メトリクスによる異常検知 サーバリソース (CPU, メモリ, ディスク等) レスポンスコード異常 レイテンシ 各種メトリクスのトレンド可視化
運用/保守
![Page 75: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/75.jpg)
GCログJVM起動オプションで指定
JVM の運用設定
-verbose:gc-Xloggc:<ログファイルのパス>-XX:+PrintGCDetails-XX:+PrintGCDateStamps-XX:+UseGCLogFileRotation-XX:NumberOfGCLogFiles=10-XX:GCLogFileSize=10M
![Page 76: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/76.jpg)
— Oracle 社の実際の顧客
“本番環境で
GCログを出してない奴は
撃ってやる!”
http://www.oracle.com/technetwork/server-storage/ts-4887-159080.pdf p55
“If someone doesn't enable GC logging in production, I shoot them!”
![Page 77: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/77.jpg)
JMX (Java Management eXtensions)JVM起動オプションに以下を指定
JVM の運用設定
-Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port=<ポート番号>-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false
![Page 78: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/78.jpg)
標準出力/標準エラー出力 ファイルにリダイレクトさせる /dev/null に捨てない
スレッドダンプ の結果はここに出る
JVM の運用設定
kill -3 <プロセスID>
![Page 79: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/79.jpg)
SLF4J + Profiler http://www.slf4j.org/extensions.html
コード例
プロファイラー
import org.slf4j.profiler.Profiler
val profiler: Profiler = new Profiler(this.getClass.getSimpleName)
profiler.start(“A”)doA()
profiler.start(“B”)doB()
profiler.stop()logger.warn(profiler.toString)
![Page 80: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/80.jpg)
SLF4J + Profiler 出力例
利用例: タイムアウトが発生時にプロファイラーの結果をログに出力
プロファイラー
+ Profiler [BASIC]|-- elapsed time [A] 220.487 milliseconds. |-- elapsed time [B] 2499.866 milliseconds. |-- elapsed time [OTHER] 3300.745 milliseconds. |-- Total [BASIC] 6022.568 milliseconds.
![Page 81: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/81.jpg)
異常検知ではなく、トレンド把握が目的 変化の兆候を見逃さないような運用も大事 インフラ/アプリだけなく、ビジネス指標も 誰のための画面? システム利用者 システム管理者 アプリ開発者 経営者 (ビジネスの判断を下す人)
メトリクスの可視化
![Page 82: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/82.jpg)
Grafana (+Graphite)
![Page 83: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/83.jpg)
Graphite - http://graphite.readthedocs.org 時系列の数値データを管理/可視化
Grafana - http://grafana.org/ Graphite のデータをカッコよく(Kibana っぽく) 可視化
Graphite にメトリクスを送るScala ライブラリを公開予定
Grafana (+Graphite)
![Page 84: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/84.jpg)
Demand Side Science は
本物の Scala プログラマーを
募集しています。
相談・応募はこちら! ランチご馳走します!
DSS 広告
![Page 85: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/85.jpg)
×
~ パフォーマンス改善の心構えと勘ドコロ ~
アドテク × Scala meetup 2014-11-20 @mogproject
ご清聴 ありがとう ございました!
どうも×
![Page 86: アドテク×Scala×パフォーマンスチューニング](https://reader031.vdocuments.mx/reader031/viewer/2022020307/559b232f1a28ab883e8b45c4/html5/thumbnails/86.jpg)
"Yosuke Mizutani - Kanagawa, Japan | about.me" - http://about.me/mogproject "mog project" - http://mogproject.blogspot.jp/ "DSS Tech Blog - Demand Side Science ㈱ の技術ブログ" - http://demand-side-
science.jp/blog/ "FunctionalNews - 関数型言語ニュースサイト" - http://functional-news.com/
"『ザ・アドテクノロジー』~データマーケティングの基礎からアトリビューションの概念まで~ / 翔泳社 新刊のご紹介" - http://markezine.jp/book/adtechnology/
"オプト、ダイナミック・クリエイティブツール「unis」の提供開始 ~ パーソナライズ化された広告を自動生成し、広告効果の最大化を目指す ~ | インターネット広告代理店 オプト" - http://www.opt.ne.jp/news/pr/detail/id=2492
"The Scala Programming Language" - http://www.scala-lang.org/ "Finagle" - https://twitter.github.io/finagle/ "Play Framework - Build Modern & Scalable Web Apps with Java and Scala" - https://www.playframework.com/ "nginx" - http://nginx.org/ja/ "Fluentd | Open Source Data Collector" - http://www.fluentd.org/ "Javaパフォーマンスチューニング(1):Javaパフォーマンスチューニングのルール (1/2) - @IT" - http://www.atmarkit.co.jp/ait/articles/0501/29/news011.html
"パレートの法則 - Wikipedia" - http://ja.wikipedia.org/wiki/パレートの法則
"Teach Yourself Programming in Ten Years" - http://norvig.com/21-days.html#answers "企業が作る国際ネットワーク最前線 - [4]いまさら聞けない国際ネットワークの基礎知識:ITpro" - http://itpro.nikkeibp.co.jp/article/COLUMN/20100119/
343461/ "Coursera" - https://www.coursera.org/course/reactive "アースマラソン - Wikipedia" - http://ja.wikipedia.org/wiki/アースマラソン
"Hard disk drive - Wikipedia, the free encyclopedia" - http://en.wikipedia.org/wiki/Hard_disk_drive "Everything I ever learned about JVM performance tuning @twitter(Attila Szegedi).pdf" - http://www.beyondlinux.com/files/pub/qconhangzhou2011/Everything%20I%20ever%20learned%20about%20JVM%20performance%20tuning%20@twitter%28Attila%20Szegedi%29.pdf
"Amazon.co.jp: C++ Coding Standards―101のルール、ガイドライン、ベストプラクティス (C++ in-depth series): ハーブ サッター, アンドレイ アレキサンドレスク, 浜田 光之, Herb Sutter, Andrei Alexandrescu, 浜田 真理: 本" - http://
www.amazon.co.jp/gp/product/4894716860 "UNIX哲学 - Wikipedia" - http://ja.wikipedia.org/wiki/UNIX哲学
"ktoso/sbt-jmh" - https://github.com/ktoso/sbt-jmh "ScalaBlitz | ScalaBlitz" - http://scala-blitz.github.io/ "Parleys.com - Lightning-Fast Standard Collections With ScalaBlitz by Dmitry Petrashko" - https://parleys.com/play/53a7d2c6e4b0543940d9e549/chapter0/about "mog project: Micro Benchmark in Scala - Using sbt-jmh" - http://mogproject.blogspot.jp/2014/10/micro-benchmark-in-scala-using-sbt-jmh.html "Gatling Project, Stress Tool" - http://gatling.io/ "WEB+DB PRESS Vol.83|技術評論社" - http://gihyo.jp/magazine/wdpress/
archive/2014/vol83 "「Javaの鉱脈」でGatlingの記事を書きました — さにあらず" - http://
blog.satotaichi.info/gatling-is-awesome-loadtester "Garbage Collection Tuning in the Java HotSpot™ Virtual Machine" - http://www.oracle.com/technetwork/server-storage/ts-4887-159080.pdf "SLF4J extensions" - http://www.slf4j.org/extensions.html "Graphite Documentation — Graphite 0.10.0 documentation" - http://graphite.readthedocs.org/en/latest/ "Grafana - Graphite and InfluxDB Dashboard and graph composer" - http://grafana.org/ "Grafana - Grafana Play Home" - http://play.grafana.org/#/dashboard/db/grafana-play-home "不動産関係に使える 無料画像一覧" - http://free-realestate.org/information/
list.html "AI・EPSの無料イラストレーター素材なら無料イラスト素材.com" - http://www.無料イラスト素材.com/
"大体いい感じになるKeynoteテンプレート「Azusa」作った - MEMOGRAPHIX" -
http://memo.sanographix.net/post/82160791768
参考文献