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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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.6k
Other Decks in Programming
See All in Programming
UIの境界線をデザインする | React Tokyo #15 メイントーク
sasagar
2
360
JAWS-UG横浜 #100 祝・第100回スペシャルAWS は VPC レスの時代へ
maroon1st
0
140
事業会社でのセキュリティ長期インターンについて
masachikaura
0
250
煩雑なSkills管理をSoC(関心の分離)により解決する――関心を分離し、プロンプトを部品として育てるためのOSSを作った話 / Solving Complex Skills Management Through SoC (Separation of Concerns)
nrslib
4
930
How Swift's Type System Guides AI Agents
koher
0
260
YJITとZJITにはイカなる違いがあるのか?
nakiym
0
220
(Re)make Regexp in Ruby: Democratizing internals for the JIT
makenowjust
1
130
The Monolith Strikes Back: Why AI Agents ❤️ Rails Monoliths
serradura
0
330
セグメントとターゲットを意識するプロポーザルの書き方 〜採択の鍵は、誰に刺すかを見極めるマーケティング戦略にある〜
m3m0r7
PRO
0
540
ソフトウェア設計の結合バランス #phperkaigi
kajitack
0
110
ルールルルルルRubyの中身の予備知識 ── RubyKaigiの前に予習しなイカ?
ydah
1
180
TiDBのアーキテクチャから学ぶ分散システム入門 〜MySQL互換のNewSQLは何を解決するのか〜 / tidb-architecture-study
dznbk
1
180
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
100
6.1k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
170
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
170
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.2k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Between Models and Reality
mayunak
3
260
What does AI have to do with Human Rights?
axbom
PRO
1
2.1k
How to Think Like a Performance Engineer
csswizardry
28
2.5k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
150
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
170
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
AI: The stuff that nobody shows you
jnunemaker
PRO
6
570
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