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
ISUCON3 - ISUCON Makers Casual Talks
Search
FUJIWARA Shunichiro
December 10, 2014
Programming
850
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
クラウドを使う側から、作る側へ / 大吉祥寺.pm 2026前夜祭
fujiwara3
8
2k
作るべきものと向き合う - ecspresso 8年間の開発史から学ぶ技術選定 / 技術選定con findy 2026
fujiwara3
9
5.3k
さくらのクラウドでのシークレット管理を考える/tamachi.sre#2
fujiwara3
2
360
Amazon ECS デプロイツール ecspresso の開発を支える「正しい抽象化」の探求 / YAPC::Fukuoka 2025
fujiwara3
13
13k
パフォーマンスチューニングのために普段からできること/Performance Tuning: Daily Practices
fujiwara3
9
6.8k
alecthomas/kong はいいぞ
fujiwara3
7
2.5k
ecspressoの設計思想に至る道 / sekkeinight2025
fujiwara3
12
3.7k
さくらのIaaS基盤のモニタリングとOpenTelemetry/OSC Hokkaido 2025
fujiwara3
4
4.8k
監視のこれまでとこれから/sakura monitoring seminar 2025
fujiwara3
12
5.9k
Other Decks in Programming
See All in Programming
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
200
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.8k
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
300
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
270
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
390
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
0
450
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.5k
メールのエイリアス機能を履き違えない
isshinfunada
0
210
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
2.7k
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
3.3k
コーディングルールの鮮度を保ちたい for SRE NEXT 2026 / keep-fresh-go-internal-conventions-sre-next-2026
handlename
0
160
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
330
Featured
See All Featured
Are puppies a ranking factor?
jonoalderson
1
3.7k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
920
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.7k
Discover your Explorer Soul
emna__ayadi
2
1.2k
We Are The Robots
honzajavorek
0
290
Joys of Absence: A Defence of Solitary Play
codingconduct
1
420
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Raft: Consensus for Rubyists
vanstee
141
7.6k
A designer walks into a library…
pauljervisheath
211
24k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
650
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