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
ISUCON5 with Golang
Search
y_matsuwitter
December 06, 2015
Programming
2
2.3k
ISUCON5 with Golang
Presentation for GoCon 2015 Winter
y_matsuwitter
December 06, 2015
Tweet
Share
More Decks by y_matsuwitter
See All by y_matsuwitter
経営・意思・エンジニアリング
ymatsuwitter
22
17k
LLM in 2023 and 2024
ymatsuwitter
8
4.5k
Turbulent Technological Changes and Career Strategies
ymatsuwitter
1
2.3k
LLM in toB Service and Its UX
ymatsuwitter
6
9.2k
Agent and small LLM validation
ymatsuwitter
7
2.8k
Information management for a culture of speed: The story of Notion and LayerX
ymatsuwitter
4
9.2k
Monorepo on AWS
ymatsuwitter
0
230
Tech behind LayerX SaaS products
ymatsuwitter
0
2.7k
2022-10-14-geeksai
ymatsuwitter
23
17k
Other Decks in Programming
See All in Programming
Droid Knights 2024 Github Actions 효율적인 배포 환경 만들기
kts6056
0
120
技術カンファレンスをより楽しむためにやるべき N 個のこと / N Things You Should Do to Enjoy Tech Conferences More
mackey0225
2
250
dockerの豆知識を沢山話す
mal0961
1
210
ソートできるUUID v7をJavaで使うときの話
yoshiori
7
5k
Google Cloudで始めるプラットフォームエンジニアリング
ymd65536
0
310
iOS 開発で便利なツールたち
mitsuharu
0
130
エンジニア向け 株式会社バックテック 会社紹介資料 / for Engineers
backtech
1
510
Google I/O 2024 Android 開発ツールの新機能
tonionagauzzi
0
150
BigQueryとDataformとTROCCO®による事業グロース
nihemak
0
220
自分好みの TS バンドラを Rust で作れる!Deno の内部ライブラリの活用 – Denoで変わるランタイムの景色 実践事例 Lunch LT
pizzacat83
4
460
Androidアプリのテスト駆動開発入門
tonionagauzzi
0
140
Amazon Bedrockで行うモデル評価入門 / Introduction to Model Evaluation in Amazon Bedrock
rkaga
2
500
Featured
See All Featured
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
10
3.6k
Docker and Python
trallard
36
2.8k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
118
18k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
188
16k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
5
280
Principles of Awesome APIs and How to Build Them.
keavy
122
16k
What the flash - Photography Introduction
edds
64
11k
Debugging Ruby Performance
tmm1
70
11k
Become a Pro
speakerdeck
PRO
14
4.7k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
661
120k
Code Review Best Practice
trishagee
57
16k
Put a Button on it: Removing Barriers to Going Fast.
kastner
58
3.2k
Transcript
ISUCON戦記 2015 @y_̲matsuwitter Gunosy Inc. 2015.12
2 ©Gunosy Inc. ⾃自⼰己紹介 n Gunosy Inc. – 開発本部執⾏行行役員 CTO
n 業務 – 開発全般のマネジメント – Go⾔言語布教係 n 担当(過去) – iOS/Android – Web – Infrastructure(AWSのみ) n 最近の興味 – Streaming処理理系 – RNN – より良良いクローラの仕組み 松本 勇気 @y_̲matsuwitter https://speakerdeck.com/ymatsuwitter/
3 ©Gunosy Inc. Gunosyについて n 情報キュレーションサービス – iOS/Androidアプリ – Web
n 現在1100万DL突破 n Go⾔言語を約2年年前に導⼊入、現在も ほぼ全てのAPIがGo。
4 ©Gunosy Inc. 本⽇日のアジェンダ ISUCONとは l Iikanjini Speed Up Contest
l 2015年年の戦績について 予選の話 l 課題内容 l Golangを選ぶということ l DBを捨てる話 決勝の話 l 課題内容 l Golangと今回の戦略略 最後に:ISUCONで勝つために 昨年年に引き続き今年年のISUCONについて
5 ©Gunosy Inc. ISUCONとは
6 ©Gunosy Inc. ISUCONとは Iikanjini Speed Up Contest の略略です。 与えられたアプリケーションを全⼒力力でチューニング
1 本戦はサーバ複数台でのチューニング 3 予選はサーバ1台でのチューニング 2 n サーバサイドの総合⼒力力が問われる – 各種ミドルウェアや⾔言語の深い知識識を以て即座に判断を下せること n 1チーム3⼈人 – 短時間での協調作業 n 1台のサーバのリソースを最⼤大限使い潰す – お題は毎年年旬な話題のものが多いです(銀⾏行行とか、SNSとか) n 制限時間は8時間、リモート参加も可能 – AWSやGCPのインスタンスイメージを提出 n 複数台のサーバを組み合わせてリソースを最適化する – 予選と⽐比べてより変数が複雑に。 n 制限時間は7時間、毎年年オンプレ環境 – 試合終了了になるとすぐにサーバが停⽌止する。 サーバサイドの総合⼒力力、判断⼒力力が問われる年年に⼀一度度のお祭り
7 ©Gunosy Inc. ISUCON5 チーム「.dat」の戦績について
8 ©Gunosy Inc. ISUCON5 チーム「.dat」の戦績について スコア: 185905 断トツのトップスコア
9 ©Gunosy Inc. ISUCON5 チーム「.dat」の戦績について Fail
10 ©Gunosy Inc. ISUCON5予選について
11 ©Gunosy Inc. ISUCON5予選のお題 短時間で⼤大量量のクエリを削減するのがポイントだった n いわゆるMixiのようなサイト – ⽇日記、⽇日記コメント、友達関係がある –
N+1クエリが⼤大量量に発⽣生 n 友達がコメントした◯◯の処理理の難しさ – 参照する必要があるクエリが多い・重い – SNSなのでこの処理理はヘビーに叩かれる n 今回はじめてGCPへ – GCPの扱いに不不慣れな⼈人はスタートが遅 れたのかも ISUxiというSNSのチューニングコンテスト
12 ©Gunosy Inc. ISUCONでGolangを選ぶということ n 初期実装はPerl, node.js, Rubyなど主要 ⾔言語がある
n 初回のベンチで⼤大体他 の⾔言語より早い n SQL周りやCPUの扱い など最初からパフォー マンスでる設定 初期ベンチ早い n 簡単にCPU全てを使い 切切れる n Goroutineで簡単に並列列 化 n メモリ空間が共通なの で、並列列処理理とデータ の使い回しが両⽴立立しや すい ⾔言語パフォーマンス n Gofmtなどで規約が勝 ⼿手に揃う n バイナリに依存閉じ込 められるのでデプロイ が楽 n 型があるので協調作業 の時に楽(当社⽐比 運⽤用の軽さ パフォーマンスを出すための素地が初期から整っている Golangにて去年年も今年年も参戦
13 ©Gunosy Inc. 当⽇日の戦略略 基本のチューニング プロセスキャッシュ サーバリソースの効率率率化 データのI/Oのコストを下げる n パラメタの設定
– GOMAXPROCS – GOGC – サーバのリソースを使い切切る n text/template削除 – 単純な⽂文字列列結合の⽅方が早い n UnixDomainSocket化 – Nginx => Goの間でfdを使い尽 くさないように n MySQL上のデータをメモリ上へ – 初期データはdumpして起動時に – データ構造を⾮非正規化 – GoóMySQL間のシリアライズコ スト削減 n Redisは圧縮効率率率のために⼀一部利利⽤用 – 今回だと⽇日記本⽂文データ 毎年年基本的にやっている戦略略で予選はトップスコアへ 基本のチューニングとプロセスキャッシュの実施
14 ©Gunosy Inc. I/Oやシリアライズのコストをケチりたい 1 制限時間というリスクはある 3 再起動耐性とgob 2 GolangでDBを捨てるということについて
n ディスクの読み込み・書き込み処理理を避けたい – MySQLはこの時点で対象から除く n Redisであっても、Redisプロトコルからstring変換のコストがある – Goで処理理することでstructのまま保持。 n 初期データをGoのメモリ上に展開するためにGobを利利⽤用 – Goの型情報をもったエンコーダー・デコーダー n サーバ上のデータを最終的にGobとしてdump、起動時に利利⽤用 – 再起動耐性のレギュレーションに対応できる n DBをほぼ作りなおす構成なので改修コストは⼤大きい – ここは最早職⼈人芸、気合で書く n 並列列処理理耐性についても⾃自分で担保する必要がある – syncパッケージでなんとか切切り抜ける Webサーバというより専⽤用DBに近い構成に近づけていく 今年年は全てのデータをGoで処理理(MySQLもRedisも使わなかった)
15 ©Gunosy Inc. データの変換・運⽤用フロー ①まずMySQL内データを Gobファイルに変換する ②サーバ起動時に初期デ ータGobファイルをメモ リに載せる ③サーバ停⽌止時に結果デ
ータを初期データと別な ファイルへdumpする。 次の起動ではこちらの Gobファイルを優先して 読み込む。 MySQL (元データ) Dump⽤用 Goスクリプト 起動時 初期データ Gobファイル Go Server Process 初回起動時 初期データ Gobファイル OnMemory Key-‐‑‒Value Store Go Server Process OnMemory Key-‐‑‒Value Store 次回起動時⽤用 初期データ Gobファイル
16 ©Gunosy Inc. ISUCON5 決勝について
17 ©Gunosy Inc. ISUCON5本戦のお題 複数のAPIが連携してレスポンスを返すページを如何に⾼高速化するか n 登録ユーザーへ外部APIを叩いて結果表⽰示 – トップページアクセスごとに外部へ最⼤大 7本のリクエストが⾛走る
– ajaxで⼀一定間隔でリクエストされる n APIリクエストの待ちを減らす必要性 – レスポンスが返らないと表⽰示不不可 – 叩くたびに内容が変わるAPIもある – キャッシュの有効度度はAPIごとに変わる n APIごとに暗黙の制限がある – 同時リクエスト数制約など 時代はマイクロサービス「AirISU」
18 ©Gunosy Inc. 当⽇日の戦略略 1台での⾼高速化 複数台での⾼高速化 単体性能の向上 複数台のリソースを使い切切る n 予選同等の⾼高速化
– サーバのリソースを使い切切る n Content-‐‑‒Typeの設定 – httpパッケージの⾼高速化tips n ⼀一部DB値のハードコード化 – データの追加・削除・更更新が発⽣生 しないデータに有効 n Appサーバ2台+DB&Nginx1台 – DBにはMySQLからRedisを採⽤用 – AppはGoのバイナリとnginx – 残りにはRedisとNginx(プロキ シと静的ファイル配信) n CPUを全てのサーバで効率率率的に使い切切 ることを意識識 今回は基本を忠実に守ることでトップスコア(FAIL)を達成 1台でも⾼高速化する施策を優先し、その後複数インスタンス化
19 ©Gunosy Inc. 複数API問い合わせの効率率率化 Goの並列列処理理の楽さが⽣生きたISUCON5本戦 n Sync.WaitGroupの利利⽤用と GoroutineをAPI本数分⽤用意 – 同時に問い合わせ実施
、完了了を待つ処理理の簡 単な実装 n sync.Mutexの利利⽤用 – 最終的なデータのマー ジを安全化 n Golang1.5とhttp2 – ⼀一部APIが対応 syncパッケージとgoroutineを使い、並列列処理理を安全に効率率率化できる
20 ©Gunosy Inc. 当⽇日の様⼦子 ⼀一気にトップに躍り出て最後にFail
21 ©Gunosy Inc. 最後に:ISUCONで勝つために
22 ©Gunosy Inc. ISUCONはパズルみたいなもの 最終的には如何に正しく素早く決断・実装できるかの勝負、総合⼒力力の戦い n どの⾏行行為が⼀一番スコア⾼高いか – スコアの低い処理理の対応時間を減らす n
どこにCPUやメモリを割り当てるべきか正し く判断 – Nginxか?Redisか?Goか? – 各ミドルウェアの特性を把握 n どこのIOを潰せるのか – 不不変なデータはハードコード – ⾮非正規化とオンメモリ化 メモリやCPUを誰にどれだけ割り当てて計算コストを削るか リソース配分、どのプロセスに割り当てるべきか Golang? Redis? Nginx? Other?
23 ©Gunosy Inc. Gunosyでは Go⾔言語で戦っていきたい エンジニアを募集中!!