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 まとめ
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
changkita
January 08, 2018
Programming
0
74
ISUCON5 まとめ
ISUCON5のまとめです
changkita
January 08, 2018
Tweet
Share
More Decks by changkita
See All by changkita
仮想通貨こわい
kitah
0
36
ISUCON7 まとめ
kitah
0
35
強化学習
kitah
0
93
Other Decks in Programming
See All in Programming
Implementation Patterns
denyspoltorak
0
280
そのAIレビュー、レビューしてますか? / Are you reviewing those AI reviews?
rkaga
6
4.5k
CSC307 Lecture 03
javiergs
PRO
1
490
責任感のあるCloudWatchアラームを設計しよう
akihisaikeda
3
160
AgentCoreとHuman in the Loop
har1101
5
220
ぼくの開発環境2026
yuzneri
0
110
HTTPプロトコル正しく理解していますか? 〜かわいい猫と共に学ぼう。ฅ^•ω•^ฅ ニャ〜
hekuchan
2
680
CSC307 Lecture 05
javiergs
PRO
0
500
AI時代の認知負荷との向き合い方
optfit
0
150
ThorVG Viewer In VS Code
nors
0
770
AIと一緒にレガシーに向き合ってみた
nyafunta9858
0
170
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
400
Featured
See All Featured
The Language of Interfaces
destraynor
162
26k
4 Signs Your Business is Dying
shpigford
187
22k
Are puppies a ranking factor?
jonoalderson
1
2.7k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.3k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
0
3.4k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
410
The Cost Of JavaScript in 2023
addyosmani
55
9.5k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
430
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
0
1.9k
A better future with KSS
kneath
240
18k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.4k
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͕ྑ͍ •
ϘϦϡʔϜ͕݁ߏ͋ͬͯେมͩͬͨΈ͍ͨ