Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ISUCONに強くなるかもしれない日々の過ごしかた/Findy ISUCON 2024-11-14
Search
FUJIWARA Shunichiro
November 13, 2024
Technology
1.6k
12
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ISUCONに強くなるかもしれない日々の過ごしかた/Findy ISUCON 2024-11-14
https://findy.connpass.com/event/334902/
FUJIWARA Shunichiro
November 13, 2024
More Decks by FUJIWARA Shunichiro
See All by FUJIWARA Shunichiro
多摩川(.dev)ランニング入門 / Tamagawa.dev#3
fujiwara3
3
510
クラウドを使う側から、作る側へ / 大吉祥寺.pm 2026前夜祭
fujiwara3
8
2.1k
作るべきものと向き合う - ecspresso 8年間の開発史から学ぶ技術選定 / 技術選定con findy 2026
fujiwara3
9
6k
さくらのクラウドでのシークレット管理を考える/tamachi.sre#2
fujiwara3
2
400
Amazon ECS デプロイツール ecspresso の開発を支える「正しい抽象化」の探求 / YAPC::Fukuoka 2025
fujiwara3
13
14k
パフォーマンスチューニングのために普段からできること/Performance Tuning: Daily Practices
fujiwara3
9
6.9k
alecthomas/kong はいいぞ
fujiwara3
7
2.6k
ecspressoの設計思想に至る道 / sekkeinight2025
fujiwara3
12
3.8k
さくらのIaaS基盤のモニタリングとOpenTelemetry/OSC Hokkaido 2025
fujiwara3
4
5.5k
Other Decks in Technology
See All in Technology
HRC_Frontend_Conference_Fukuoka_2026.pdf
ts020
0
720
登壇の自信を奪う3匹のオバケ / 3 Ghosts That Rob You of Your Confidence in Public Speaking
pauli
8
910
HHKBエバンジェリストになる方法
941
0
100
Geolonia の開発現場における AIの活用について
miya0001
0
100
What the customer really needed
kawaguti
PRO
1
160
開発投資の期待値を上げるプロダクトロードマップづくり ~プロダクトエンジニアが越境して事業を伸ばす~
kekekenta
1
160
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
3
500
Issue 駆動でスペシャリストの意図を届ける、AI 実装のアクセシビリティ向上
thkt
0
110
AI de Idea
kawaguti
PRO
2
110
20260912_スクフェス三河
kgnkhkr
0
380
生成AIエージェントを用いた、 手動テスト手順書から自動テストへの 変換手法の検討
magicpod
0
160
絵ではじめるKubernetesセキュリティ
aoi1
3
550
Featured
See All Featured
Darren the Foodie - Storyboard
khoart
PRO
4
3.9k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
850
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.7k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
330
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Agile that works and the tools we love
rasmusluckow
331
22k
4 Signs Your Business is Dying
shpigford
187
23k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
280
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
280
Product Roadmaps are Hard
iamctodd
55
13k
Transcript
ISUCONに強くなるかもしれない日々の過ごしかた ISUCON常勝軍団の頭の中〜メンバー集めから解き方の秘密まで〜 2024-11-14 藤原俊一郎 @fujiwara
自己紹介 @fujiwara (X, GitHub, Bluesky) 面白法人カヤック SREチーム ISUCON 優勝4回 /
運営(出題)4 回 github.com/kayac/ecspresso github.com/fujiwara/lambroll
「ISUCONの練習方法を教えてください」 「ISUCONの練習」には2種類ある 1. 「ISUCONという競技に慣れるための練習」 2. そもそも「パフォーマンスが高い」ものを作るための練習
「ISUCONという競技に慣れるための練習」 競技のルールを理解する 競技をスムーズに実施できるようになる 1. インスタンスを起動してsshで入る 2. GitHubにprivate repoを作ってコードをpush 3. コードを編集
/ commit / デプロイ(再起動) 4. ベンチマークを実行して結果をまとめる …などなど 参加したことがない人は1回はやってください (当日まごつくと単に時間がもったいない)
そもそも「パフォーマンスが高い」ものを作れるようになる これを 「ISUCONの過去問でやる」 のは効率が悪い 練習、年に何時間やりますか…? 普段の日々の過ごしかたで強くなるほうがずっと時間を使える
全プログラマーが知るべきレイテンシー数 nano sec L1キャッシュ参照 0.5 分岐予測失敗 5 L2キャッシュ参照 7 Mutexのロックとアンロック
25 メインメモリー参照 100 Zippy[Snappy]による1KBの圧縮 3,000 1Gbpsネットワーク越しに2KBを送信 20,000 メモリーから連続した1MBの領域の読み出し 250,000 同一データセンター内におけるラウンドトリップ 500,000 0.5 msec ディスクシーク 10,000,000 10 msec ディスクから連続した1MBの領域の読み出し 20,000,000 20 msec パケットをカリフォルニア→オランダ→カリフォルニアと送る 150,000,000 150 msec http://norvig.com/21-days.html#answers
実際のISUCON/Webアプリケーションのチューニングでは CPU内(L1キャッシュにヒットするとか)まではあまり気にしない 他のところがもっと圧倒的に遅いことが多い ある処理がCPUとメモリで完結するか 例: プロセス内のメモリキャッシュ ローカルディスクを読み書きするか (最近は少ないですね) データセンター内の別サーバーにアクセスするか 例:
DBへのクエリ (0.5 ms〜∞) 地理的に離れた場所にアクセスするか(その距離は?) 例: 外部APIアクセス (10 ms〜∞) 処理単位でこれらのレイテンシを常に意識するのが大事
ISUCONの場合 # ISUCON13 ruby実装 get '/api/tag' do tag_models = db_transaction
do |tx| tx.query('SELECT * FROM tags') end json( tags: tag_models.map { |tag_model| { id: tag_model.fetch(:id), name: tag_model.fetch(:name), } }, ) end 「DBにSQLを発行して結果をJSONにしている」のが分かりやすい 実際に発行しているSQLも書いてある
実際のWebアプリケーションの場合…… @items = current_user.items .is_active .preload(:tags) .page(page).per(per) 見た目ではおそらく…… DBで items
テーブルをクエリしていそう tags テーブルにもクエリしてそう(preload) でも本当にそうなのかはもっとよく調べないと分からない Redisやメモリにcacheしているかもしれない 外部APIにリクエストを発行しているかもしれない(!!?)
ISUCONの問題は「養殖物」 あえてパフォーマンスに問題があるように意図的に作られたもの アプリケーション自体の層は薄いのでコードを読み切れる コードは全て読まれる前提で、問題があるところを直してもらいたい これだけで練習すると特定の力しか付かない
「天然物」を相手にして力を養う 誰も「遅くしよう」と思って作ってはいない(けど遅い) アプリケーションが重厚長大(特に歴史が長いと) コードは簡単に読み切れる分量ではない 機能の実装や改修時に「ここでは実際に何が起きる?」を考える/検証する癖を付ける
マイクロベンチマークを手癖にする 例:「Goでsliceに要素を追加する場合、先にキャパシティを確保したほうが速い」 func AppendFromEmpty(n int) { var s []int //
sliceを宣言するだけ for i := 0; i < n; i++ { s = append(s, i) } } func AppendFromPreallocated(n int) { s := make([]int, 0, n) // capacityをn個分確保したslice for i := 0; i < n; i++ { s = append(s, i) } }
Go標準のtestingモジュールでベンチマークができる import "testing" func BenchmarkAppendFromEmpty(b *testing.B) { for i :=
0; i < b.N; i++ { AppendFromEmpty(10000) } } func BenchmarkAppendFromPreallocated(b *testing.B) { for i := 0; i < b.N; i++ { AppendFromPreallocated(10000) } } $ go test -bench . -benchmem (他の言語でも同じようなものがあります)
$ go test -bench . -benchmem goos: linux goarch: amd64
pkg: example.com/bench cpu: AMD Ryzen 5 3400G with Radeon Vega Graphics BenchmarkAppendFromEmpty-8 9975 121229 ns/op 357627 B/op 19 allocs/op BenchmarkAppendFromPreallocated-8 43009 27803 ns/op 81920 B/op 1 allocs/op 事前にcapacityを確保する=メモリのアロケートが減る 4倍速い、ことがわかる
折に触れて「これはどれぐらい時間が掛かる?」を意識して検証する ISUCONに近いところの例だと… MySQLでprimary keyで1行引くだけのクエリ MySQLで100万行を読んで1行だけ返すクエリ Redisのget/set... 使っている言語のHTTPクライアントでリクエストを送受信 使っているフレームワークでHello Worldを返すだけのアプリ https://www.techempower.com/benchmarks/
1MBのJSONをencode/decode
早すぎる最適化は「悪」 「ボトルネック以外を改善しても(あまり)意味がない」のは間違いない 細か過ぎるチューニングを無闇に入れてもスコアは上がらない 「推測するな計測せよ」 でもどこから計測すれば…? 「ここでこんな時間掛かるのおかしいよね」 の当て感を身につける そのためには 「書いた処理のレイテンシを常に意識する」 「気になった処理のマイクロベンチマークを手癖にする」
のが役に立ちます
実例: ISUCON 11 優勝の分岐点 Zipを生成してダウンロードさせる機能 初期実装は zip 外部コマンド呼び出し → Go
の archive/zip で作成するように fujiwara組: zip.Store (非圧縮)を指定してCPUコスト削減 NaruseJun: 圧縮(deflate)したZipを生成 ← 非圧縮だったら逆転していたらしい