Top Banner
SmartNews AdServer 解体新書 / ポストモーテム @tamtam180 SmartNews, Inc.
115

SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

Jan 07, 2017

Download

Technology

SmartNews, Inc.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

SmartNews AdServer

解体新書 / ポストモーテム

@tamtam180 SmartNews, Inc.

Page 2: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

公開用に何枚かスライドを削除しています。

一部画像の削除、およびモザイクを入れています。

Page 3: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

自己紹介

• 名前: たむたむ

• 職業: ソフトウェアエンジニア

• Twitter: @tamtam180

• 趣味: オンラインゲーム, セクシーなサービスを作る事

• OSS-Contribute: TokyoTyrant, Hadoop, Hive, ArangoDB, PipelineDB

• SIer (2年)

• Square Enix (約6年)

– PlayOnline, FF-XIV

• Freelance (2年)

• SmartNews (いまここ)

Page 4: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

自己紹介

• スクエニを退職したら2chにスレッド立てられて晒された

• こんな事が書かれていた

• 豆腐ハンバーグ美味しいし、貧乏じゃねーし、

余計なお世話だ

Page 5: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

自己紹介

• 広告の事、何もやったことない

Page 6: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

広告用語は略語が多い

Page 7: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

アジェンダ

• 初期の開発スケジュール

• 使っている技術

• アドサーバが持っている機能

• 広告処理概要, 要素技術, 思想

• 事件簿

• 2016 に向けて

Page 8: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

アジェンダ

• 初期の開発スケジュール

• 使っている技術

• アドサーバが持っている機能

• 広告処理概要, 要素技術, 思想

• 事件簿

• 2016 に向けて

Page 9: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

初期の開発スケジュール

• 08/15 API仕様確定

• 08/22 iOS SDK提供開始

• 08/29 Android SDK提供開始

• 09/12 Web SDK 提供開始

• 09/15 Adサーバ リリース

• 09/25 Android版テスト配信(public test)

• 10/08 Web版テスト配信

• 10/15 iOS版テスト配信(public test)

• 10/27 iOS Submit

• 10/28 Android Release

• 11/04 Standard Ad配信開始

• 11/16 Premium Ad配信開始

• 12/01 正式リリース & セールススタート

というスケジュール表が

8月20日に投稿されていた

Page 10: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

複数のアドバイザ

• 思想も設計も既に決まっているのに

後は走るだけなのに

–外部からアドバイザが次々とやってくる

–「思想や設計を説明してくれ」

Page 11: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

Initial Commit

Page 12: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

テスト

Page 13: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
Page 14: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

アジェンダ

• 初期の開発スケジュール

• 使っている技術

• アドサーバが持っている機能

• 広告処理概要, 要素技術, 思想

• 事件簿

• 2016 に向けて

Page 15: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

使っている技術

• Scala

Page 16: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

使っている技術

• Scala

• Java

Page 17: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

使っている技術 – Java -

• Scala

• Java(1.8)

• Jetty (Embedded)

• Spring Framework (DI)

• Jackson

• SLF4j / Logback

• FastUtil

• Kryo

• Trie4j

• MyBatis

• Flyway

• Nashorn

• gRPC / ProtoBuf

• Guava

Page 18: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

使っている技術 – Middle Ware -

• NewRelic

• JMX with DataDog

• MySQL

• Redis

• DynamoDB

• Fluentd

• Kinesis

Page 19: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

使っている技術 – AWS -

• EC2

• S3

• CloudFront -> Akamai

• RDS

• DynamoDB

• ElastiCache(Redis)

• Redshift

• Kinesis

• Route53

LambdaEC2 Container ServiceCodeDeployCloudWatchEMRDevice FarmSNSCloudSearchElastic TranscoderSQS

Page 20: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

Kernel Parameter

kernel.sysrq =0kernel.core_uses_pid =1kernel.sem =2502560001001024kernel.msgmnb =65536kernel.msgmax =65536kernel.shmmax =68719476736kernel.shmall =4294967296

#autoconfigurebykernel#fs.file-max=524280#kernel.threads-max=500000

