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
hami
July 13, 2019
Programming
2.6k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
290
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
2.7k
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
170
コーディングルールの鮮度を保ちたい for SRE NEXT 2026 / keep-fresh-go-internal-conventions-sre-next-2026
handlename
0
160
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
450
Built Our Own Background Agent at LayerX #aidevex_findy
layerx
PRO
9
3.8k
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
290
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
160
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
120
FDEが実現するAI駆動経営の現在地
gonta
2
240
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.4k
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
0
540
Featured
See All Featured
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.5k
Practical Orchestrator
shlominoach
191
11k
Embracing the Ebb and Flow
colly
88
5.1k
How to Ace a Technical Interview
jacobian
281
24k
Un-Boring Meetings
codingconduct
0
350
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
My Coaching Mixtape
mlcsv
0
180
Building AI with AI
inesmontani
PRO
1
1.1k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
The SEO Collaboration Effect
kristinabergwall1
1
510
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Abbi's Birthday
coloredviolet
3
8.9k
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