Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
バッチをGoにリプレイスして高速化した話 / GoGoGolangEdition!
Search
yuma iwasaki
June 23, 2017
Technology
2
28k
バッチをGoにリプレイスして高速化した話 / GoGoGolangEdition!
yuma iwasaki
June 23, 2017
Tweet
Share
More Decks by yuma iwasaki
See All by yuma iwasaki
僕のキャリアとワインと鍋 / daikichijojipm
suthio
10
7.2k
「Laravel Novaの適切な使い方を考えてみる」 / laravel meetup tokyo vol 11
suthio
1
2k
本当は怖くない AWS Lambda / speee_cafe_meetup06
suthio
2
860
広告配信サーバーにおけるBlue Green Deploymentの導入事例について \ SpeeeCafeMeetup05
suthio
3
1.9k
初めての本当の意味でのチーム開発 / pmjp 2016-12-03
suthio
4
1.8k
AWSインフラ構築ツールとしてのTerraform / SpeeeKaigi
suthio
1
2.3k
広告配信サーバーの設計について / Speee Engineer Meeting 2016-06-22
suthio
5
2.7k
しくじり先生 アドネットワーク開発でしくじった話 / yapc8oji
suthio
2
2.1k
Other Decks in Technology
See All in Technology
AI活用を"目的"にしたら、データの本質が見えてきた - Snowflake Intelligence実験記 / chasing-ai-finding-data
pei0804
0
870
バクラクにおける Document Understanding の挑戦:書類の「読取」から「意思決定」へ / document-understanding-in-bakuraku-2026
yuya4
0
190
チームメンバー迷わないIaC設計
hayama17
5
3.5k
LY Tableauでの Tableau x AIの実践 (at Tableau Now! - 2026-02-26)
yoshitakaarakawa
0
1.2k
サンタコンペ2025完全攻略 ~お前らの焼きなましは遅すぎる~
terryu16
1
570
技術キャッチアップ効率化を実現する記事推薦システムの構築
yudai00
2
170
Agentic Codingの実践とチームで導入するための工夫
lycorptech_jp
PRO
0
380
Raspberry Pi AI HAT+ 2 介紹(#49)
piepie_tw
PRO
0
150
AIエンジニア Devin と歩む、自律型運用プロセスの構築
a2ito
0
560
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
95k
Bill One 開発エンジニア 紹介資料
sansan33
PRO
5
18k
パネルディスカッション資料 (at Tableau Now! - 2026-02-26)
yoshitakaarakawa
0
1k
Featured
See All Featured
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
63
53k
Why Our Code Smells
bkeepers
PRO
340
58k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
210
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
470
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.6k
Embracing the Ebb and Flow
colly
88
5k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
68
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
260
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
Reality Check: Gamification 10 Years Later
codingconduct
0
2k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.4k
Transcript
バッチをGo にリプレイスして 高速化した話 株式会社Speee エンジニア 岩崎 裕馬 (@suthio_) バッチをGo にリプレイスして高速化した話
自己紹介 岩崎裕馬(@suthio_) 趣味はおいしいお店探し 株式会社Speee でネイティブ広告の配信システムを開発 2
アジェンダ Go の良いところを紹介 移行の背景 パフォー マンスチュー ニング おまけ まとめ 3
Go の良いところを少しだけ紹介 4
5
実行 ワンバイナリで実行可能 scp で送るだけでどこでも実行可能 - ライブラリの依存などを考える必要がない 高速な実行速度 6
開発 言語仕様がシンプル 型安全性 コンパイルが早い 並列/ 並行処理が行いやすい 7
移行した話 8
結果から先に共有 9
移行前 10
移行後 11
移行前 12
移行後 13
移行前のバッチについて Amazon EMR(Spark) を使用 Spark(Scala) を実行 14
移行後のバッチについて EC2 Container Service(ECS) を使用 Go のバッチアプリケー ションを実行 15
移行前のバッチが抱えていた課題 遅い 10 時間ぐらいかかる 高い r4.2xlarge インスタンスを12 台(6 台 ×
2 クラスタ) で運用 0.64 * 720 * 12 = 5529.6 ドル ロー カルで実行しずらい よく失敗している 原因不明のものが多数 修正しずらい雰囲気 16
移行する際に求めたこと 高速 安価 ロー カルで実行可能 失敗時の原因究明が容易 17
パフォー マンスが良くて、 ロー カルでも実行が簡単で エラー が起こった際も復旧しやすい バッチが求められた 18
パフォー マンスチュー ニング 並列化 アルゴリズム最適化 デー タ量の削減 19
パフォー マンスチュー ニングを 行う際に大切な考え方 コンピュー ティングリソー スを使えきれているかどうか CPU リソー スを使い切れるようにする
ディスクIO、 ネットワー クIO で詰まらせない 計算量は必要最小限となっているかどうか 適切なアルゴリズムを使って計算量を減らす 不必要なオブジェクト生成や計算は極力減らす 20
並列化 実行単位が細かく分けられることがわかったため、 実行単位ごとに並列で処理を行うようにした 通信処理の並列化 21
アルゴリズム最適化 アプリケー ション内でデー タのJoin が多く発生していたので そういった処理をO(1) でできるように 多くのデー タをMap で保持して使用できる形に修正
事前に使用するメモリサイズを予測し、 メモリを確保 ルー プ処理を削減( 関数っぽく書かない) 22
デー タ量削減 Input のデー タサイズ削減 不要なデー タが含まれていたので削除 Output デー タサイズの削減
圧縮してSQS に送信(DynamoDB にも圧縮して保持) 使う際に解凍するようにした 23
圧縮について 圧縮にはSnappy を使用 http://s-yata.jp/docs/snappy/ 今回のデー タを圧縮した結果、 圧縮率は0.783 だったので、 35KB が7.6KB
のデー タになった デー タ自体を圧縮したことにより、 結果的にDynamoDB のRead、Write のCapacity がより少ない状態で も動作するようになり、 コスト削減に繋がった 24
移行する際に求めたこと 早い 安い ロー カルで実行可能 失敗時の原因究明が容易 25
結果 早い: 実行時間は1/10 安い: サー バー 台数は1/6(5529.6 ドルから921.6 ドルに削減) ロー
カルで実行可能: 簡単にできるようになった 失敗時の原因究明が容易: 今のところ困ったことはない 26
おまけ 27
28
Lambda のバッチについて SQS のデー タを定期的にDynamoDB にPut するだけのバッチ Python で実装 29
起こった問題 Lambda を使って、DynamoDB へのPut 処理を行っていたが IO で詰まり、DynamoDB のWriteCapacity を余らせてしまっている 状態となっていた
今回のバッチを高速化したために、 次のボトルネックとなった 30
Lambda のバッチもGo 化しよう!!! 31
Lambda のバッチをGo 化 Lambda 上でGo を実行 Go はワンバイナリなので、NodeJS から 実行ファイルをキックするだけで実行可能
IO でネックが発生していたので、 並列処理が得意なGo を使うことにより、 解決 ロー カルでテストしやすい 32
まとめ 処理時間が長くなりがちなバッチは特にパフォー マンスを意識 コンピュー ティングリソー スを使えきれているかどうか 計算量は必要最小限となっているかどうか 今回のようなバッチではパフォー マンスチュー ニングがしやすく、
並列処理が得意なGo を使うのは良い選択だった 33