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
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
hami
July 13, 2019
Programming
0
2.4k
High memory usage server in Go
Go Conference'19 Summer in Fukuoka の発表資料です
hami
July 13, 2019
Tweet
Share
More Decks by hami
See All by hami
DeNA.go #01 次世代配車アプリ「MOV」 Go事例紹介
subc
4
9.6k
Other Decks in Programming
See All in Programming
Rails Girls Tokyo 18th GMO Pepabo Sponsor Talk
yutokyokutyo
0
180
20260228_JAWS_Beginner_Kansai
takuyay0ne
5
410
ぼくの開発環境2026
yuzneri
1
290
受け入れテスト駆動開発(ATDD)×AI駆動開発 AI時代のATDDの取り組み方を考える
kztakasaki
2
500
DevinとClaude Code、SREの現場で使い倒してみた件
karia
1
810
ご飯食べながらエージェントが開発できる。そう、Agentic Engineeringならね。
yokomachi
1
270
エージェント開発初心者の僕がエージェントを作った話と今後やりたいこと
thasu0123
0
220
あなたはユーザーではない #PdENight
kajitack
4
290
24時間止められないシステムを守る-医療ITにおけるランサムウェア対策の実際
koukimiura
2
180
CSC307 Lecture 10
javiergs
PRO
1
690
atmaCup #23でAIコーディングを活用した話
ml_bear
4
720
コーディングルールの鮮度を保ちたい / keep-fresh-go-internal-conventions
handlename
0
120
Featured
See All Featured
Docker and Python
trallard
47
3.7k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Marketing to machines
jonoalderson
1
5k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
130
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.2k
Visualization
eitanlees
150
17k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
77
How Software Deployment tools have changed in the past 20 years
geshan
0
32k
What's in a price? How to price your products and services
michaelherold
247
13k
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