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
ISUCON7 まとめ
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
changkita
January 08, 2018
Programming
0
35
ISUCON7 まとめ
ISUCON7の予選のまとめ
changkita
January 08, 2018
Tweet
Share
More Decks by changkita
See All by changkita
仮想通貨こわい
kitah
0
36
強化学習
kitah
0
93
ISUCON5 まとめ
kitah
0
74
Other Decks in Programming
See All in Programming
AI & Enginnering
codelynx
0
110
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
490
【卒業研究】会話ログ分析によるユーザーごとの関心に応じた話題提案手法
momok47
0
190
例外処理とどう使い分ける?Result型を使ったエラー設計 #burikaigi
kajitack
16
6k
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
5.9k
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
1
230
Automatic Grammar Agreementと Markdown Extended Attributes について
kishikawakatsumi
0
180
コマンドとリード間の連携に対する脅威分析フレームワーク
pandayumi
1
450
Kotlin Multiplatform Meetup - Compose Multiplatform 외부 의존성 아키텍처 설계부터 운영까지
wisemuji
0
190
15年続くIoTサービスのSREエンジニアが挑む分散トレーシング導入
melonps
2
170
OCaml 5でモダンな並列プログラミングを Enjoyしよう!
haochenx
0
130
CSC307 Lecture 02
javiergs
PRO
1
770
Featured
See All Featured
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
56
50k
4 Signs Your Business is Dying
shpigford
187
22k
We Have a Design System, Now What?
morganepeng
54
8k
Leo the Paperboy
mayatellez
4
1.4k
The Language of Interfaces
destraynor
162
26k
HDC tutorial
michielstock
1
360
Design in an AI World
tapps
0
140
Scaling GitHub
holman
464
140k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
200
Designing Experiences People Love
moore
144
24k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
110
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
110
Transcript
ISUCON7ͷ·ͱΊ νʔϜ ʮத͕গ͍͠ఔԦࠃʯ
ISUCON • Iikanjini Speed Up Contestͷུ • ͓ͱͳΔWebαʔϏεΛܾΊΒΕͨϨΪϡ ϨʔγϣϯͷதͰݶք·ͰߴԽΛਤΔνϡʔ χϯάότϧ
• ࠓճISUCON7ʹࢀՃ͠·ͨ͠
ࠓճͷΞϓϦέʔγϣϯ • νϟοτΞϓϦέʔγϣϯ(ͱ͍͏إΛͯ͠ը ૾৴͕ϘτϧωοΫ) • N+1ը૾ͷΞοϓϩʔυɺ؆୯ͳϦΞ ϧλΠϜཁૉͳͲ • ༧બ͔Βαʔόʔ͕3͋ͬͨ
੩తϑΝΠϧͱը૾ϑΝΠϧͷΩϟογϡ • ݩʑ੩తϑΝΠϧը૾CDNܦ༝ͷΞΫη εͳͷͰ”Cache-Control: public, max- age=3600”Λ͚ΕࣗྗͰ৴͢Δඞཁ ͳ͍ɺͱ͍͏ʹ͢Δ༧ఆͩͬͨΒ͍͠
੩తϑΝΠϧͱը૾ϑΝΠϧͷΩϟογϡ • ϕϯνϚʔΧʔҰఆͷϖʔεͰϢʔβΛ૿ ͢ͷͰɺΩϟογϡ͕ͳ͍ɺ͋Δ͍Ϣʔβʔ ୯ҐͷΩϟογϡͰϢʔβʔʹൺྫͨ͠ μϯϩʔυଳҬ͕ඞཁʹͳΓɺޙ͙͢ʹ ଳҬΛανͬͯ͠·͏ • ανΔ :
saturation()
੩తϑΝΠϧͱը૾ϑΝΠϧͷΩϟογϡ • Ϣʔβʔ͕૿͑ͯμϯϩʔυଳҬΛα νΒͤͳ͍ͨΊʹɺCDNʹΑΔΩϟογϡ ͕ޮ͍͍ͯΔͱ͍͏લఏʹͯ͠Ϣʔβʔ͕ ૿͑ͯը૾1ͭ͋ͨΓͷμϯϩʔυ͕૿ ͑ͳ͍ઃܭ͕ඞཁͩͬͨ
CDN(ίϯςϯπσϦόϦʔωοτϫʔΫ) • ΣϒίϯςϯπΛΠϯλʔωοτͰ৴͢ ΔͨΊʹ࠷దԽ͞ΕͨωοτϫʔΫͷ͜ͱ • αʔόʔΛҰՕॴʹஔ͘ͷͰͳ͘ɺཧతɾ όοΫϘʔϯతʹࢄͤ͞Δ͜ͱͰɺෛՙΛ ݮΒ͢
DBͷը૾σʔλΛϑΝΠϧʹग़ྗ • ը૾DBͷimageςʔϒϧʹೖ͍ͬͯͨͷͰɺ ͦΕΛ੩తϑΝΠϧͱͯ͠ग़ྗ͠ɺnginxͰ৴ ͢Δํ๏͕είΞ্ҐνʔϜͰͱΒΕ͍ͯͨ • ಉ͡༰ͷը૾͕ಉ͡ϑΝΠϧ໊Ͱॏෳొ͞ Ε͓ͯΓɺແବʹDB͔Βͷऔಘ͕ൃੜ͍ͯͨ͠ ͜ΕɺLIMIT 1Λ͚Εେৎ
DBͷը૾σʔλΛϑΝΠϧʹग़ྗ
cache-control • Ϩεϙϯε/ϦΫΤετʹରͯ͠Ωϟογϡͷ ৼΔ͍Λ੍ޚ͢ΔͨΊͷࢦࣔΛࢦఆ͢Δͨ Ίʹར༻͞ΕΔ • ͍͔ʹը૾ΛΩϟογϡͤͯ͞αʔόʔ͔Β σʔλΛฦ͞ͳ͍Α͏ʹ͢Δ͔
εςʔλείʔυ304 (Not Modified) • 3xxϦμΠϨΫτ • 304ະߋ৽Λද͢ • Ωϟογϡͷ༗ޮແޮͷ֬ೝ͖ϦΫΤετ ʹରͯ͠ɺ༗ޮͰ͋Δ߹ʹฦ͢εςʔλε
ίʔυ
cache-control • public • max-age
cache-control • public • ڞ༗Ωϟογϡʹอ࣋ͯ͠ ྑ͍͜ͱΛࢦࣔ͢Δ
ڞ༗Ωϟογϡ • ෳͷϢʔβ͕࠶༻͢ΔͨΊʹϨεϙϯε Λอଘ͢ΔΩϟογϡ
cache-control • max-age • max-age͕1Ҏ্ͷ߹ɺ ͦͷඵΫϥΠΞϯτ ϦΫΤετΛߦΘͳ͍
cache-control • add_header Cache-Control “public, max- age=31536000”; • /js//css/ʹ͍ͭͯಉ༷ʹ
cache-control • immutable : ࢦఆ͢ΔͱΩϟογϡΛ immutable(ෆม)ʹͰ͖ɺϒϥβΩϟογϡ ͕freshͰ͋ΕϦϩʔυ࣌Ͱώοτͤ͞ΔΑ ͏ʹͳΔ • Ϧϩʔυ࿈ൃ͞ΕͯແବͳϦΫΤετΛ͛Δ
• ࠓճ͋·Γؔͳ͔༷ͬͨ
cache-control • etag : Ωϟογϡ͞Ε͍ͯΔίϯϙʔωϯτͷ ༗ޮੑΛݕূ͢ΔΈ • ෳαʔόʔͰetag͕ҰகͤͣʹΩϟογϡ ͕ΘΕΔՄೳੑ͕ۃʹ͘ͳͬͯ͠·͏ •
؆୯ʹճආ͢Δʹetag = off;ͱͯ͠ແޮʹ͠ ͯ͠·͏ͷ͕ྑ͍
Ωϟογϡศར͚ͩͲා͍ • ϑϦϚΞϓϦ͕CDNͷ༻ѲΛؒҧ͑ͨ ͨΊɺձһใΛCDNʹΩϟογϡͯ͠͠· ͍ɺݸਓใ͕࿙Ӯͨ͠ • “private”Ͱͳ͘ɺ“no-cache”Λͬͨͨ Ίɺϖʔδ͕Ωϟογϡ͞Εͯ͠·͍ͬͯͨ
cache-control
GET /fetchͱGET /message • ΤϥʔλΠϜΞτ͕ͳ͍߹ɺຖඵ৽ن Ϣʔβʔ͕ొͯ͘͠Δ • ϝοηʔδͷߘϢʔβʔʹൺྫ͢Δ ͕ɺड৴2ʹൺྫ͢Δ •
ϘτϧωοΫΛ௵ͯ͠ϝοηʔδͷྲྀྔΛ্ ͍͚͛ͯείΞ͕͕͋ΔઃܭΒ͍͠
GET /fetchͱGET /message • “GET /fetch”ʹείΞ͕ͳ͘ɺ ”GET /message”ʹड৴ϝοηʔδʹՃ ࢉ͞ΕΔͱ͜Ζ͕ϙΠϯτ
GET /fetchͱGET /message • ΫϥΠΞϯτ”GET /fetch”ΛϙʔϦϯά͍ͯ͠ ͯɺӾཡதͷνϟϯωϧʹ৽ணϝοηʔδ͕͋ Δͱ”GET /message”ΛݺΜͰ৽ணϝοηʔδΛ ड৴͢Δ
• “GET /fetch”ͷϨεϙϯεΛ͍͘Βվળͯ͠ɺ ৽ணϝοηʔδ͕ͳ͍ͱείΞ্͕Βͳ͍
GET /fetchͱGET /message • Ӿཡதͷνϟϯωϧʹ৽ணϝοηʔδ͕1݅͋ Δঢ়ଶͰ͙͢ʹฦͯ͠ɺ”GET /message”Ͱ 1ͱͦ͜ʹؚ·ΕΔ1ϝοηʔδͷ1Ͱ̼ 2ϦΫΤετͰ2͔͠Ք͛ͳ͍
GET /fetchͱGET /message • “GET /fetch”ΛλΠϜΞτʹͳΒͳ͍ൣғͰ Θ͟ͱͯͭ͘͜͠ͱͰɺ”GET /message” 1ϦΫΤετͰे݅ͷϝοηʔδΛऔಘͰ ͖ΔΑ͏ʹͳΓɺ2ϦΫΤετͰेՔ͛Δ
Α͏ʹͳΔ
GET /fetchͱGET /message • “GET /fetch”ͱ”GET /message”N+1ΫΤϦ COUNTΫΤϦͳͲॏ͍ͨॲཧ • ୯ʹॲཧΛܰ͘͢Δ͚ͩͰͳ͘ɺແବʹݟ
͑Δ”sleep”ͷҙຯʹؾ͍͍ͮͯΕείΞ Ξοϓʹͭͳ͕͍ͬͯͨ
ল • ͬͱϨΪϡϨʔγϣϯΛख़ಡ͢Δඞཁ͕͋ͬ ͨ • ϓϩϑΝΠϦϯάπʔϧΛงғؾͰ͍ͬͯͨײ ͕͋ͬͨ • ͦͦͷࣝෆ •
͕Կͯ͠ͳ͍(ϩάͱ͔͔͠ݟͯͳ͍)
དྷʹ͚ͯ • աڈͷISUCONͰͷେࣄͳϙΠϯτΛ͔ͬ͠ Γͱԡ͑͞ɺʮ͋ͬʂ͜ΕνϟϨϯ̋Ͱͬ ͨͭͩʯతͳࢥ͍ग़͕͠Ͱ͖ΔΑ͏ʹͨ͠ ͍ • ࣌ؒ͋Γͦ͏ͳͷͰΏͬ͘ΓࣝΛ͑ͨ ͍