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
ISUCON6本選の裏話 @ ISUCON6裏話Night
Search
Atsushi Takayama
November 23, 2016
Technology
440
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ISUCON6本選の裏話 @ ISUCON6裏話Night
Atsushi Takayama
November 23, 2016
More Decks by Atsushi Takayama
See All by Atsushi Takayama
最高の開発者体験の追求が開発生産性を改善し続ける文化を生み出した話
edvakf
3
1.8k
NeurIPS 2021 論文読み会: How Modular should Neural Module Networks Be for Systematic Generalization?
edvakf
0
240
8年物のJavaのシステムをKotlinに変えていく選択に至るまで
edvakf
2
1.1k
ピクシブ社内のImageFlux利用事例紹介
edvakf
2
3.1k
学びの文化を育む社内読書会のススメ
edvakf
0
320
フルCDNアーキテクチャでサービス設計した話
edvakf
5
4.2k
Goでバイナリを読む+α
edvakf
1
1k
お前はこれまでに作ったAPIの数を覚えているのか?
edvakf
0
2.8k
「ふつうのRailsアプリケーション」についての考え方
edvakf
2
950
Other Decks in Technology
See All in Technology
消えない 動かない 効かない
yama3133
1
120
AIエージェントの自己改善をどう設計するか / How to Design Self-Improvement for AI Agents
22mi
3
2k
2026-09-10 【Snowflake World Tour Tokyo 2026】dbt Core と Snowflake で実現する多層的なデータガバナンス / Multi-Layered Data Governance Powered by dbt Core and Snowflake
civitaspo
0
350
TinyGo 開発サイクルを高速化する:Go で作るエミュレータ入門
zozotech
PRO
1
650
Claude Code本って、 読む必要あるの?
oikon48
2
420
Sigmaで作る業務アプリ
kazushiro_honma
0
120
リージョンの壁を越える、 ちょっと変わったAWSサービスの話
falken
PRO
1
310
コーディングエージェントでM5Stack系の開発を少し試した時の話 / M5 Japan Tour 2026 Autumn 東京
you
PRO
0
180
Omarchy Quattro の日本語設定周り
simosako
2
150
AIとペアプロを始める。人とのペアプロをやめる。ペアプロの良さを改めて知る。もっと好きになった。 / Rediscovering Pair Programming
honyanya
1
350
コスト最適化の「めんどくさい」を AWS FinOps Agent でチョット楽にする
classmethod_kaz
0
320
登壇の自信を奪う3匹のオバケ / 3 Ghosts That Rob You of Your Confidence in Public Speaking
pauli
3
190
Featured
See All Featured
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
280
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
520
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
380
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
490
sira's awesome portfolio website redesign presentation
elsirapls
0
410
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
520
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
890
AI: The stuff that nobody shows you
jnunemaker
PRO
9
990
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
520
Transcript
ISUCON6ຊબͷཪ ISUCON6ཪNight ߴࢁԹ @edvakf
ߨධطʹISUCONެࣜϒϩάͷ΄͏ʹدߘͨ͠ͷ Ͱɺࠓཪతͳ͜ͱΛ͠·͢
ࣗݾհ ߴࢁԹ @edvakf pixivίϛοΫͱ͍͏αʔϏεͷٕज़ऀͱ ձࣾͷΤϯδχΞશһʹؔΘΔΑ͏ͳΈͮ͘Γ͕ओͳ ͓ࣄ ϓϩάϥϛϯάݴޠ JavaScript, PHP, Ruby,
Go, Scala ͕ कඋൣғͰ͢ 12݄͔ΒCTOʹब͢Δ͜ͱʹͳΓ·ͨ͠
ISUCONͱࣗ ISUCON3͔Βࢀઓ ISUCON5·Ͱຖճຊઓग़ ISUCON4Ͱ2Ґ
ISUCONग़ͷܦҢ ڈͷISUCONͷ࠙ձϞϦεφΠτͰ941͞Μʹ͓ ༠͍Λड͚ͯ ͯͳ͞ΜͱϐΫγϒͰ༧બɾຊબͷͲͪΒΛ୲͢ Δ͔ɺͱ͍͏Λࣾͷڠྗऀͱ͠߹͍ɺ ͷύλʔϯΛͦΕͧΕߟ͓͍͑ͯͨ 12݄ʹSongmu͞ΜʹʮͲ͕ͬͪຊબΓ·͠ΐ͏͔ Ͷʁʯͱฉ͍ͨΒ
–Songmu “ͦΓΌ͏ϐΫγϒ͞ΜͰ”
ୈҰষ ͓ΘΓ
ୈೋষ ࣾISUCON
༧બͱຊઓ ༧બʮ͜ΕͧISUCONʯͱ͍͏ ຊબҙ֎ੑͷ͋Δ ͱ͍͏ڞ௨ೝ͕ࣝͳΜͱͳ͋͘Δ ʮ͜ΕͧISUCONʯͱ͍͏Λ࡞Βͣʹ͍͖ͳΓຊબ Λग़͢Δͷϋʔυϧ͕ߴ͍ →Α͠ɺࣾISUCONΖ͏
ࣾISUCONͷ͢ʍΊ ৽ଔݚमͷ࠷ऴʹ࣮ࢪ ISUCON༧બʹ͋Γͦ͏ͳΛఆͯ͠ɺ৽ଔ͚ͷڭҭత ༰ΛΓࠐΜͰ࡞ ࣾISUCONΛެ։ͨ͠Β͘ΘΕͨ http://inside.pixiv.net/entry/2016/09/26/130112 ࢀߟ࣮ΛҰ௨Γ࡞ͬͨΓηοτΞοϓํ๏ͳͲΛ͔ͬ͠ Γެ։ͨ͠ߕ൹͕͋ͬͨ
ࣾISUCONͷڭ܇
ॳظσʔλΛૣ͍ஈ֊Ͱ࡞͓ͬͯ͘ͱḿΔ ࢀߟ࣮Λ࡞Γͳ͕ΒϕϯνϚʔΧʔΛฒߦͯ͠ਐΊΒΕ Δ ࢀߟ࣮ͷҠ২͕ϥΫʹͳΔ E2Eςετ͋Δͱࢀߟ࣮͕ඇৗʹḿΔ ࣾISUCONͰNightmare.jsͰ࡞ ຊબͰϕϯνϚʔΧʔͷॳظνΣοΫΛE2Eςετ ΘΓʹͨ͠
ΞϓϦέʔγϣϯͷҠ২ίετͷ΄ͱΜͲςϯϓ ϨʔτͷҠ২… JSON͔͠ѻΘͳ͚Ε2͋Εे ຊબͰHandlebarsͷΑ͏ͳݴޠඇґଘͷςϯϓ ϨʔτΤϯδϯΛ͓͏ͱܾ৺ ReactͷαʔόʔαΠυϨϯμϦϯάΛࣾͰ ͍ͬͯͨͷͰ࠾༻
ϕϯνϚʔΧʔͲΕ͚ͩ࣌ؒΛͬͯνΣοΫ Λᘳʹ͢Δ͜ͱෆՄೳ Ͳ͔͜Ͱଥڠ͠ͳ͚Ε͍͚ͳ͍ ϕϯνϚʔΧʔ͕ڐ͢ݶΓԿͬͯOKͱ͍͏Ϩ ΪϡϨʔγϣϯʹͤ͟ΔΛಘͳ͍
ϓϩϏδϣχϯάͷඋʹҙ֎ͱ͕͔͔࣌ؒΔ ΞϓϦέʔγϣϯɺϕϯνϚʔΧʔɺϙʔλϧαΠτ ຊબdocker-composeͰϥΫΛ͠Α͏ͱܾΊͨ ϕϯνϚʔΧʔʢෳʣͱϙʔλϧαΠτͷ௨৴ΛͲ ͏ઃܭ͢Δ͔ શ෦ͷίϯϙʔωϯτ͕͋Δఔ͢Δ·Ͱ์ஔ͕͠ ͕ͪͩɺૣΊʹ͓͖͍ͬͯͨͱ͜Ζ ݁ہຊબͰΪϦΪϦʹͳͬͯ͠·ͬͨͷল
ग़ऀ͕༻ҙ͢Δͷඇৗʹଟ͍ ࢀߟ࣮ ϕϯνϚʔΧʔ ϙʔλϧαΠτ ຊ൪ڥͷϓϩϏδϣχϯά ϨΪϡϨʔγϣϯ Φʔϓχϯάಈը
Ҏ্Λ౿·͑ͯɺ 5݄ࠒʹͷςʔϚΛվΊܾͯఆ
ʮ2016ͷISUCONͱ ͜͏͋Δ͖ʯ
Docker ReactαʔόʔαΠυϨϯμϦϯά ΞϓϦέʔγϣϯJSON͔͠ѻΘͳ͍ ϦΞϧλΠϜ௨৴ C10K Server-Sent Events HTTPSલఏ HTTP/2ʹ͢Δͱ͍͍͜ͱ͋Δ͔ʁ
ୈࡾষ ຊબͱpixiv
ຊબͷ͓͞Β͍ ࠷ॳʹϖʔδΛදࣔ͢Δ ͢Δͱ͖ɺNodeJSͰϨ ϯμϦϯά͞ΕͨHTMLΛ ϩʔυ͢Δ ͦΕҎ߱APIͱΓ ͱΓ
pixiv Sketch
ຊબͷϞσϧ Web൛ReactͷϑϩϯτΤϯυͰαʔόʔαΠυϨ ϯμϦϯά όοΫΤϯυAPIRails ಉ͡APIΛεϚϗΞϓϦ͔Β͏ NodeJSͷϑϩϯτΤϯυεϚϗΞϓϦͳͲͱಉ ͡Α͏ͳ1ͭͷΫϥΠΞϯτɺͱ͍͏Ґஔ͚ͮ
AIʹഃ͞ΕΔ12ؒ ʰഃগঁʱ
WebSocketαʔόʔ ࠓͷ8݄ͱ9݄ʹظؒݶఆاըͰߏங αʔόʔJava (Spark) ࠷େ1ສਓఔ͕ಉ࣌ར༻ ͜͜Ͱಘͨಉ࣌ଓ·ΘΓͷϊϋΛຊબ ʹϑΟʔυόοΫ
ୈ࢛ষ ίωΫγϣϯΛେྔʹுΔ
C10KʙC100K 1ͭͷαʔόʔͰTCPίωΫγϣϯΛେྔʹड͚͚ΔͨΊʹ ɺΧʔωϧύϥϝʔλΛదʹ͢Δඞཁ͕͋Δ net.ipv4.tcp_max_orphans, net.core.somaxconn, net.ipv4.ip_local_port_range, fs.file-max ͦΕͱผʹɺ1ͭͷΫϥΠΞϯτ1ͭͷαʔόʔʹର͠ɺ 65535ίωΫγϣϯ·Ͱ͔͠ಉ࣌ଓͰ͖ͳ͍ ͭ·Γɺ100KίωΫγϣϯΛ͚͑ͨΕෳͷαʔόʔ
͔ΒϕϯνϚʔΫΛ͔͚ͳ͚Ε͍͚ͳ͍
ϘπҊ1 Azure FunctionsͰαʔόʔϨεࢄϕϯνϚʔΧʔ ಉ͡Function͕Ұʹ6ݸ͔࣮͠ߦͰ͖ͳ͍ʢଞ ͨ͞ΕΔʣΛղܾͰ͖ͳ͔ͬͨͷͰෆ࠾༻ HTTPΤϯυϙΠϯτΛॻ্͘ͰAWS LambdaΑΓ γϯϓϧͰྑ͍ Dropbox͔ΒσϓϩΠͰ͖Δศརػೳʢʁʣ
ϘπҊ2 ϕϯνϚʔΧʔ͕ผͷαʔόʔͷࢠϕϯνϚʔΧʔ Λ࣮ߦ͠ɺࢠϕϯνϚʔΧʔ͕ड͚औͬͨϩάΛ ϕϯνϚʔΧʔ͕ूܭ͢Δ ϕϯνϚʔΧʔ͕ෳࡶʹͳΓ͗ͯ͢༧ظ͠ͳ͍ͱ͜ ΖͰࣦഊ͢Δ͕֬૿͑ΔͷͰ٫Լ
࠾༻Ҋ nginxͷstreamϞδϡʔϧͰL4ϑΥϫʔυϓϩΩγ HTTPSͳͷͰTCPϨϕϧͰϓϩΩγ ͜ͷޙ@catatsuy͕ৄ͘͠͠·͢
ෛՙΛ͔͚Δ ࠷ॳʹNຊͷίωΫγϣϯΛுΔ 5ඵޙʹ৽ͨʹ N - (a + b) ຊͷଓΛࢼΈΔ a:
·ཱͩ֬͞Ε͍ͯͳ͍ίωΫγϣϯ b: طʹஅࡁΈͷίωΫγϣϯ N = N + N - (a + b) ͱ͢Δ ҎԼϧʔϓ ʢ͜Εͩͱݱࡏཱ͍֬ͯ͠ΔίωΫγϣϯͱಉ͡ͷίωΫγϣϯΛ5ඵ ͝ͱʹషΖ͏ͱͯ͠ɺͲΕ͚ͩ࠷దԽͯ͠Too many connections͕ग़Δͱ ຊબޙʹࢦఠ͞Εͨʣ
ୈޒষ ϕϯνϚʔΧʔΛ2ճ࡞ͬͨ
͜Ε·ͰͷϕϯνϚʔΧʔ ISUCON4: Go, ISUCON5: Java ͍ͣΕ࠶ར༻Λߟ͑ΒΕ͍ͯͨΑ͏Ͱ͕͢ɺϑϧεΫϥονͨ͘͠ ͳΔͷ͕ϓϩάϥϚʔͷਓ ISUCON6: Go ࣾISUCONͷͱ͖ʹcatatsuy͕࡞ͬͨͷ͕ϕʔε
ISUCON6༧બ͜ͷ࣮Λ౿ऻ͍ͯͨ͠ ࣾISUCONͷϕϯνϚʔΧʔ͚ͬ͜͏ྑ͔͕ͬͨɺ͍͔ͭ͘ؾʹ ೖΒͳ͍ͱ͜Ζ͕͋ͬͨͷͰɺ࣮ຊબʹ͚ͯ·ͨ࠶࣮ͨ͠
ڈʹ฿ͬͨ͜ͱ ॳظνΣοΫͰΤϥʔʹͳΕͦΕҎ্࣮ߦ͠ͳ͍ ͜ΕʹΑΓΩϡʔ͕٧·Δ͜ͱΛ͋Δఔආ͚ΒΕΔ ιϑτλΠϜΞτͱϋʔυλΠϜΞτ ιϑτλΠϜΞτ: ϕϯνϚʔΧʔͷϓϩηε͕ࣗͰऴྃ͢Δ͖࣌ؒ ϋʔυλΠϜΞτ: ͦΕΑΓ͋Δఔ͍࣮࣌ؒߦ͞Ε͍ͯΔͱɺϕϯν ϚʔΧʔΛىಈ͢Δϓϩηε͕ҟৗͱஅͯ͠ϕϯνϚʔΧʔϓϩηεΛ ࡴ͢
workloadύϥϝʔλͳ͠
৽͍͠ཁૉ Ճ͋ͬͯݮͳ͍ ࣾISUCONͰΤϥʔͰݮ্ͨ͠Ͱɺ0ҎԼ0ʹΓ্͍͛ͯͨ ͜ΕͩͱࠓͲΕ͚ͩϚΠφεͳͷ͔͕͔Βͳͯ͘ํཱ͕ͯʹ͍͘ Τϥʔ͕ग़ͨΒϕϯνϚʔΧʔͷฒྻΛԼ͛Δ ॳظ࣮ͱ࠷దԽ͞Ε࣮ͨͷ྆ํͰͳ͘ಈ͘ϕϯνϚʔΧʔΛࢦ ͨ͠ ʢ͕ɺ࠷దԽ͢Δͱεϧʔϓοτ্͕͕ͬͯٯʹΤϥʔ͕૿͑Δɺͱ͍͏ έʔε͕͋Δͱͷࢦఠʣ
ϕϯνϚʔΧʔͷ։ൃ ϕϯνϚʔΧʔಠཱͨ͠ίϚϯυͱ࣮ͯ͠ߦͰ͖Δͱ ։ൃ͕ϥΫ ඪ४ग़ྗʹείΞϝοηʔδͷೖͬͨJSONΛग़͢ ࣮ߦதͷϩάͳͲඪ४Τϥʔग़ྗʹग़͢͜ͱͰɺ࣮ߦ ऴྃΛͨͳ༷ͯ͘ࢠ͕Θ͔ΔͷͰḿΔ ࣾISUCONͷͱ͖͜Ε͕ແ͔ͬͨͷͰਏ͔ͬͨ
GoͰϕϯνϚʔΧʔΛॻ͘ ʢҰॠVert.xΛࢼ͕ͨ͠ɺJavaಛ༗ͷSSLূ໌ॻͷѻ͍ʹϋϚͬͯ ࠳ંʣ GoͩͱIOॲཧผεϨουॲཧΛߦ͏ͨͼʹϓϩάϥϜΛෳࡶʹ ͠ͳͯ͘ྑ͍ͷͰγφϦΦ্͕͔ΒԼʹҰઢʹॻ͚Δ γφϦΦ͝ͱʹฒྻΛࢦఆ͢Δॲཧ͕εοΩϦॻ͚ͨͷͰؾʹ ೖ͍ͬͯΔʢ࣍ͷϖʔδʣ ຊબͰγφϦΦ͝ͱʹཧ্ͷ࠷େεϧʔϓοτΛઃఆͯ͠ ͍ͨ
ch1 := makeChan(10) ch2 := makeChan(2) timeoutCh := time.After(60* time.Second)
L: for { select { case <-ch1: go func() { scenario.LoadIndexPage(origins) time.Sleep(500 * time.Millisecond) ch1 <- struct{}{} }() case <-ch2: go func() { scenario.DrawOnRandomRoom(origins) time.Sleep(500 * time.Millisecond) ch2 <- struct{}{} }() case <-timeoutCh: break L } }
ୈࣣষ ϙʔλϧαΠτ
༧બͷϙʔλϧαΠτΛϑΥʔΫ ༧બͷॳʹώϚͩͬͨͷͰɺάϥϑΛ࣮͕ͨ͠ɺॳͱ2 ͰڍಈΛม͑ͳ͍΄͏͕͍͍ͩΖ͏ͱ͍͏͜ͱͰ͓ଂೖΓʹ ͞ΒʹϩάΠϯ͍ͯ͠ͳ͍ਓʹάϥϑΛݟΒΕΔΑ͏ʹͨ͠ ্ͰຊબͷϙʔλϧαΠτͱͨ͠ ෦ͷσʔλߏେϦϑΝΫλϦϯά ϕϯνϚʔΧʔͷඪ४Τϥʔग़ྗΛ֨ೲ͢ΔΧϥϜΛ࡞ͬͯ ཧը໘ͰݟΒΕΔΑ͏ʹͨ͠Γ ڝٕऀ͚ϝοηʔδΛཧը໘͔Βग़ͤΔΑ͏ʹͨ͠Γ
ୈീষ ຊ൪ڥͷ
ਖ਼ɺຊ൪ڥ·ΘΓ matsuu͞Μʹ͖ͤͬΓͰ͕ͨ͠ɺ Ұͭݴ͑Δ͜ͱ
ෳߏͰ͋Δ ඞવੑ͕ແ͍
Ϋϥυͩͱ8ίΞx1ͱ2ίΞx4ͷஈ͕ಉ͡ ISUCONͷΑ͏ͳظͰύϑΥʔϚϯεΛग़͞ͳ͍ͱ ͍͚ͳ͍ڥʹ͓͍ͯɺෳߏΛબ͢Δཧ༝ ͕ແ͍ ຊબͰΦʔϓχϯάεϥΠυʹϦΞϦςΟΛ࣋ͨͤ ΔͨΊʹɺʮ߹ܭίΞ੍ݶΛ૿͢·Ͱͷਏ๊ͩʯ ͱ͍͏͍ۤ͠ઃఆʹ͕ͨ͠… ࠓޙͲ͏͢Δ͖ͳͷ͔
࠷ऴষ ग़ऴΘͬͯΈͯ
৭ʑߟ͑ͯࢼߦࡨޡ͠·͕ͨ͠ɺຊબʹΓࠐΊͨͷ͘͝Ұ෦ 1ؒ୭ʹݴ͑ͳ͍ͷ͕͍ۤ͠ͱ͜Ζ ৭Μͳօ͞Μʹॿ͚ΒΕͯग़Ͱ͖·ͨ͠ ͜ͷ͙Β͍ͷਓͰӡӦ͠ͳ͚Ε৺͕ંΕ͍͔ͯͨ… ࠷ऴతʹશ෦ࣗͰΓͨ͘ͳͬͯ͠·͏ѱ͍บ͕w ᘳΛࢦͤͲΕ͚ͩͰΔ͜ͱ͕͋ΔͷͰɺ͍࣌ؒ͘Β͋ͬ ͯΓͳ͍ ৭ʑ٧ΊࠐΈ͍ͨཉɺείΞʹ͕ࠩग़ͳ͍Μ͡Όͳ͍͔ͱ͍͏ڪා Λ੍͢Δͷ͕ͱ͍ͯ͠