平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用

Tatsuro Hisamori
Tatsuro Hisamori日本マイクロソフト/ Microsoft Japan - Technical Evangelist at 日本マイクロソフト/ Microsoft Japan
平均レスポンスタイム50msをPerlでry
        Tatsuro Hisamori
改め
アドテク業界って



最近こうなってます
  Tatsuro Hisamori
アドテク?


• 広告技術(Ad Tech)
• 狭義にはネット広告関連技術
広告の目的?
• 広告が成立する条件
 • “出す”場所がある
 • “見る”人がいる
 • ”出稿”したい誰かがいる
• 広告枠 : オーディエンス : 広告主
広告の目的?

• 広告主にとって
 • お金を使って宣伝したいものがある
• 広告枠(を持つ人)にとって
 • その枠から収益を得たい
ネット広告の簡単な歴史
ネット広告の始まり
• 期間保証型広告
 • 例: 1ヶ月掲載あたりxxx円
• 表示回数保証型広告
 • 例: 100万回表示あたりxxx円
• 90年代∼2001年頃
誰かれ構わず
配信している状況
昭和な感じ
Web 1.0(beta)
その後
検索連動型の台頭

• Google AdWords
 • 検索ワードに連動する広告を出す
 • 例: 1クリックあたりxx円
 • 2002年∼いまもある
検索ワードに関連する
 広告を出している
平成な感じ
Web 2.0(死語)っぽい
Web 2.0といえば
• CGMの時代
 • Blog, SNS, Wiki, etc
• (Web広告的な意味で)起こったこと
 • 広告”枠”の爆発的増加
 • ビューの増加に売上が追いつかない
つまり


• メディアの大小問わず
• 枠があるのにマネタイズできてない
• 人気なのにサービス続けるの難しい
せっかく

• 下記のような多様なメディアがあるのに
 • 規模は大小あれど
 • カテゴリ分けが割とはっきり
 • 対象者もある程度明確
アドネットワーク登場

• カテゴリや対象ユーザでまとめた
• マネタイズ出来ていない”枠”を
• 広告主に販売する
例えば

• Google AdSense
• Yahoo!インタレストマッチ
• みたいなの
これで
小規模メディアも
マネタイズできた
そこから更に
「アドネットワーク
いくつもあるけど
  いつでも
最適な配信したい」
というニーズに
応えるべく
 SSPが登場
SSP?


• 伺かのベースウェア -> ☓
• Supply Side Platform -> ○
SSP?

• Supply Side Platform
 • メディアの都合で最も最適な広告を複
  数アドネットワークから選択して配
  信する事業者