net.ipv4.ip_local_port_range=1000065535net.ipv4.ip_forward=0net.ipv4.tcp_syncookies=1net.ipv4.conf.default.rp_filter=1net.ipv4.conf.default.accept_source_route=0net.ipv4.tcp_wmem=40961638416777216net.ipv4.tcp_rmem=40968738016777216

net.ipv4.tcp_fin_timeout=5net.ipv4.tcp_keepalive_time=10net.ipv4.tcp_keepalive_probes=3net.ipv4.tcp_keepalive_intvl=4net.ipv4.tcp_max_syn_backlog=8192

net.core.somaxconn =65535net.core.netdev_max_backlog =65535net.ipv4.tcp_max_syn_backlog=65535

net.ipv4.conf.all.arp_ignore=1net.ipv4.conf.all.arp_announce=2

net.core.rmem_default =87380net.core.rmem_max =16777216net.core.wmem_default =16384net.core.wmem_max =16777216net.core.netdev_max_backlog =16384net.ipv4.tcp_tw_reuse=1net.ipv4.tcp_tw_recycle=0

net.ipv4.tcp_window_scaling=0net.ipv4.tcp_timestamps=0net.ipv4.icmp_echo_ignore_broadcasts =1

net.ipv4.tcp_no_metrics_save=1net.ipv4.tcp_ecn=0

Page 21: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

rc.local

#!/bin/bash

touch/var/lock/subsys/local

