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
ISUCON5 まとめ
Search
changkita
January 08, 2018
Programming
76
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ISUCON5 まとめ
ISUCON5のまとめです
changkita
January 08, 2018
More Decks by changkita
See All by changkita
仮想通貨こわい
kitah
0
46
ISUCON7 まとめ
kitah
0
40
強化学習
kitah
0
97
Other Decks in Programming
See All in Programming
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
2
680
自サークルのIdPからログアウトできるようになるまで
taiseiue
1
140
すこし踏み込む CancellationToken
htkym
2
1.7k
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
420
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
350
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
460
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
220
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
170
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
28
32k
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
210
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
150
golang-bob.pdf
iwatsukayura
0
130
Featured
See All Featured
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
500
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
630
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
380
Fantastic passwords and where to find them - at NoRuKo
philnash
53
4k
Crafting Experiences
bethany
1
380
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
460
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
570
My Coaching Mixtape
mlcsv
0
360
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
550
Thoughts on Productivity
jonyablonski
76
5.4k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
Transcript
ISUCON5 ·ͱΊ kita.h
ISUCON5 ༧બ ʮISUxiʯ • ͓ʮSNSʯ • هɺίϝϯτɺ༑ୡϦετͳͲ • σʔλϕʔεΛࠅ͢Δػೳ͕ଟ͍ •
mi◦iͩΑͶଟɻxi͍ͬͯͭͯΔ͠ • ϛυϧΣΞͷνϡʔχϯά͚ͩͰେ͖͘είΞΛ্ ͛Δͷͪΐͬͱݫͦ͠͏
ISUCON5 ༧બͰͷϝΠϯτϐοΫ • ʮN+1ʯ͕ϝΠϯ • ʮN+1ʯؚΊ੍ͯݶ࣌ؒҎʹରॲ͖͠Εͳ ͍͘Β͍ଟ͘ͷ͕ʮ/ʯʹࠐΊΒΕͯͨ • ʮ/ʯϖʔδͷϘτϧωοΫʹ͍ͭͯΛجຊతʹղઆ
N+1 • ʮ/ʯϖʔδͰ”is_friend?”ͱ”get_user”ͷେྔͷݺͼग़͠ ͕͋ͬͨ • ͜ΕΒ”user_id”ʹඥͮ͘σʔλͳͷͰSQLͰjoin͢Δ͜ͱ Ͱݺͼग़͠Λͳͤ͘Δ • ͘͠ɺ”users”ςʔϒϧʹ5000͔݅͠σʔλ͕ͳ͍ͷ Ͱશ݅Ωϟογϡ͢Δ͜ͱͰΫΤϦͷݺͼग़͠Λແͤͨ͘
• ʮ༑ୡΛΊΔʯػೳ͕ͳ͔ͬͨͷͰɺ”relations”ςʔϒϧ ॳظσʔλ50ສ݅Λશ݅Ωϟογϡ͢Δ͜ͱͰΫΤϦͷ ݺͼग़͠Λ͑ΒΕͨ
༑ͩͪͷهΤϯτϦ/ίϝϯτ • ʮ༑ͩͪͷهΤϯτϦʯͱʮ༑ͩͪͷίϝϯτʯ͕ “is_friend?”ΛେྔʹݺΜͰ͍ͨ • ༑ͩͪͷ࠷৽هΤϯτϦΛ10݅औಘ͍ͨ͠ͱ͍͏Ϋ ΤϦɺ”relations”ςʔϒϧΛjoin͢Δ͔ɺ༑ͩͪͷid ϦετΛ͏͜ͱͰ͜Μͳײ͡ʹ SELECT *
FROM entries WHERE user_id IN (:friend_ids:) ORDER BY id DESC LIMIT 10
༑ͩͪͷهΤϯτϦ/ίϝϯτ • ༑ͩͪͷ࠷৽ίϝϯτ10݅”permitted?”ʹ͋ΔN+1 ͕͋ΔͨΊҰखؒඞཁ • ҎԼͷ݅Λߟྀ͢Δ ‣ private=0(ެ։)ͷΤϯτϦͷίϝϯτදࣔ͢Δ ‣ private=1(༑ͩͪݶఆެ։)ͷΤϯτϦͷίϝϯτ
permited?͕trueͳΒOK
༑ͩͪͷهΤϯτϦ/ίϝϯτ • SQLʹ͢Δͱ SELECT * FROM comments c JOIN entries
e ON c.entry_id = e.id WHERE c.user_id IN (:friend_ids:) AND ( e.private = 0 OR e.private = 1 AND (e.user_id = :my_user_id OR e.user_id IN (:friend_ids:)) ) ORDER BY c.id DESC LIMIT 10
༑ͩͪͷهΤϯτϦ/ίϝϯτ • “entries/comments”Λऔಘ͢Δ͕݅มΘͬͨͷͰඞཁ ͳINDEX(user_id)ΛՃͯ͠ɺཁΒͳ͘ͳͬͨ INDEX(created_at)ޮͷͨΊམͱ͓ͯ͘͠ͱྑ͍ • DROP TABLE “ςʔϒϧ໊”ͰςʔϒϧΛফ͢ ALTER
TABLE comments ADD INDEX user_id (user_id), DROP INDEX created_at; ALTER TABLE entries DROP INDEX created_at;
͋ͱ • ಉ͡ʹಉ͡Ϣʔβ͕͚ͨ͋ͱ࠷৽ͷͷ͚ͩ ΔΑ͏ʹߋ৽͢Εදࣔ͢Δͱ͖ͷGROUP BYΛͳ ͤ͘Δ • ͭ·Γɺಉ͡ʹಉ͡Ϣʔβ͕͋ͱΛ͚Δ࣌ INSERTͷΘΓʹUPDATE͢Δɺ͍ΘΏΔUPSERTΛ͠ ͍ͨɻREPLACEจͰ؆୯ʹͰ͖Δ
REPLACE INTO footprints (user_id, owner_id, date) VALUES (?,?,NOW())
هΤϯτϦͷຊจ • ʮ/ʯϖʔδͰهΤϯτϦͷλΠτϧ͔͠Θͳ͍ ͷʹɺλΠτϧͱຊจ͕ಉ͡ΧϥϜʹอଘ͞Ε͍ͯΔͷ ͰαΠζͷେ͖ͳຊจΛຖճऔಘ͍ͯ͠Δͷ͕ແବ • λΠτϧ͚ͩมߋ͢ΔΑ͏ʹ͢ΕOK SELECT id, SUBSTRING_INDEX(body,
‘\n’, 1) AS title FROM entries WHERE user_id = ? ORDER BY created_at LIMIT 5
༑ͩͪͷهΤϯτϦ/ίϝϯτɹผղ • ʮISUxiʯͰ͜͜·ͰͰ͖ΕेߴԽͰ͖Δ • ͔͠͠ɺͬͱେ͖ͳσʔληοτΛͭݱ࣮ͷSNSͰ ʮ༑ͩͪͷهΤϯτϦ/ίϝϯτʯͷॲཧ͜ͷ· ·Ͱ࣮༻ʹ͑ͳ͍ • ͜Ε͡Όͪΐͬͱ͖͍ͭˣ SELECT
* FROM entries WHERE user_id IN (:friend_ids:) ORDER BY id DESC LIMIT 10
༑ͩͪͷهΤϯτϦ/ίϝϯτɹผղ • Ϣʔβ1ਓ͋ͨΓ100ਓલޙͷ༑͕ͩͪډͯɺϢʔβ1ਓ ͋ͨΓ100݅ͷΤϯτϦΛ࣋ͭISUxiͰɺ༑ͩͪͷ ࠷৽ΤϯτϦ10݅Λऔಘ͢Δ͖ͬ͞ͷΫΤϦҎԼͷ Α͏ʹಈ࡞͢Δ ‣ ͯ͢ͷΤϯτϦͷத͔Β༑ͩͪ(100ਓ)ͷΤϯτ Ϧ(ͻͱΓ͋ͨΓ100݅)Λ·ͣநग़(߹ܭ10000݅) ‣
ฒͼॱΛߘॱʹฒͼସ͑Δ ‣ ࠷৽ΤϯτϦ10݅Λฦ͢
༑ͩͪͷهΤϯτϦ/ίϝϯτɹผղ • ͜Ε༑͕ͩͪͨ͘͞Μ͍ΔϢʔβΤϯτϦΛଟ͘ߘ ͍ͯ͠Δ༑ͩͪΛ࣋ͭϢʔβޮΑ͘σʔλΛநग़Ͱ͖ ͳ͘ͳΔ • ϑϨϯυλΠϜϥΠϯॲཧΛͲ͏࣮͖͔͕͍͢͠ • ࢀরޮʹಛԽͨ͠Ξϓϩʔνɺࢀর࣌ʹ༑ͩͪͷදࣔ ͍͍ͯ͠ΤϯτϦΛஅ͔͖ͯ͠ूΊΔͷͰͳ͘ɺΤϯ
τϦߘ࣌ʹͦͷΤϯτϦΛද͍͍ࣔͯ͠ߘऀͷ༑ͩͪ ͷ࠷৽ΤϯτϦҰཡʹΤϯτϦΛ৴͢Δ • ͜ͷΞϓϩʔνɺpushܕinboxܕͱݺΕ͍ͯΔ
༑ͩͪͷهΤϯτϦ/ίϝϯτɹผղ • ͜ͷΞϓϩʔνͰinboxςʔϒϧʹ৴͞ΕͨΤϯτϦ ɺ༑ͩͪͷ༑͕ͩͪߘͨ͠ΤϯτϦͷʹؔ ΘΒͣҎԼͷΫΤϦͰ࠷৽ͷΤϯτϦ͚ͩΛऔΓग़ͤ Δ
ΈΜͳͷͬͯͨ͜ͱ • entries͔ΒtitleΧϥϜΛ͢Δ • /initializeͰͷRedisσʔλॳظԽ • ϕϯν։࢝࣌ʹ/initializeΞΫηε͕དྷͯɺͦ͜ͰॳظσʔλҎ֎ͷ σʔλআ͞ΕΔ͕ɺͦͷλΠϛϯάͰRedisͷσʔλ߹ੑ ΛͱͬͯॳظԽ͢Δ •
MySQLͷॳظσʔλʹରԠ͢ΔRedisͷॳظσʔληοτΛ࡞ Γɺ”redis-cli config set appendoonly yes”ͱͯ͠ɺaofϑΝΠϧΛ ు͖ग़͠ɺinitialize࣌ʹredis-cliͰಡΈࠐΊ2ඵͰϩʔυ͕ऴΘΔ
ΈΜͳ͕ϋϚͬͨϙΠϯτ • AppArmorͷ͍ͤͰmy.cnfΛมߋͯ͠ɺͦΕ͕దԠ͞ Ε͍ͯͳ͍ ‣ apt-get purgeͰ࠷ॳʹফ͓ͯ͘͠ͷ͕ݡ͍Έ͍ͨ • iptablesಉ༷ʹpurge͕ྑ͍ •
ϘϦϡʔϜ͕݁ߏ͋ͬͯେมͩͬͨΈ͍ͨ