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
changkita
January 08, 2018
Programming
0
30
ISUCON7 まとめ
ISUCON7の予選のまとめ
changkita
January 08, 2018
Tweet
Share
More Decks by changkita
See All by changkita
仮想通貨こわい
kitah
0
28
強化学習
kitah
0
75
ISUCON5 まとめ
kitah
0
68
Other Decks in Programming
See All in Programming
プロンプトエンジニアリング入門
tomokusaba
2
980
Introduction for Open Source Swift Workshop
giginet
PRO
0
180
Some Quick Ideas To Improve Your Tests ( #jassttokyo )
teyamagu
PRO
2
2.3k
TCA魔法学入門🪄
dazy
0
280
ファイル先頭の use の意味、説明できますか? 〜PHP の namespace と autoloading の関係を正しく理解しよう〜 / namespace and autoloading in php
okashoi
2
470
C# 大統一理論推進委員会 会員のための Unity Package Manager プロジェクト構成案
monry
PRO
0
580
Deep Dive 大規模システムアーキテクチャ/開発組織エンジニアリング / Deep Dive Large-Scale System Architecture, Development Organization Engineering
nrslib
15
2.9k
【KMC春合宿2024】実装視点で見るNeural Radiance Fields
runningoutrate
0
150
OpenAPI を守るのは難しい
ohmori_yusuke
1
140
CSRF対策のやり方、そろそろアップデートしませんか / Update your knowledge of CSRF protection
hiro_y
25
15k
品質が高いコードって何?Rev2.1
ickx
1
490
LLMチャットボットのアプリケーション設計Tips
os1ma
4
660
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
28
12k
Web Components: a chance to create the future
zenorocha
304
41k
The Power of CSS Pseudo Elements
geoffreycrofte
58
4.9k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
8
8.2k
[RailsConf 2023] Rails as a piece of cake
palkan
21
3.8k
Reflections from 52 weeks, 52 projects
jeffersonlam
343
19k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
6
950
Building Your Own Lightsaber
phodgson
97
5.6k
Ruby is Unlike a Banana
tanoku
95
10k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
34
8.8k
Mobile First: as difficult as doing things right
swwweet
215
8.5k
Navigating Team Friction
lara
177
13k
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ͰͷେࣄͳϙΠϯτΛ͔ͬ͠ Γͱԡ͑͞ɺʮ͋ͬʂ͜ΕνϟϨϯ̋Ͱͬ ͨͭͩʯతͳࢥ͍ग़͕͠Ͱ͖ΔΑ͏ʹͨ͠ ͍ • ࣌ؒ͋Γͦ͏ͳͷͰΏͬ͘ΓࣝΛ͑ͨ ͍