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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
AIで仕事のやり方を変える
matsu7874
1
910
DINO-EdgeQuery:Edge-First Polygon Decoding for Building Footprint Extraction from Satellite Imagery
lehupa
0
160
#jawssonic2026 あの時代が悪かった ~動かなかったSageMakerと共に迎えたイベント当日~
ktkn1129
0
130
grill-me(grilling):AI駆動開発を超助けてくれるSkill / grill me
mathbullet
0
110
AI時代に、プロダクトの数だけ積み上がる所有コストをどうエンジニアリングするか / Engineering the Cost of Ownership
kzkmaeda
0
1k
When Does a Local Qwen Start to Break
morshoto
0
180
AIで開発は速くなったのに、なぜ現場は楽にならないのか 〜あなたの組織のボトルネックを突き止めるワークショップ〜
jacopen
1
270
WAF 運用改善の承認サイクル/SRE_BizReach_MIXI_1
visional_engineering_and_design
1
290
Lakebase ワークショップ / Lakebase-workshop
databricksjapan
PRO
0
100
少人数データチームのDevin活用実践事例
runandy16
2
450
Redmine 7.0で私が開発した新機能の狙いと背景
vividtone
1
110
20260903 Tokyo Jazug Night #62 | Azure エンジニアよ、 その環境は本当にセキュアか?
olivia_0707
1
620
Featured
See All Featured
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
190
Test your architecture with Archunit
thirion
2
2.4k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
Writing Fast Ruby
sferik
630
63k
Design in an AI World
tapps
1
300
GraphQLとの向き合い方2022年版
quramy
50
15k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Mind Mapping
helmedeiros
1
350
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 ᘳΛࢦͤͲΕ͚ͩͰΔ͜ͱ͕͋ΔͷͰɺ͍࣌ؒ͘Β͋ͬ ͯΓͳ͍ ৭ʑ٧ΊࠐΈ͍ͨཉɺείΞʹ͕ࠩग़ͳ͍Μ͡Όͳ͍͔ͱ͍͏ڪා Λ੍͢Δͷ͕ͱ͍ͯ͠