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
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
430
SREの越境 / SRE Collaboration
y0hgi
2
310
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
390
Jetpack Compose Mechanisms
skydoves
3
820
Next.js: The final boss of Web Performance
guaca
0
250
最近”作らせてる” ローカルAIアプリの話
akit37
0
470
AmebaブログはKMPから卒業します
kmars0605
0
190
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
5.1k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
180
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
410
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
210
R8 の設定見直しでアプリサイズ削減
andpad
0
220
Featured
See All Featured
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
310
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
22k
Deep Space Network (abreviated)
tonyrice
0
370
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Making the Leap to Tech Lead
cromwellryan
135
10k
Balancing Empowerment & Direction
lara
6
1.3k
Embracing the Ebb and Flow
colly
88
5.2k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
300
From π to Pie charts
rasagy
1
400
Designing for Timeless Needs
cassininazir
1
530
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͕ྑ͍ •
ϘϦϡʔϜ͕݁ߏ͋ͬͯେมͩͬͨΈ͍ͨ