• yield optimizerとかいう言い方も
これでメディア        かる

  (∩´∀`)∩ワーイ
めでたしめでたし
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
ちょっと待った
これではまだ
   ”広告主”
を置いて行ってる状況
ここまでの仕組みは
メディアの都合で
 作られた商品
“枠”を買ってるのは
 (当然ながら)   広告主...
広告主のニーズ

• 費用対効果を最適化したい
• 買う枠をちゃんと選びたい
• そのために1リクエスト単位で買うか決
 めたい
DSPの登場
• Digital Signal Processor -> ☓
 • デジタル信号処理集積回路
• Demand Side Platform -> ○
 • 広告主の都合で広告枠を買うための
   プラットフォーム
どうやって?


• SSPとDSPを接続
• 1リクエスト単位でオークションをする
オークション
大きな変化


• 「先物取引」だったWeb広告が
• 「現物取引」に変わる
RealTimeBidding


• 広告枠の「現物取引」を実現する枠組
• リクエストした瞬間に競争入札をする
内容

• システムで使ってる技術とポイント
 • 実装で注意している点
 • テスト/CI/レビュー
 • インフラ
RTBのサービス概要
この間100msくらい
  (SSP/DSP間のRTT含む)
FreakOut!の構成概要
一般的なLAMP構成
ソフトウェア

• nginx + starman + 素のpsgiアプリ
• Tokyo|Kyoto Product, memcached
• MySQL
1.実装で注意している点
気をつけている点
• /etc/hosts
 • 特にKVS/memcached引くのが多い
 • 出来るだけ外部と通信させたくない
• KVS
 • TC/KTのファイルをサーバに配布
 • 出来るだけ外部と通信させたくない
その他のポイント
インスタンス内キャッシュ


• 一度取得したキーの値はリクエスト中
 でキャッシュして使いまわす

 • コード例: InstanceCache.pm
DBへ同期的書き込みをしない

 • 一旦ログに落としておく
  • -> サーバ自身に集計させる
  • -> 回収して集計する
 • シリアライズしてKVSに入れる
  • -> 他のサーバに引き渡す際に利用
どこで割り切るか
  が重要
高速化への回答

I/Oに注意すれば
PerlでもRTT含めて
50msで応答出来る
古典的でも
地道にやる
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
DSPの特徴

• 入札(bid)サーバが一番多くなる
 • 接続SSPのimp合計 = 入札リクエスト
 • 入札に勝たないと配信出来ない
 • かと言ってサーバは有限
       参考: http://www.slideshare.net/kurodaeiji/adserver-12948257
推測より計測

• HTTPDでの計測
• Devel::NYTProf
• 局所的に取るケース
• 寝てる間も指標を取る
HTTPDでの計測

• nginx.conf に設定
 • "$upstream_response_time"
 • "$request_time"
補足

• FreakOut! での例
 • nginx.conf.example
 • ログを愚直に吐くとdiskがあふれるの
  で標準では絞っている

• fluentdとか検討中
Devel::NYTProf

• starman + daemontools の場合
 • run_example
• バッチプログラムとかの場合
 • shebangに -d:NYTProf 追加するだけ
局所的に取るケース

•例
 • KVSのデータ取得に掛かっている時間
  の取得

• PerformanceTimeout.pm
寝てる間も指標を取る


• CloudForecast++ GrowthForecast++
 • CloudForecastはメトリクス収集可視化
 • GrowthForecastはビジネス指標の可視化
CloudForecast



• いわずもがな
• とってないとイスが飛びます
GrowthForecast

• ビジネス指標の取得
 • 入札量の推移
 • 配信量の推移
 • 入札/配信結果の評価指標推移
GrowthForecast
ビジネス指標重要
• 障害の重要度判断はこちらの指標に与え
 る影響度合いで考えるべき

 • その障害が[有|無]害なのかの判断材料
• 例: 配信停止 >> 入札停止 >> その他
 • 「ただちにサービス/売上に影響はない
  のかそうでないのか」
見えるようにしとけば
 説得力が違う
古典的でも
地道にやる
2. テスト/CI/レビュー
テスト

• 実際に開発した機能での例
 • admute(http://fout.jp/ad-mute/)
 • 特定広告主の広告を停止する機能
 • Facebookとかでも実装されてるアレ
コンポーネント
• Plack::Request, Plack::Response
 • を継承してるモジュール
• ↑を受け取って処理するモジュール
 • App::AdMute::Register みたいな

• ごくごくありふれたWebアプリ
どうやってるか

• Mockオブジェクト
 • Mock::App::Request とか作る
• t::Utils でいろいろ置き換える
 • memcached, KVS, MySQLの設定をlocal
   に書き換え
CI

• Ukigumo::Server + 自前script
 • テストさえある程度まとまっていれば
   どうにかなる

 • 見えるようにしとくのは重要
• tokuhirom++
古典的でも
地道にやる
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
3.インフラ
最近クラウド全盛ですが
自作サーバメインです
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
なんでこうしているか


• サービスの性質上費用固定しやすいほうがいい
 • 日によって大きく変動することが少ない
 • 「使った分支払い」だと高く付く
どこで割り切るか
  が重要
費用対効果とリスクを
 勘案してやるべき
古典的でも
地道にやる
まとめ
事実を積み上げて
  判断する
• パフォーマンス
 • I/Oさせない、計測する
• テスト/リリース
 • 他の人がメンテを引き受けられるように
• インフラ
 • 規模や予算、要件に見合った事をする
古典的でも地道にやれば
50msでresponseを返せる
1 of 86

More Related Content

Viewers also liked(20)

DSP「ScaleOut」の成長と負荷対策DSP「ScaleOut」の成長と負荷対策
DSP「ScaleOut」の成長と負荷対策
Toshiaki Ishibashi6.1K views
分散システムの協調処理分散システムの協調処理
分散システムの協調処理
健佑 後藤2.1K views
ネット広告のシステム関連の話ネット広告のシステム関連の話
ネット広告のシステム関連の話
株式会社ジオロジック3.1K views
ScalaでDSP作ってみたScalaでDSP作ってみた
ScalaでDSP作ってみた
Jiro Hiraiwa2.4K views
Adtech2013 audiencemergerAdtech2013 audiencemerger
Adtech2013 audiencemerger
Ryoji Yanashima2.5K views
AdTech Scala Meetup 7 spray-canAdTech Scala Meetup 7 spray-can
AdTech Scala Meetup 7 spray-can
Shuya Tsukamoto1.3K views
モバイルサイト配信と広告の課題モバイルサイト配信と広告の課題
モバイルサイト配信と広告の課題
Yoichiro Takehora2.5K views
Ad tech 勉強会 20140115Ad tech 勉強会 20140115
Ad tech 勉強会 20140115
ajiyoshi4.5K views
アドテクな話アドテクな話
アドテクな話
Jun Ichikawa7.5K views
広告の最適化広告の最適化
広告の最適化
章平 福井42.8K views
GMOプライベートDMPの仕組みGMOプライベートDMPの仕組み
GMOプライベートDMPの仕組み
Michio Katano25.4K views
Sano tokyowebmining 201625_v04Sano tokyowebmining 201625_v04
Sano tokyowebmining 201625_v04
Masakazu Sano32K views
ElasticSearch勉強会 第6回ElasticSearch勉強会 第6回
ElasticSearch勉強会 第6回
Naoyuki Yamada21.2K views

Similar to 平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用(20)

20120126 mnlgy 120120126 mnlgy 1
20120126 mnlgy 1
takaoka susumu5.9K views
#idcon vol.18_アドテクとID#idcon vol.18_アドテクとID
#idcon vol.18_アドテクとID
Yuichi Ota14.1K views
Rtb30minRtb30min
Rtb30min
Daisuke Yamazaki9.2K views
How to improve performanceHow to improve performance
How to improve performance
Atsuko Fukui100 views
S23S23
S23
TH Schee375 views
Contexual bandit @TokyoWebMiningContexual bandit @TokyoWebMining
Contexual bandit @TokyoWebMining
正志 坪坂11.5K views

More from Tatsuro Hisamori(8)

CGI Perlでわかる!サーバレスCGI Perlでわかる!サーバレス
CGI Perlでわかる!サーバレス
Tatsuro Hisamori203.3K views
Html5j 8Html5j 8
Html5j 8
Tatsuro Hisamori1.1K views
YAPC::Europe 2014 に行ってきましたYAPC::Europe 2014 に行ってきました
YAPC::Europe 2014 に行ってきました
Tatsuro Hisamori3.2K views
YAPCEurope2014-myfinderYAPCEurope2014-myfinder
YAPCEurope2014-myfinder
Tatsuro Hisamori2.9K views
My sql event_scheduler_casual_slideshare__My sql event_scheduler_casual_slideshare__
My sql event_scheduler_casual_slideshare__
Tatsuro Hisamori9.3K views
show innodb statusshow innodb status
show innodb status
Tatsuro Hisamori37.3K views

平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. InstanceCache.pm を vim で開いて適当に解説\n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. nginx.conf.example を開いて適当に解説\n
  60. run_example を開いて適当に解説\n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. この辺は実際のコード見せたほうが早いんでそっちで\n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n