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.4k
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
Building Products in the LLM Era
ymatsuwitter
10
6.6k
Product Utilization of Large Language Models Starting Today
ymatsuwitter
3
2.5k
経営・意思・エンジニアリング
ymatsuwitter
23
19k
LLM in 2023 and 2024
ymatsuwitter
8
5.5k
Turbulent Technological Changes and Career Strategies
ymatsuwitter
2
2.6k
LLM in toB Service and Its UX
ymatsuwitter
7
10k
Agent and small LLM validation
ymatsuwitter
7
2.9k
Information management for a culture of speed: The story of Notion and LayerX
ymatsuwitter
4
9.9k
Monorepo on AWS
ymatsuwitter
0
290
Other Decks in Programming
See All in Programming
たのしいSocketのしくみ / Socket Under a Microscope
coe401_
8
1.2k
Flutter × Firebase Genkit で加速する生成 AI アプリ開発
coborinai
0
170
Jasprが凄い話
hyshu
0
150
コードを読んで理解するko build
bells17
1
110
ML.NETで始める機械学習
ymd65536
0
230
密集、ドキュメントのコロケーション with AWS Lambda
satoshi256kbyte
1
210
CI改善もDatadogとともに
taumu
0
190
From the Wild into the Clouds - Laravel Meetup Talk
neverything
0
120
Djangoにおける複数ユーザー種別認証の設計アプローチ@DjangoCongress JP 2025
delhi09
PRO
4
460
Generating OpenAPI schema from serializers throughout the Rails stack - Kyobashi.rb #5
envek
1
360
プログラミング言語学習のススメ / why-do-i-learn-programming-language
yashi8484
0
160
CDKを使ったPagerDuty連携インフラのテンプレート化
shibuya_shogo
0
100
Featured
See All Featured
Statistics for Hackers
jakevdp
797
220k
Large-scale JavaScript Application Architecture
addyosmani
511
110k
Visualization
eitanlees
146
15k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
133
33k
Designing for Performance
lara
604
68k
Building an army of robots
kneath
303
45k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.8k
BBQ
matthewcrist
87
9.5k
For a Future-Friendly Web
brad_frost
176
9.6k
Music & Morning Musume
bryan
46
6.4k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
114
50k
Making Projects Easy
brettharned
116
6k
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⾔言語で戦っていきたい エンジニアを募集中!!