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
450
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
2.1k
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.2k
学びの文化を育む社内読書会のススメ
edvakf
0
330
フルCDNアーキテクチャでサービス設計した話
edvakf
5
4.2k
Goでバイナリを読む+α
edvakf
1
1k
お前はこれまでに作ったAPIの数を覚えているのか?
edvakf
0
2.8k
「ふつうのRailsアプリケーション」についての考え方
edvakf
2
960
Other Decks in Technology
See All in Technology
分析の民主化を支えるメタデータ整備の実践
kakehashi
PRO
4
1.4k
継続的なAIコスト最適化
bgpat
1
350
初海外で注意すべきこと12選!!!安全快適なre:invent生活にするために
yuuuuuuu168
1
180
オントロジーって 結局なにもの? AI エージェントに「意味」を渡す知識設計の話
greenmidori
0
230
WasmをRustにする
sansantech
PRO
0
260
DevelopersIO 2026 知識の地図を描く ─ オントロジーとは何か?
ishikawa_satoru
1
1.7k
USB PDを使ってスマホを労わりたい
raspython3
0
180
夫婦で子育てするための育児標準化
codmoninc
PRO
0
420
[JAWS-UG彩の国埼玉#12]そろそろ準備する?re:Invent2026をやさしく解説 / reinvent2026-sainokuni
sh_fk2
1
350
ブラウザとサーバーから考えるAI時代のフロントエンド監視
shogo4131
3
1k
フロントエンドカンファレンス関西2026 - 速すぎるUIに、待ち時間を
teamlab
PRO
0
180
アウトプット初心者、半年間のふりかえり
4o1sobblue
0
440
Featured
See All Featured
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
630
Joys of Absence: A Defence of Solitary Play
codingconduct
1
550
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
Test your architecture with Archunit
thirion
2
2.4k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.4k
[SF Ruby Conf 2025] Rails X
palkan
3
1.5k
Designing for humans not robots
tammielis
254
26k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
43k
Ruling the World: When Life Gets Gamed
codingconduct
0
400
The Cult of Friendly URLs
andyhume
79
7k
Practical Orchestrator
shlominoach
192
12k
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 ᘳΛࢦͤͲΕ͚ͩͰΔ͜ͱ͕͋ΔͷͰɺ͍࣌ؒ͘Β͋ͬ ͯΓͳ͍ ৭ʑ٧ΊࠐΈ͍ͨཉɺείΞʹ͕ࠩग़ͳ͍Μ͡Όͳ͍͔ͱ͍͏ڪා Λ੍͢Δͷ͕ͱ͍ͯ͠