SlideShare a Scribd company logo
DSPでgolangの屍
を超えた話
1
片田 雄樹
先日リリースしたAmebaDSPの開発責任者としてエンジニア兼任で
分析とかやってます。
主な使用言語: Scala、Go言語
最近はまっていること: Tableauで個性的なダッシュボードを作る
2
Agenda
» Ameba DSPで起きた問題
» 対応策と結果
» チューニング方法
» まとめ
3
※ 今回の話は、golangをある程度触
ったことがある人が主な対象となり
ます。
4
1.
Ameba DSPで起きた問題たち
Problems happened in Ameba DSP
5
golangを使った理由
ちょっと触った感じ簡単だし、流行ってるか
らいい感じなんじゃね!?(*´∀`*)
6
最強の壁: 速度問題
DSPなので、リクエストからレスポンスまで
100ms以内に返さなきゃいけない。
なかなか思ったような速度出ない…(涙)
7
イライラ: structが勝手にデフォ
ルト値にしやがる問題
ログで「0」値を吐きたいのにnullにする
また、structに詰めるときに勝手に「0」が入る
。
そもそも値が返ってきてるのかわからん!
8
イライラ2: コード荒れる問題
他の言語で書くよりgolangで書くとやたらコー
ド荒れる。
キレイになったかと思えばコード量半端ない…
9
2.
解決策
Solutions the problem
10
最強の壁: 速度問題
今回はこの問題にフォーカスします。
(100ms以内にレスポンスしなきゃいけない問題)
11
そもそもの原因として、I/Oのレイテンシーをなめてた。
最初は、1000QPSで130msぐらいかかってました…
12
解決策その1
13
最強の壁: 速度問題(解決策その1)
14
goroutineを内部で使用していたライブラリ例
» net/http (https://github.com/golang/go/tree/master/src/net/http)
» ruslog (社内ライブラリ)
最強の壁: 速度問題(解決策その1)
15
それぞれgoroutineの実装部分でかなりのオーバ
ーヘッドが発生していました…
最強の壁: 速度問題(解決策その1)
16
ライブラリ変更後
» net/http
→ fasthttp (https://github.com/valyala/fasthttp)
» ruslog (社内Loggerライブラリ)
→ zap logger (https://github.com/uber-go/zap)
ライブラリ変更することで、30msぐらいは速く
なった!
最強の壁: 速度問題(解決策その1)
17
最強の壁: 速度問題(解決策その1)
教訓その1
ライブラリの実装を見れば割と簡単に問題に気
づくので、使用するライブラリはちゃんと内部
実装を確認しましょう。
18
解決策その2
19
最強の壁: 速度問題(解決策その2)
ココ
20
二つのサーバに並列(goroutine)でリク
エストしてました。
最強の壁: 速度問題(解決策その2)
21
最強の壁: 速度問題(解決策その2)
こんな感じで、Wait Group 使ってアクセスし
てました。(サンプルコード)
22
プロファイルとってみると、goroutineを生成し
すぎてたせいかレイテンシーの原因になってる
ことが判明。
シーケンシャルな処理(goroutine/wgをなくした
)にしたら20msくらい改善!
最強の壁: 速度問題(解決策その2)
23
最強の壁: 速度問題(解決策その2)
教訓その2
goroutineを使うにもいくらかコストがかかるの
で、意識して実装しましょう。
24
3.
チューニング方法
Performance tuning
25
パフォーマンスチューニングの要はプ
ロファイルを取ることだった。
Golangの「pprof」は超優秀です。
https://golang.org/pkg/net/http/pprof/
26
今回使ったのはこちら、
echo-contrib/echopprof
(github.com)
https://github.com/echo-contrib/echopprof
27
> go tool pprof ./main
http://localhost:xxx/debug/pprof/block
(pprof)
このようにビルド後のバイナリ(./main)とエンドポイント(http://localhost:xxx/debug/pprof/block)を
指定することで (pprof) が立ち上がります。
28
例えば、「list 関数名」コマンドで関数呼び出しにかかった時間を調べることができます。
29
DEMO
30
4.
まとめ
Conclusion
31
屍を超えて学んだこと
» ライブラリの内部実装はしっかり確認しましょう
(golangは比較的読みやすいので)
» 決してgoroutineが悪いわけではなく、軽量で簡単に実装で
きるからといって使い方を誤るとボトルネックになります
» めんどくさがらず、プロファイリングしてボトルネックを見
つけていきましょう
32
ご清聴ありがとうございました。
33

More Related Content

What's hot

Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_cccSpring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Yahoo!デベロッパーネットワーク
 
実践 NestJS
実践 NestJS実践 NestJS
実践 NestJS
Ayumi Goto
 
各種データベースの特徴とパフォーマンス比較
各種データベースの特徴とパフォーマンス比較各種データベースの特徴とパフォーマンス比較
各種データベースの特徴とパフォーマンス比較
株式会社オプト 仙台ラボラトリ
 
Windows Server 2016でコンテナを動かしてみた
Windows Server 2016でコンテナを動かしてみたWindows Server 2016でコンテナを動かしてみた
Windows Server 2016でコンテナを動かしてみた
Takashi Kanai
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
 
MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜
Naruhiko Ogasawara
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Atsushi Nakada
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方Satoshi Nagayasu
 
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawaクリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
Shohei Okada
 
Web ベースのカジュアルゲーム「block pong」の実装とビジネス
Web ベースのカジュアルゲーム「block pong」の実装とビジネスWeb ベースのカジュアルゲーム「block pong」の実装とビジネス
Web ベースのカジュアルゲーム「block pong」の実装とビジネス
t-kihira
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
 
PostgreSQL運用管理入門
PostgreSQL運用管理入門PostgreSQL運用管理入門
PostgreSQL運用管理入門
Yoshiyuki Asaba
 
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
Kenjiro Kubota
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話
y-uti
 
Gcpで多言語対応チャットボット作ってみた
Gcpで多言語対応チャットボット作ってみたGcpで多言語対応チャットボット作ってみた
Gcpで多言語対応チャットボット作ってみた
Ryo Takano
 
DynamoDB設計のちょっとした技
DynamoDB設計のちょっとした技DynamoDB設計のちょっとした技
DynamoDB設計のちょっとした技
Yoichi Toyota
 
【解説】データ指向アプリケーションデザイン 12章 データシステムの未来
【解説】データ指向アプリケーションデザイン 12章 データシステムの未来【解説】データ指向アプリケーションデザイン 12章 データシステムの未来
【解説】データ指向アプリケーションデザイン 12章 データシステムの未来
Shinya Mori (@mosuke5)
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
kwatch
 
TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Results
mametter
 

What's hot (20)

Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_cccSpring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
 
実践 NestJS
実践 NestJS実践 NestJS
実践 NestJS
 
各種データベースの特徴とパフォーマンス比較
各種データベースの特徴とパフォーマンス比較各種データベースの特徴とパフォーマンス比較
各種データベースの特徴とパフォーマンス比較
 
Windows Server 2016でコンテナを動かしてみた
Windows Server 2016でコンテナを動かしてみたWindows Server 2016でコンテナを動かしてみた
Windows Server 2016でコンテナを動かしてみた
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方
 
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawaクリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
 
Web ベースのカジュアルゲーム「block pong」の実装とビジネス
Web ベースのカジュアルゲーム「block pong」の実装とビジネスWeb ベースのカジュアルゲーム「block pong」の実装とビジネス
Web ベースのカジュアルゲーム「block pong」の実装とビジネス
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
PostgreSQL運用管理入門
PostgreSQL運用管理入門PostgreSQL運用管理入門
PostgreSQL運用管理入門
 
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話
 
Gcpで多言語対応チャットボット作ってみた
Gcpで多言語対応チャットボット作ってみたGcpで多言語対応チャットボット作ってみた
Gcpで多言語対応チャットボット作ってみた
 
MapReduce入門
MapReduce入門MapReduce入門
MapReduce入門
 
DynamoDB設計のちょっとした技
DynamoDB設計のちょっとした技DynamoDB設計のちょっとした技
DynamoDB設計のちょっとした技
 
【解説】データ指向アプリケーションデザイン 12章 データシステムの未来
【解説】データ指向アプリケーションデザイン 12章 データシステムの未来【解説】データ指向アプリケーションデザイン 12章 データシステムの未来
【解説】データ指向アプリケーションデザイン 12章 データシステムの未来
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Results
 

More from Yuki Katada

AmebaDSPを掘り下げる
AmebaDSPを掘り下げるAmebaDSPを掘り下げる
AmebaDSPを掘り下げる
Yuki Katada
 
Introduction to GraphQL in Scala (ScalaMatsuri 2017)
Introduction to GraphQL in Scala (ScalaMatsuri 2017)Introduction to GraphQL in Scala (ScalaMatsuri 2017)
Introduction to GraphQL in Scala (ScalaMatsuri 2017)
Yuki Katada
 
GenisysでTableauを導入した話
GenisysでTableauを導入した話GenisysでTableauを導入した話
GenisysでTableauを導入した話
Yuki Katada
 
Microsoft Azure Machine Learning "ちょっと"だけ触ってみた
Microsoft Azure Machine Learning "ちょっと"だけ触ってみたMicrosoft Azure Machine Learning "ちょっと"だけ触ってみた
Microsoft Azure Machine Learning "ちょっと"だけ触ってみた
Yuki Katada
 
Akka/Actor introduction
Akka/Actor introductionAkka/Actor introduction
Akka/Actor introduction
Yuki Katada
 
LT Thursday Intro. (Rust使ってみた←釣り)
LT Thursday Intro. (Rust使ってみた←釣り)LT Thursday Intro. (Rust使ってみた←釣り)
LT Thursday Intro. (Rust使ってみた←釣り)
Yuki Katada
 

More from Yuki Katada (6)

AmebaDSPを掘り下げる
AmebaDSPを掘り下げるAmebaDSPを掘り下げる
AmebaDSPを掘り下げる
 
Introduction to GraphQL in Scala (ScalaMatsuri 2017)
Introduction to GraphQL in Scala (ScalaMatsuri 2017)Introduction to GraphQL in Scala (ScalaMatsuri 2017)
Introduction to GraphQL in Scala (ScalaMatsuri 2017)
 
GenisysでTableauを導入した話
GenisysでTableauを導入した話GenisysでTableauを導入した話
GenisysでTableauを導入した話
 
Microsoft Azure Machine Learning "ちょっと"だけ触ってみた
Microsoft Azure Machine Learning "ちょっと"だけ触ってみたMicrosoft Azure Machine Learning "ちょっと"だけ触ってみた
Microsoft Azure Machine Learning "ちょっと"だけ触ってみた
 
Akka/Actor introduction
Akka/Actor introductionAkka/Actor introduction
Akka/Actor introduction
 
LT Thursday Intro. (Rust使ってみた←釣り)
LT Thursday Intro. (Rust使ってみた←釣り)LT Thursday Intro. (Rust使ってみた←釣り)
LT Thursday Intro. (Rust使ってみた←釣り)
 

DSPでgolangの屍を超えた話 (オレシカナイト Vol.2)