forpathin/proc/sys/net/ipv4/conf/*donic=$(basename "$path")if[[$nic ==eth*]];then/sbin/ifconfig $nic txqueuelen 10000/sbin/ethtool -K$nic rx offtx offsg offtso offufo offgso offgro offlro off

fidone

Page 22: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

アジェンダ

• 初期の開発スケジュール

• 使っている技術

• アドサーバが持っている機能

• 広告処理概要, 要素技術, 思想

• 事件簿

• 2016 に向けて

Page 23: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

アドサーバが持っている機能

• Filters

• Beacon Endpoint

• Budget Control

• Frequency Control

• Auction

• Bloom Filter

• Ad Allocation (Minimum Cost Flow)

• Optimizer

• Impression Smoother

• Web Tracking

• Preflight Mode

• Rehearsal Mode

• Restrict Mode

• SelfServe Delivery

• Admin API

Page 24: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

アジェンダ

• 初期の開発スケジュール

• 使っている技術

• アドサーバが持っている機能

• 広告処理概要, 要素技術, 思想

• 事件簿

• 2016 に向けて

Page 25: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

広告処理概要

SDK AdServerELB

CDN S3

Dispatcher

Transform

FilterJSON

Image

Redis MySQL DynamoDB

Auction

Allocation(最適化問題)

Serializer

Page 26: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

初期バージョン設計思想

• なるべく通信はしない

• データはなるべくオンメモリ

• リフレクションは使わない

• 各種処理は計算量O(1), O(LogN)で実装する

• ログ基盤に割くリソースはないので、フロントである程度頑張る

Page 27: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

アドサーバが扱うデータの種類

Page 28: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

広告処理概要 - データの種類 -

• アドサーバが扱うデータの種類

–ユーザー主体の情報

–キャンペーン主体の情報

–メディア主体の情報

–マスタ情報

–速報値カウンタ

Page 29: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

広告処理概要 - オンメモリ -

AdServer

RedisPubsub

MySQLMaster

MySQLSlave

管理画面

Pub

1.Sub

2.起動時に一気にLoad

6.キャッシュ更新

キャンペーン情報

OnMemory

各種情報はオンメモリで

Queue

4.Latch

5.Load

3.キャッシュ更新

Page 30: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

レプリケーション遅延対策

Page 31: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

広告処理概要 - レプリケーション遅延対策 -

AdServer

RedisPubsub

MySQLMaster

MySQLSlave

管理画面

1.Update

3.Pub(ID,LastTimestamp)

Sub

4.Timetamp比較

6.キャッシュ更新

キャンペーン情報

OnMemory

キャンペーン Table

最終更新時間 Table 2.Update5.Retry

各種情報はオンメモリで

Page 32: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

速報値カウンタ

Page 33: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

広告処理概要 – 速報値カウンタ -

AdServer

Redis

速報値情報

OnMemory

SDK

Beacon

LogFile Fluentd

S3

Kinesis

Redis

WriterCounter

ReadCounter

予算消化情報

時系列カウンタ

Page 34: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

広告識別子

Page 35: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

広告識別子

• 払い出した広告には1件ずつユニークなIDを割り当てている

• UUIDは使っていない

• OTS (One Time Signature)

–120Bit

–Base64URIしたもの

• ASCII: 20文字

• サーバ間で協調する事無く、ユニークなIDを生成できる

Page 36: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

広告識別子

Name Bit DescriptionVersion 4 OTS VersionTimestamp 41 2012/12/10 00:00:00起点のミリ秒NodeId 24 サーバのIDRedisId 8 格納先RedisのIDSequence 19 ラウンドロビンカウンタBitOptions 8 各種フラグReserved 16 予約

Page 37: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

広告識別子とメタ情報

OTS

Redis

Hash

Key Field

Hash OTS

META

Value

RES

IMP

VIMP

CLICK

CONV

Time

Time

Time

Time

Time

Object

Page 38: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

Impression Smoothing

Page 39: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

Impression Smoothing

ベース

Device * Channel * DayOfWeek/ Per Minute

xxxIMP

プラン

ScoreXScoreX

Remain

Counter

Base

Debt

Assist

Prediction

MixedScoreAllocation

Page 40: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

IMP売り商品

• Standardのアドサーバは2つの広告を扱っている

–IMP売りの商品(純広告)

–パフォーマンス広告(運用型広告)

• これを1回のリクエストで返す必要がある

Page 41: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

純広告と運用型広告の処理

Channel Channel Channel Channel

純広告

運用型広告

Smoothing

Allocation(最適化問題)

AuctionAuction

Allocation(最適化問題)

Merge

Page 42: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

Impression Smoothing

Page 43: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

アジェンダ

• 初期の開発スケジュール

• 使っている技術

• アドサーバが持っている機能

• 広告処理概要, 要素技術, 思想

• 事件簿

• 2016 に向けて

Page 44: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

注意事項

• ここから、とても残念な発表の連続です。

• 前提として、

–リリーススケジュールが過酷

–大量の機能リリースが必要

• だったという事を念頭にお願いします。

Page 45: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

Release頻度

16

34 34

19 20

12

21

1318

25 25

15 14 16

712

Page 46: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

2014.11

• 基本機能は実装

– iOS, Android, WebSDKは実装済み

– Budget Control

– Auction

– Frequency Control

– Rehearsal Mode

– Restrict Mode

– Naive Allocation

– TrackingTool

– WebTag

Page 47: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件簿 File.1

Page 48: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス障害

• ピークタイムでELBから外れてしまう

• Monitor競合がとても多い事を観測

Page 49: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

Java Blocking

• MersenneTwisterがMTSafeじゃなかった

• JavaのPropertiesをオンライン処理で参照してブロック

–getPropertyがsynchronized

• SecureRandomが刺さる

–nextBytesがsynchronized

• NewRelicの@Traceが多いと時々刺さる

Page 50: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

Java Blocking

• 暗号化ライブラリがスレッドブロッカー

–Cipherのインスタンスはスレッドセーフではないので毎回生成する必要がある

–ただし、Instance化する時にsynchronizedが存在する

–GenericObjectPoolを使った

•GenericObjectPoolもsynchornizedなコードが多い

–ThreadLocalを使うようにして回避

Page 51: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

Java Blocking

• getClass().get**Name()がBlockする

–OpenJDKのソースを追っていくとBlockする箇所がある

Page 52: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

集団食中毒 事件

Page 53: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

集団食中毒事件

• みんなでランチに豚カツを食べに行った

• 夕方に体調を崩して早退

• 家で壮大に吐く

• 他にも被害者多数

Page 54: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

IAAS事件簿

Page 55: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

CDN障害

• クリエイティブ画像が表示されない障害が発生

–CloudFrontの障害

–この年はCloudFrontの障害が多かった

• SLA100%のCDNへ移行

Page 56: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

AWS

• ElastiCache

–自動snapshot取得中にtimeoutが頻発

–Server側に存在しない接続情報が大量に残っていてTCPレベルでACKを返さなくなる

• AMI(EC2)

–2015.09のAMIで頻繁にインスタンスチェックが失敗する

Page 57: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

iOSクラッシュ事件

Page 58: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

iOSクラッシュ

• 前回、広告を取得した件数よりも、

今回、広告を取得した件数が小さい場合にクラッシュする

• 急遽、求人広告を作ってフィラーとして配信する

Page 59: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件簿 File.2

Page 60: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.2

Page 61: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.2

• 2015年4月28日

• 最近、日に日に負荷が高くなっている。

• ゴールデンウィークが危ない

Page 62: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.2

Page 63: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.2

• 現象

–GC時間が増加している

–FULL GCが10秒に1回くらい発生していた

• 対処

–速報値カウンタのTimeline取得をO(N+LogN)からO(1)に

–大量のインスタンス生成箇所をつぶした

Page 64: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.2

Page 65: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件簿 File.3

Page 66: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.3

• 2015年5月8日

• GCがやばい

• Class Unloadingが多い

• チューニングしないと!!

Page 67: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.3

Page 68: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.3

• 現象

– FullGCが多い

– ClassUnloadingが何故か多い

• 対処

– GC抑止のためにパラメータチューニング

– レキシカルスコープを参照しているLambda式の排除

Page 69: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.3

• GCパラメータ(before)

-Xmx****m-Xms****m-XX:+UseConcMarkSweepGC-XX:CMSInitiatingOccupancyFraction=70

Page 70: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.3

• GCパラメータ(after)

-Xmx****m-Xms****m-XX:+UseConcMarkSweepGC-XX:CMSInitiatingOccupancyFraction=70-XX:NewRatio=1-XX:SurvivorRatio=2-XX:TargetSurvivorRatio=90-XX:MaxTenuringThreshold=15-XX:+DisableExplicitGC-Xloggc:/data/logs/_gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10-XX:GCLogFileSize=1024m-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution-XX:+TraceGen0Time-XX:+TraceGen1Time

Page 71: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.3

Page 72: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件簿 File.4

Page 73: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.4

• 現象

– バックグラウンド処理が遅い

• 対処

– 各種実装の最適化

•一部処理の並列化

•不要なデータの読み込みを回避

•通信の回数を減らす

Page 74: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.4

Page 75: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.4

Page 76: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.4

Page 77: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.4

Page 78: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

アラート通知事件 File.番外編

Page 79: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

アラート通知

• 全台バランサから外れていた

• 数時間気づかなかった

• そもそもアラートが来ない

• 何故?

• PagerDutyに登録している電話番号間違ってた

サービスインする前の話です

Page 80: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

アラート通知

• 一時期、毎朝7時のピークで障害が発生した。

• 好きな着メロだったのに嫌いになった。

Page 81: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件簿 File.5

Page 82: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.5

• 現象

– 速報値を扱っているRedisの通信帯域がつらい

• 対処

– アーキテクチャの変更

Page 83: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.5

AdServer

Scan

TimelineSummary

ToCache

RedisAdServerAdServer

Page 84: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.5

• スケールしないもの(Redis)と直接通信をするとアドサーバがスケールしなくなる

• 速報値を扱うプロセスを用意し、アドサーバはそれと通信をする。

Page 85: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.5

AdServer

Scan

TimelineSummary

ToCache

RedisAdServerAdServer Process

Summaried Data

Page 86: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.5

Page 87: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.5

Page 88: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

確率計算ミス File.番外編

Page 89: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

確率計算ミス

• 確率計算ミス

– 70%で配信したいところが、確率計算をする度にサイコロ(乱数)を振っていた

– 1回の広告取得で3チャンネルを同時に取得する

– 1回の広告で70%にしないといけない設定だった

–各チャンネルで70%の判定をしていた

– 70% * 70% * 70% = 34.3%

–しかも、オペレーション担当に体感30%くらいなんですけど?と言われて発覚した

Page 90: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

確率計算ミス

サービスIN前

です

Page 91: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件簿 File.6

Page 92: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.6

• 現象

– OTSに紐付くMeta情報が日々肥大化している

• 対処

– Serializerを変更

Page 93: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.6

• 今まではデバッガビリティのためにJSONで保存

• KryoのTagFieldSerializerを使用

• BooleanフラグをOTS側に移動

Page 94: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.6

• 空間効率が1/3

• SerdeのCPU処理負荷が1/2

Page 95: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件簿 File.7

Page 96: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.7

• 現象

– オンメモリのキャッシュがObject生成しすぎ

– そもそもObject生成が多すぎ

– GCが荒ぶっている

• 対処

– データ構造、および処理を大幅改修

Page 97: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.7

• リクエストの度に大量にオブジェクトを生成している箇所がある

• キャッシュからのコピーが大量に発生しており、1リクエスト中のフットプリントが大きい

• 時系列情報をナイーブに持たないでサマライズ

• HistogramのBin構造を最適化

Page 98: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.7

Page 99: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.7

Page 100: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.7

Page 101: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

パフォーマンス事件 File.7

Page 102: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

Kryoの前方互換性問題

Page 103: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

Kryoの前方互換性問題

• KryoのTagFieldSerializerは前方互換性が無い

– TicketにあるPRも問題を解消できない

Page 104: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

Kryoの前方互換性問題

• サーバの更新中に発生する

• 更新中は古いサーバと新しいサーバが混在する

• 新しいサーバが広告を払い出す

• 古いサーバがビーコンを受け取る

• 古いサーバは古い定義のまま新しいバイナリを受け取る

Page 105: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

Kryoの前方互換性問題

• TagFieldSerializer

–Tagの順番に処理していない(Field名でソートしている)

–知らないTagIDを読み込むとエラーが出る

Page 106: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

Kryoの前方互換性問題

• 改善版

–Tagの順番でソートしてSerializeする

–UnknownなTagを読み込んだら処理を中断する

–SKIPしてはいけない

Page 107: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

レプリケーション事件簿

Page 108: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

レプリケーション事件簿

• レプリケーション遅延

–レポートテーブルが同居していて、しかも巨大なトランザクションが発行されていた

–30分以上遅延することがあった

–リロードが失敗する事が多発

Page 109: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

レプリケーション事件簿

• クエリを修正

• そもそも、レポートDB分離

• キャパシティプランニングを楽にするためにAuroraへ

Page 110: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

gRPC事件

Page 111: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

gRPC

• サーバ間通信でgRPCを採用した

–ProtoBuf Beta

–Netty Beta

• ELBを通すとNettyの不具合を踏む

• 異常系の不具合をたくさん踏む

Page 112: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

アジェンダ

• 初期の開発スケジュール

• 使っている技術

• アドサーバが持っている機能

• 広告処理概要, 要素技術, 思想

• 事件簿

• 2016 に向けて

Page 113: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

次のステージへ

• スケールできる土台は一通り作った

• Stream処理、オンライン処理への準備も出来つつある

Page 114: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

今の構成

AdServer

ELB

Redis MySQL DynamoDB

LogFile FluentdS3

Kinesis

Provider

HA-PROXY CONSUL

CPUBOUNDMEMBOUND

RedShift

BQ

Hive

Presto

PipelineDB

RealtimeReport

DMP

Batch

AdHoc

Page 115: SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム

最後に

• 意外と広告は面白い

–ソフトウェアエンジニアリング, 大量のログ, 機械学習, 最適化問題, 大規模トランザクション

–実時間で実現する必要がある

• 技術だけでなく、ビジネスも楽しもう

• もしかしたら、誰でも出来るかもしれない

• 誰でも出来る事は、誰にも出来ないレベルまで昇華しよう

• イノベーションは個人の裁量から生まれる