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
High memory usage server in Go
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
hami
July 13, 2019
Programming
2.5k
0
Share
High memory usage server in Go
Go Conference'19 Summer in Fukuoka の発表資料です
hami
July 13, 2019
More Decks by hami
See All by hami
DeNA.go #01 次世代配車アプリ「MOV」 Go事例紹介
subc
4
9.7k
Other Decks in Programming
See All in Programming
AIエージェントの隔離技術の徹底比較
kawayu
0
390
AlarmKitで明後日起きれるアラームアプリを作る
trickart
0
140
要はバランスからの卒業 #yumemi_grow
kajitack
0
190
Cloudflare で始める Data Platform
ta93abe
0
210
リセットCSSを1行消したらアクセシビリティが向上した話
pvcresin
4
530
How We Practice Exploratory Testing in Iterative Development( #scrumniigata ) / 反復開発の中で、探索的テストをどう実施しているか
teyamagu
PRO
3
1.1k
Skillは並べた。動かなかった。契約で繋いだ。— 65個のSkillから、自走する開発サイクルへ
junholee
0
680
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
620
WebAssembly を読み込むベストプラクティス 2026年春版 / Best Practices for Loading WebAssembly (Spring 2026)
petamoriken
5
1.1k
RailsTokyo 2026#4: AI様があれば、 Hotwireの弱点は消えるか?
naofumi
4
510
AI時代だからこそ「Bloc」を採用する価値があるのかもしれない
takuroabe
0
220
サプライチェーン攻撃対策「層を重ねて落ちない壁」を10日間で組み上げた話 #TechLeadConf2026
kashewnuts
1
320
Featured
See All Featured
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
150
The Pragmatic Product Professional
lauravandoore
37
7.3k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
570
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
340
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.7k
A Modern Web Designer's Workflow
chriscoyier
698
190k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Claude Code のすすめ
schroneko
67
220k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.8k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Navigating Weather and Climate Data
rabernat
0
190
Transcript
High memory usage server in Go Go Conference ‘19 Summer
in Fukuoka July 13th @haminick
自己紹介 ◦ DeNAサーバサイドエンジニア ◦ 2016年 ~ ゲームプラットフォーム ◦ 2018年 ~
◦ オートモーティブ事業部 ◦ 次世代タクシー配車アプリMOV
本日の資料 twitter #gocon #fukuokago で URL共有中
本日のお題 ◦ 弊社サービス紹介 ◦ 導入: 緯度経度から住所を引くアルゴリズムの話 ◦ 直面 & 想定しうる課題
◦ マスターデータのメモリ読み込みを高速化するには ◦ データがメモリに乗り切らない場合の対策 ◦ 無停止でマスターデータを高速に切り替えるには
弊社のサービス紹介 MOV
地図を利用したサービスでは住所表示が ユーザの利便性向上に寄与することがある
どうすれば緯度経度から住所が引けるのだろう
現在地が九州か本州か判定する例
現在地にピンを指す ピンが九州か本州か調べたい
格子状に区切る
現在地がどの格子に所属するかハッシュ関数で計算
格子に紐づく本州・九州の多角形データと 衝突判定を行いどちらと衝突したかで決定
現在地が九州と判明 なぜ格子で切り出したか -> 多角形データを小さくして高速化する ため
多角形データが九州や本州といった属性と紐付き 衝突判定ができれば緯度経度から住所判定可
実際のデータでやってみる
とある地域の住所に紐づく多角形データをプロットした図
高速に応答を返すため全てメモリにキャッシュ予定だったが メモリに乗り切るのだろうか
High memory usage server in Go
構成
課題 #1 データのメモリ読み込みに時間が 掛かる
データのメモリ読み込みに時間が掛かる対策 起動時の読み込みを諦め、必要になった場合だけ取得 メリット - サーバ起動時間が高速化 デメリット - サーバdeploy・再起動直後に処理が遅延しサーバが停止する可能性
データのメモリ読み込みに時間が掛かる対策 ファイルをアーカイブ - ファイル単位からアーカイブ単位読み込みに変更してオーバーヘッド減り 高速化
データのメモリ読み込みに時間が掛かる対策 ファイルフォーマットをJSONからProtocol Buffersに変更 - 4745 ns/op から 914 ns/op に高速化
benchmark JSON deserialize sample The Go Playground: https://play.golang.org/p/Y1NwD8KWjhF (Playgroundでは動かないソース共有のみ )
課題 #2 データがメモリに乗り切らない規模 になる可能性がある
データがメモリに乗り切らない場合の対策 巨大な1ファイル - streamで処理 複数ファイル - 事前にメモリを確保しLRUアルゴリズムで古いデータから消す
LRUアルゴリズムとは Least Recently Used (LRU) はキャッシュメモリや仮想メモリが扱うデータのリソース への割り当てを決定するアルゴリズムである。対義語はMost Recently Used (MRU)。
和訳すると「最近最も使われなかったもの」つまり「使われてから最も長い時間が経った もの」「参照される頻度が最も低いもの」である。 source: https://ja.wikipedia.org/wiki/Least_Recently_Used
メモリ確保し古いデータをメモリから消すサンプル The Go Playground: https://play.golang.org/p/7J4qWw7fzdr
メモリ確保し古いデータをメモリから消すサンプル -
書き込み時にLockを取る場合は読み込み処理がブロックされ全体実行速度が 落ちる。分散してキャッシュを持つと影響が最小限になる。 sharding して並列実行性能を高める The Go Playground: https://play.golang.org/p/otst7gRww35
メリット - メモリ使用量を制御できる - Garbage Collectionなしでメモリを使いまわせる デメリット - value ごとのsizeバラつきが大きいとメモリ効率悪化
- LRUの実装コスト重い - 既存ライブラリで解決 -> https://github.com/coocood/freecache
課題 #3 サーバ起動中に高速に 新しいデータへ切り替えたい
データ切り替え 高速に切り替える工夫1 - キャッシュA, Bを用意しA利用中に、Bを準備し準備完了したら切り替える ことで、準備時間が長くても影響ないよう工夫した。
データ切り替え 高速に切り替える工夫2 - sync.RWMutex で RLock同士は排他しない仕組みを利用して、逐次処理 を最低限にして高速化する。 RLock() を利用したデータアクセス例
ref: https://qiita.com/y_matsuwitter/items/36565a3a53ac52732cae
Goを採用してここが良かった Lock, Protocol Buffers, Cache といった部品が揃っている 並列処理をシュっと書ける サーバのCPU / メモリを使いきれる
DeNA Go 2019年7月18日にWeb配信予定
twitter: @haminick GitHub: https://github.com/subc