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
ISUCON6本選の裏話 @ ISUCON6裏話Night
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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.6k
NeurIPS 2021 論文読み会: How Modular should Neural Module Networks Be for Systematic Generalization?
edvakf
0
230
8年物のJavaのシステムをKotlinに変えていく選択に至るまで
edvakf
2
1.1k
ピクシブ社内のImageFlux利用事例紹介
edvakf
2
3.1k
学びの文化を育む社内読書会のススメ
edvakf
0
320
フルCDNアーキテクチャでサービス設計した話
edvakf
5
4.1k
Goでバイナリを読む+α
edvakf
1
1k
お前はこれまでに作ったAPIの数を覚えているのか?
edvakf
0
2.7k
「ふつうのRailsアプリケーション」についての考え方
edvakf
2
940
Other Decks in Technology
See All in Technology
Kubernetesにおける学習基盤とLLMOpsの概要
ry
1
300
中期計画、2回作ってみた ~業務委託と正社員、両方の視点から~
demaecan
1
750
2026.06.13_AI時代に事業会社が「SIer出身エンジニア」を求める理由 / Why Businesses Seek Engineers with a System Integrator Background in the AI Era
jumtech
0
1.1k
Kiroで書いた 設計書 が AI レビューの 採点基準 になる
ezaki
0
110
AmazonRoute 53ではじめてのドメイン取得!HTTPS化までの道のりを整理してみた
usanchuu
3
140
200個のGitHubリポジトリを横断調査したかった
icck
0
130
自律型AIエージェントは何を破壊するのか
kojira
0
160
MUSUBI 田中裕一『AIと共に行う「しごとのリデザイン」- スモールバックオフィス編』AI Ops Lab #4
musubi
0
180
【NRUG vol.18】なぜ多くのオブザーバビリティ導入は失敗するのか
nrug_member
0
130
On-behalf-of Token exchange with AgentCore Identity
hironobuiga
2
200
Disciplined Vibes: Scaling AI-Assisted Engineering
sheharyar
0
140
小さくはじめるSLI/SLO ~育てながら組織に定着させる実践知~ / Starting Small with SLI/SLOs: Building Adoption Through Continuous Growth
nari_ex
7
1.9k
Featured
See All Featured
4 Signs Your Business is Dying
shpigford
187
22k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
310
Typedesign – Prime Four
hannesfritz
42
3.1k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
780
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
370
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
270
For a Future-Friendly Web
brad_frost
183
10k
Paper Plane (Part 1)
katiecoart
PRO
0
8.9k
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 ᘳΛࢦͤͲΕ͚ͩͰΔ͜ͱ͕͋ΔͷͰɺ͍࣌ؒ͘Β͋ͬ ͯΓͳ͍ ৭ʑ٧ΊࠐΈ͍ͨཉɺείΞʹ͕ࠩग़ͳ͍Μ͡Όͳ͍͔ͱ͍͏ڪා Λ੍͢Δͷ͕ͱ͍ͯ͠