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
ISUCON3 - ISUCON Makers Casual Talks
Search
FUJIWARA Shunichiro
December 10, 2014
Programming
860
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ISUCON3 - ISUCON Makers Casual Talks
FUJIWARA Shunichiro
December 10, 2014
More Decks by FUJIWARA Shunichiro
See All by FUJIWARA Shunichiro
多摩川(.dev)ランニング入門 / Tamagawa.dev#3
fujiwara3
3
550
クラウドを使う側から、作る側へ / 大吉祥寺.pm 2026前夜祭
fujiwara3
8
2.2k
作るべきものと向き合う - ecspresso 8年間の開発史から学ぶ技術選定 / 技術選定con findy 2026
fujiwara3
9
6.2k
さくらのクラウドでのシークレット管理を考える/tamachi.sre#2
fujiwara3
2
410
Amazon ECS デプロイツール ecspresso の開発を支える「正しい抽象化」の探求 / YAPC::Fukuoka 2025
fujiwara3
13
14k
パフォーマンスチューニングのために普段からできること/Performance Tuning: Daily Practices
fujiwara3
9
6.9k
alecthomas/kong はいいぞ
fujiwara3
7
2.6k
ecspressoの設計思想に至る道 / sekkeinight2025
fujiwara3
12
3.8k
さくらのIaaS基盤のモニタリングとOpenTelemetry/OSC Hokkaido 2025
fujiwara3
4
5.6k
Other Decks in Programming
See All in Programming
wkhtmltopdfの次どうするか問題2026
willnet
2
1.8k
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
220
The Rails Doctrine Decade
koic
2
420
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
760
Security issues being discussed on Web Platforms
petamoriken
0
1.4k
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
450
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
1
660
AHC070解法紹介
eijirou
0
140
FreeBSDでZabbixを動かす
kenkino
0
340
巨大モノリシックアプリ モダン化大作戦
ktcryomm
1
1.2k
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
280
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
730
Featured
See All Featured
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
290
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
290
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Mind Mapping
helmedeiros
1
380
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
HDC tutorial
michielstock
2
930
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
58k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
270
My Coaching Mixtape
mlcsv
0
330
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
420
Transcript
ISUCON'Makers'Casual'Talks ISUCON'3 2014/12/10&@fujiwara
About&me @fujiwara ISUCON'1,'2'༏উ'(fujiwara) ISUCON'3'ग़ ໘ന๏ਓΧϠοΫ
ग़ͷܦҢ ISUCON'1,'2'fujiwara࿈ʂ 2ͷ࠙ձʮग़͍ͯͩ͘͠͞Αʯʮ͍ʂʯ CROSS%2013%@941͞Μʹ͓ئ͍͞ΕΔ
Timeline 2013/1&CROSS&2013 2013/4'ΧϠοΫٕज़෦৽ଔݚमʮࣾISUCONʯ 2013/6'@941͞ΜͱϛʔςΟϯά 2013/7/31'ग़࡞ઓձٞ 2013/9/21'YAPC::Asia'2013'ʮࣾISUCONͷͭ͘Γ͔ͨʯൃද 2013/10/5,6)ISUCON)3)ΦϯϥΠϯ༧બ 2013/11/9'ISUCON'3'ຊબ
ISUCON'1,2'ͱ'3'ͷҧ͍ ΦϯϥΠϯ༧બ 2ճɺผͷΛ࡞Δ
ࣾISUCON ৽ଔݚमͷҰ ओʹαʔόαΠυΛΔΤϯδχΞ͚ HTTPΛֶͿ$→$WebΞϓϦΛ࡞Δ ࡞ͬͨΞϓϦͰISUCON! github.com/kayac/newbie2training
ࣾISUCON ݚमͷҰͷͨΊૉͳग़ • ੩తϑΝΠϧΛΞϓϦαʔό͕৴ • ΠϯσοΫε͕ுΒΕ͍ͯͳ͍ςʔϒϧ • ϧʔϓதͰΫΤϦ͕ඈͿ ੩తϑΝΠϧΛwebαʔό৴$+$ΠϯσοΫεΛదʹுΔ$+$ϧ ʔϓΫΤϦΛJOINʹॻ͖͑
→$είΞ20ഒ
ࣾISUCONͰͷܦݧ • Ր༵"WebAppॻ͘ • ਫ༵"ςετॻ͘ • ༵"ϕϯνϚʔΫॻ͘ • @acidlemon"ʹղ͍ͯΒ͏ •
༵ۚே͔Β"ISUCON (னؒݚमͷߨࢣۀ)
ࣾISUCONͰͷল • ్தͰϕϯνϚʔΫϗετ"㱻"֤VMͷଳҬةͳ͍ • ଳҬ͕͢ΔͱείΞ͕͔ࠩͳ͘ͳΔ • ్தͰ"Accept-Encoding: gzip"Ճ
2013/7/31 ग़࡞ઓձٞ !@fujiwara! !@acidlemon !@typester! !@songmu
memo ը૾ϦαΠζ ಉ࣌ଓܥɺνϟοτɺϨΠςϯγ push͔ΒͷҰ੪ΞΫηεΛΤϥʔʹ͠ͳ͍Ͱ͑Δ ಉใ RedisͬͯΔ͚Ͳ͍ํѱ͍ mongo git href="" PostgreSQLೖΕ͓ͯ͘
ຊબʹ࠾༻ • ը૾ϦαΠζ • ಉ࣌ଓܥɺϨΠςϯγ • Ұ੪ΞΫηε ༧બʮຊબͷωλόϨʹͳΒͳ͍ʯͷ
10/5,6'ΦϯϥΠϯ༧બ
༧બग़༰ Github'GistͷΑ͏ͳͷ ϩάΠϯػೳɻCookieʹΑΔηογϣϯҡ͕࣋ඞཁ ϓϥΠϕʔτߘػೳɻϓϥΠϕʔτઃఆ͞ΕͨͷϩάΠϯ ͍ͯ͠ΔϢʔβࣗʹ͔͠ݟ͑ͳ͍ MarkdownܗࣜͰߘ ʴ!᠘తͳઃఆ
༧બͷҙਤ ໌Β͔ʹຊબग़ʹ࣮ྗͷΓͳ͍νʔϜΛ;Δ͍མͱ͢ ×"੩తϑΝΠϧΛΞϓϦαʔό͕৴ ×"ΠϯσοΫε͕ͳ͍ςʔϒϧ ×"ϧʔϓΫΤϦ ×"Markdownมʹ֎෦ίϚϯυىಈ ී௨ͷWebΞϓϦͱͯ͠μϝͳ࣮ΛͤΕߴείΞʹ ʴ$Ϙʔφεͱͯ͠ʮ᠘ʯΛΫϦΞͯ͠Ճ
༧બ४උ ʙ!9/17!ग़ͷϓϩτλΠϓGoͷϕϯνΫϥΠΞϯτԾ࣮ 9/25ʙ%@acidlemon%ʹղ͍ͯΒ͍͡ΊΔ 9/30%/recent/*%ΛՃ 10/2,3'Ruby,'Python,'Go,'Node,'PHP'Ҡ২ 10/5,6'ISUCON3'༧બ
༧બ ͔ࣗΒIRCͰαϙʔτ
༧બͷʮ᠘ʯ
MySQL&InnoDB&memcached&plugin MySQL&5.6ͷ৽ػೳ • memcached(protocolͰMySQLͱ௨৴Ͱ͖Δ • port(11211(Λ(Listen • ΞϓϦέʔγϣϯ͔Βηογϣϯอଘʹ༻ • port(11212(Ͱී௨ͷ(memcached(ىಈͯ͋͠Δ
• ॳظঢ়ଶͰ༻͍ͯ͠ͳ͍
ҙຯͷͳ͍!CSS!link <link rel="stylesheet" href="/"> • ϕϯνϚʔΧʔϦϯΫΛḷͬͯ"/"ʹϦΫΤετΛඈ͢ • ͔͠͠είΞ"0 • PageViewͰͳ͍ͱ͍͏ѻ͍
• HTML͔Βআ͢ΔͱϦΫΤετ͠ͳ͘ͳΔ
ҰൃΞτͰͳ͍ݮํࣜ fail=3·Ͱݮͳ͠ failͷࣗ%&(ͨͱ͑&fails=6&ͳΒ& )&Λݮ fail%>=%13%Ͱ% %ݮʹͳΔͷͰείΞ%0
༧બͷল • είΞϦϯάͷৄࡉ͕ެ։͞Ε͍ͯͳ͔ͬͨ • /recent/*"ʹର͢ΔϕϯνϚʔΧʔͷνΣοΫ͕͔ͬͨ • ͋ͱ͔ΒՃͨ͠෦ • ͜͜Λ"Cache"͢ΔͱΑ͘ճΔ
༧બϕϯνϚʔΧʔ • Go • ࢀՃऀ͕ࣗ༝ʹͳΔϗετͰಈ࡞͢ΔͨΊɺղੳ͞Εʹ͍͘ Α͏ʹ • --workload$Φϓγϣϯॳಋೖ • ISUCON$1,2ͰௐͰ͖ͳ͔ͬͨ
༧બϕϯνϚʔΧʔ • ੩తϑΝΠϧ͚ͩΞΫηε͢Δ"sta&c"worker • ϦΫΤετ͝ͱʹ"10ms"wait • /recent/*"͚ͩΞΫηε͢Δ"recent"worker • ϩάΠϯɺߘɺӾཡɺϩάΞτɺӾཡΛ܁Γฦ͢"main" worker
༧બϕϯνϚʔΧʔ !͕߹ܭ!worker! w=1$>$ $(sta*c=1,$recent=1,$main=6) w=2$>$ $(sta*c=2,$recent=2,$main=14) w=3$>$ $(sta*c=3,$recent=3,$main=28)
༧બϕϯνϚʔΧʔͷʮ݀ʯ recent&worker& • wait&ͳ͠ʹճΔ • දࣔཁૉ͕ߋ৽͞Ε͍ͯΔ͔Ͳ͏͔ͷνΣοΫΛͯ͠ͳ ͍ʂʂʂ /recent/*!ΛΩϟογϡͯ͠ߴʹฦ͢ͱ!είΞ↑↑
༧બͷল είΞࢉग़ͷৄࡉެ։͢͠ աͳʮ᠘ʯΑ͘ͳ͍ ϕϯνϚʔΧʔͷ݀Ͱ͖ΔݶΓ௵͢͠
11/9$ຊબ
ຊબग़ʹͨͬͯ ʮ᠘ʯΊΑ͏ ෳαʔόΛ༗ޮʹ͑Δग़ʹ͠Α͏
ຊબ୲ !@fujiwara!ɺϕϯνϚʔΫɺείΞूܭγεςϜ !@acidlemon!ࣄલղɺϕϯνϚʔΫνΣοΫɺΦʔϓχϯ άɺϨΪϡϨʔγϣϯ !@handlename:!nodeҠ২ɺಈ࡞֬ೝ !@mix3:!GoҠ২ɺಈ࡞֬ೝ !@nobu_ohta:!RubyҠ২ɺPythonҠ২ !@m0t0k1ch1:!PHPҠ২ɺ෧σβΠϯ
ຊબ४උ 10/17%ΩοΫΦϑ 10/29%ग़ͱϕϯνϚʔΧʔϓϩτλΠϓͰղ͖࢝ΊΔ%ଟݴޠҠ ২։࢝ 11/5%5ߏͰղ͘,%ຊ൪༻αʔόࠐΈ 11/7%ຊ൪αʔό্Ͱςετ։࢝ 11/8%݁Ռूܭը໘࡞ɺσόοά 11/9%ISUCON3%ຊબ
ຊબग़༰ ը૾ߘ͕Ͱ͖ΔSNS HTMLΛฦ͢෦ͳ͘ɺJSON)APIͷΈ ϢʔβΛϑΥϩʔͰ͖ΔɻϑΥϩʔ͍ͯ͠ΔϢʔβͷߘ͕ྲྀΕ ͯ͘Δ Long%polling%API%͋Γ ϕϯνϚʔΧʔը૾Λߘͨ͠ΓJSONΛऔಘͨ͠Γ͢Δ
είΞࢉग़ํ๏ Լهͷ!(a)+(b)+(c)!͕૯߹είΞ (a)$ߘεϐʔυ$=$ϨεϙϯελΠϜ͕͍΄ͲߴείΞ (b)$λΠϜϥΠϯө$=$ߘͨ͠ΤϯτϦͷใ͕ө͞Ε Δͷ͕͍΄ͲߴείΞ (c)$ͦͷଞϦΫΤετ$=$1
είΞࢉग़ํ๏ ϨεϙϯελΠϜʹґଘ͢ΔείΞҎԼͷܭࢉࣜʹΑΔ 5"sec"="1 1"sec"="3.3 100"msec"="6.64 10"msec"="9.9
ຊબͷϙΠϯτ 5ͷαʔόΛͲ͏͏͔ ॳظঢ়ଶͰ1ͷΈʹΞϓϦέʔγϣϯ͕ىಈ͍ͯ͠Δ 2ʙ4ʮۭʯ(OSɺϛυϧΣΞͷॳظઃఆͷΈ) ଳҬ1͋ͨΓ • eth0&:&100Mbps&(ϕϯνϚʔΧʔ͕ΞΫηε) • eth1&:&1Gbps&(ࣗ༝ʹ͑Δ)
ຊબͷϙΠϯτ ը૾ͷϦαΠζΛ͍ͭߦ͏͔ ॳظঢ়ଶϦΫΤετ͝ͱʹຖճಈతੜ 1. ߘ࣌ʹ#S,#M,#L#ͷ3αΠζ#+#ΦϦδφϧΛશͯੜ͠อଘ 2. ߘ࣌ΦϦδφϧͷΈอଘ͠ɺαϜωΠϧӾཡ࣌ʹੜ ※!શͯͷαϜωΠϧ͕ϦΫΤετ͞ΕΔΘ͚Ͱͳ͍
ຊબͷϙΠϯτ ը૾ͷϦαΠζΛԿͰߦ͏͔ ॳظ࣮!ImageMagick!convert!ίϚϯυΛ(֎෦)࣮ߦ • ը૾ϥΠϒϥϦʹΑͬͯม݁Ռʹࠩҟ͕ͰΔ • ը૾Λൺֱ͢ΔπʔϧΛఏڙɻϦϑΝϨϯε࣮ͱͷޡ͕ࠩҰ ఆҎԼͰͳ͍ͱfail
ຊબͷϙΠϯτ Long%poll%API%ΛͲ͏ߴԽ͢Δ͔ ॳظ࣮2ඵsleepͯ͠ฦͤΔͷ͕͋Δ͔νΣοΫ • ฏۉϨεϙϯελΠϜ͕1ඵʹͳΔ • ԿΒ͔ͷΠϕϯτ௨Λར༻ͯ͠ߴʹөͰ͖ΔͱߴείΞ
ຊબͷϙΠϯτ ଳҬΛ͍͔ʹຒΊΔ͔ ϕϯνϚʔΧʔ࠷େ!100Mbps! !5!=!500Mbps!Λ͑Δ Ͱ͖Δ͚ͩଟ͘ͷϗετ͔Β৴͢ΔͱଳҬΛ༗ޮʹ͑Δ
ຊબϕϯνϚʔΧʔ Perl%(Furl%+%AnyEvent) post:&ΞΠίϯͱΤϯτϦΛPOSTɺαϜωΠϧΛGETͯ֬͠ೝ view:&ը૾ΛGET&(0.5&sec&sleep) check:&ϢʔβݖݶʹΑΓݟ͑Δݟ͑ͳ͍ͷݖݶνΣοΫ crawl:&·ͣϩάΠϯ͔ͯ͠ΒλΠϜϥΠϯ(Long&poll)ʹுΓ͘ ?meline:&λΠϜϥΠϯʹுΓ͖ɺྲྀΕ͖ͯͨϢʔβΛfollowɺ ը૾ΛGETͳͲ 6"process(post,"view,"check,"crawl"֤×1"5meline"×"2)"/"workload
ຊબϕϯνϚʔΧʔͷଳҬ੍ޚ LVS$Ͱ$localhost:[νʔϜʹରԠ͢Δport]$͔Βϕϯν૬खʹ$NAT ϕϯνϚʔΫϦΫΤετ࣌ʹ!NAT!ઌͷෳϗετΛ!on!/!off QoS$github.com/matsumoto1r/qos1control tc#ͷ#wrapper.#100Mbps#ʹ੍ݶ
ຊબͷল ଟগͷτϥϒϧ͋ͬͨͷͷ͓͓ΉͶָ͠ΜͰ͑ͨ • ϕϯνϚʔΧʔͷෳΓସ͑όά • Pythonॳظ࣮Ͱ·Εʹ(Fail(͢Δ • tmpfile(ͷ(flush(λΠϛϯά ࠷ޙ!Fail!͢ΔνʔϜ͕ଟ͔ͬͨͷ͕೦
None