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
11
12k
Product Utilization of Large Language Models Starting Today
ymatsuwitter
3
3.2k
経営・意思・エンジニアリング
ymatsuwitter
23
21k
LLM in 2023 and 2024
ymatsuwitter
8
6.1k
Turbulent Technological Changes and Career Strategies
ymatsuwitter
2
3k
LLM in toB Service and Its UX
ymatsuwitter
7
11k
Agent and small LLM validation
ymatsuwitter
7
3k
Information management for a culture of speed: The story of Notion and LayerX
ymatsuwitter
4
11k
Monorepo on AWS
ymatsuwitter
0
350
Other Decks in Programming
See All in Programming
インターン生でもAuth0で認証基盤刷新が出来るのか
taku271
0
190
フロントエンド開発の勘所 -複数事業を経験して見えた判断軸の違い-
heimusu
7
2.8k
CSC307 Lecture 06
javiergs
PRO
0
690
24時間止められないシステムを守る-医療ITにおけるランサムウェア対策の実際
koukimiura
1
110
AgentCoreとHuman in the Loop
har1101
5
240
組織で育むオブザーバビリティ
ryota_hnk
0
180
AWS re:Invent 2025参加 直前 Seattle-Tacoma Airport(SEA)におけるハードウェア紛失インシデントLT
tetutetu214
2
120
Automatic Grammar Agreementと Markdown Extended Attributes について
kishikawakatsumi
0
200
CSC307 Lecture 10
javiergs
PRO
1
660
生成AIを使ったコードレビューで定性的に品質カバー
chiilog
1
270
責任感のあるCloudWatchアラームを設計しよう
akihisaikeda
3
180
Oxlint JS plugins
kazupon
1
980
Featured
See All Featured
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.3k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
54
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
Embracing the Ebb and Flow
colly
88
5k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.1k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
0
2.3k
Documentation Writing (for coders)
carmenintech
77
5.3k
Site-Speed That Sticks
csswizardry
13
1.1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.1k
Ethics towards AI in product and experience design
skipperchong
2
200
The Pragmatic Product Professional
lauravandoore
37
7.1k
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⾔言語で戦っていきたい エンジニアを募集中!!