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
0
2.3k
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.5k
Other Decks in Programming
See All in Programming
Portapad紹介プレゼンテーション
gotoumakakeru
1
130
エンジニアのための”最低限いい感じ”デザイン入門
shunshobon
0
130
Terraform やるなら公式スタイルガイドを読もう 〜重要項目 10選〜
hiyanger
13
3.2k
ライブ配信サービスの インフラのジレンマ -マルチクラウドに至ったワケ-
mirrativ
2
260
WebAssemblyインタプリタを書く ~Component Modelを添えて~
ruccho
1
910
CSC305 Summer Lecture 05
javiergs
PRO
0
110
Dart 参戦!!静的型付き言語界の隠れた実力者
kno3a87
0
210
Rancher と Terraform
fufuhu
0
110
管你要 trace 什麼、bpftrace 用下去就對了 — COSCUP 2025
shunghsiyu
0
470
Constant integer division faster than compiler-generated code
herumi
2
700
なぜ今、Terraformの本を書いたのか? - 著者陣に聞く!『Terraformではじめる実践IaC』登壇資料
fufuhu
4
650
レガシープロジェクトで最大限AIの恩恵を受けられるようClaude Codeを利用する
tk1351
3
1.2k
Featured
See All Featured
Docker and Python
trallard
45
3.5k
Why Our Code Smells
bkeepers
PRO
338
57k
How to train your dragon (web standard)
notwaldorf
96
6.2k
The Cult of Friendly URLs
andyhume
79
6.5k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
The Invisible Side of Design
smashingmag
301
51k
What's in a price? How to price your products and services
michaelherold
246
12k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Scaling GitHub
holman
462
140k
The Art of Programming - Codeland 2020
erikaheidi
55
13k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.1k
Writing Fast Ruby
sferik
628
62k
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