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
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
On-behalf-of Token exchange with AgentCore Identity
hironobuiga
2
130
AGENTS.mdとSkillsで始めるAIエージェント活用
sonoda_mj
2
190
AIを「創る」と「使う」の循環 — HRテックが実践するリアルなAI組織実装
taketo957
0
1.9k
Dario Amodi『Policy on the AI Exponential』を理解する
nagatsu
0
210
LLMにもCAP定理があるという話
harukasakihara
0
280
2026TECHFRESH畢業分享會 - 原生還是跨平台? App 開發踩坑實錄
line_developers_tw
PRO
0
680
ルールやカスタム機能、どう活かす?ハンズオンで体感するIBM Bobの出力コントロール
muehara
1
130
Android の公式 Skill / Android skills
yanzm
0
120
Oracle AI Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
4
2.9k
AAIFに入ってみた ~内から見えるコミュニティ動向~
sato4
0
130
フロンティアAIのゲート化と地政学リスク
nagatsu
0
110
生成 AI × MCP で切り拓く次世代 SRE!自律型運用への挑戦と開発者体験の進化
_awache
0
190
Featured
See All Featured
The Limits of Empathy - UXLibs8
cassininazir
1
350
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
How to Talk to Developers About Accessibility
jct
2
230
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
220
Java REST API Framework Comparison - PWX 2021
mraible
34
9.3k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
エンジニアに許された特別な時間の終わり
watany
107
250k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
200
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
380
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
200
Producing Creativity
orderedlist
PRO
348
40k
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 ᘳΛࢦͤͲΕ͚ͩͰΔ͜ͱ͕͋ΔͷͰɺ͍࣌ؒ͘Β͋ͬ ͯΓͳ͍ ৭ʑ٧ΊࠐΈ͍ͨཉɺείΞʹ͕ࠩग़ͳ͍Μ͡Όͳ͍͔ͱ͍͏ڪා Λ੍͢Δͷ͕ͱ͍ͯ͠