$30 off During Our Annual Pro Sale. View Details »

ISUCON3 - ISUCON Makers Casual Talks

ISUCON3 - ISUCON Makers Casual Talks

FUJIWARA Shunichiro

December 10, 2014
Tweet

More Decks by FUJIWARA Shunichiro

Other Decks in Programming

Transcript

  1. ISUCON'Makers'Casual'Talks ISUCON'3 2014/12/10&@fujiwara

  2. About&me @fujiwara ISUCON'1,'2'༏উ'(fujiwara૊) ISUCON'3'ग़୊ ໘ന๏ਓΧϠοΫ

  3. ग़୊ͷܦҢ ISUCON'1,'2'fujiwara૊࿈೼ʂ 2ͷ࠙਌ձʮग़୊͍ͯͩ͘͠͞Αʯʮ͸͍ʂʯ CROSS%2013%@941͞Μʹ͓ئ͍͞ΕΔ

  4. 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'ຊબ

  5. ISUCON'1,2'ͱ'3'ͷҧ͍ ΦϯϥΠϯ༧બ 2ճɺผͷ໰୊Λ࡞Δ

  6. ࣾ಺ISUCON ৽ଔݚमͷҰ؀ ओʹαʔόαΠυΛ΍ΔΤϯδχΞ޲͚ HTTPΛֶͿ$→$WebΞϓϦΛ࡞Δ ࡞ͬͨΞϓϦͰISUCON! github.com/kayac/newbie2training

  7. ࣾ಺ISUCON ݚमͷҰ؀ͷͨΊૉ௚ͳग़୊ • ੩తϑΝΠϧΛΞϓϦαʔό͕഑৴ • ΠϯσοΫε͕ுΒΕ͍ͯͳ͍ςʔϒϧ • ϧʔϓதͰΫΤϦ͕ඈͿ ੩తϑΝΠϧΛwebαʔό഑৴$+$ΠϯσοΫεΛద੾ʹுΔ$+$ϧ ʔϓΫΤϦΛJOINʹॻ͖׵͑

    →$είΞ20ഒ
  8. ࣾ಺ISUCONͰͷܦݧ • Ր༵໷"WebAppॻ͘ • ਫ༵໷"ςετॻ͘ • ໦༵໷"ϕϯνϚʔΫॻ͘ • @acidlemon"ʹղ͍ͯ΋Β͏ •

    ༵ۚே͔Β"ISUCON (னؒ͸ݚमͷߨࢣۀ)
  9. ࣾ಺ISUCONͰͷ൓ল఺ • ్தͰϕϯνϚʔΫϗετ"㱻"֤VMͷଳҬةͳ͍ • ଳҬ͕๞࿨͢ΔͱείΞ͕ࠩ෇͔ͳ͘ͳΔ • ్தͰ"Accept-Encoding: gzip"௥Ճ

  10. 2013/7/31 ग़୊࡞ઓձٞ !@fujiwara! !@acidlemon !@typester! !@songmu

  11. memo ը૾ϦαΠζ ಉ࣌઀ଓܥɺνϟοτɺϨΠςϯγ push͔ΒͷҰ੪ΞΫηεΛΤϥʔʹ͠ͳ͍Ͱ଱͑Δ ಉใ Redis࢖ͬͯΔ͚Ͳ࢖͍ํѱ͍ mongo git href="" PostgreSQLೖΕ͓ͯ͘

  12. ຊબʹ࠾༻ • ը૾ϦαΠζ • ಉ࣌઀ଓܥɺϨΠςϯγ • Ұ੪ΞΫηε ༧બ͸ʮຊબͷωλόϨʹͳΒͳ͍ʯ΋ͷ

  13. 10/5,6'ΦϯϥΠϯ༧બ

  14. ༧બग़୊಺༰ Github'GistͷΑ͏ͳ΋ͷ ϩάΠϯػೳɻCookieʹΑΔηογϣϯҡ͕࣋ඞཁ ϓϥΠϕʔτ౤ߘػೳɻϓϥΠϕʔτઃఆ͞Εͨ΋ͷ͸ϩάΠϯ ͍ͯ͠ΔϢʔβࣗ਎ʹ͔͠ݟ͑ͳ͍ MarkdownܗࣜͰ౤ߘ ʴ!᠘తͳઃఆ

  15. ༧બͷҙਤ ໌Β͔ʹຊબग़৔ʹ࣮ྗͷ଍Γͳ͍νʔϜΛ;Δ͍མͱ͢ ×"੩తϑΝΠϧΛΞϓϦαʔό͕഑৴ ×"ΠϯσοΫε͕ͳ͍ςʔϒϧ ×"ϧʔϓΫΤϦ ×"Markdownม׵ʹ֎෦ίϚϯυىಈ ී௨ͷWebΞϓϦͱͯ͠μϝͳ࣮૷Λ௚ͤΕ͹ߴείΞʹ ʴ$Ϙʔφεͱͯ͠ʮ᠘ʯΛΫϦΞͯ͠Ճ఺

  16. ༧બ४උ ʙ!9/17!ग़୊ͷϓϩτλΠϓGoͷϕϯνΫϥΠΞϯτԾ࣮૷ 9/25ʙ%@acidlemon%ʹղ͍ͯ΋Β͍͸͡ΊΔ 9/30%/recent/*%Λ௥Ճ 10/2,3'Ruby,'Python,'Go,'Node,'PHP'Ҡ২ 10/5,6'ISUCON3'༧બ

  17. ༧બ౰೔ ࣗ୐͔ΒIRCͰαϙʔτ

  18. ༧બͷʮ᠘ʯ

  19. MySQL&InnoDB&memcached&plugin MySQL&5.6ͷ৽ػೳ • memcached(protocolͰMySQLͱ௨৴Ͱ͖Δ • port(11211(Λ(Listen • ΞϓϦέʔγϣϯ͔Βηογϣϯอଘʹ࢖༻ • port(11212(Ͱී௨ͷ(memcached(΋ىಈͯ͋͠Δ

    • ॳظঢ়ଶͰ͸࢖༻͍ͯ͠ͳ͍
  20. ҙຯͷͳ͍!CSS!link <link rel="stylesheet" href="/"> • ϕϯνϚʔΧʔ͸ϦϯΫΛḷͬͯ"/"ʹϦΫΤετΛඈ͹͢ • ͔͠͠είΞ͸"0఺ • PageViewͰ͸ͳ͍ͱ͍͏ѻ͍

    • HTML͔Β࡟আ͢ΔͱϦΫΤετ͠ͳ͘ͳΔ
  21. ҰൃΞ΢τͰ͸ͳ͍ݮ఺ํࣜ fail=3·Ͱ͸ݮ఺ͳ͠ failͷࣗ৐%&(ͨͱ͑͹&fails=6&ͳΒ& )&Λݮ఺ fail%>=%13%Ͱ% %ݮ఺ʹͳΔͷͰείΞ%0

  22. ༧બͷ൓ল఺ • είΞϦϯάͷৄࡉ͕ެ։͞Ε͍ͯͳ͔ͬͨ • /recent/*"ʹର͢ΔϕϯνϚʔΧʔͷνΣοΫ͕؁͔ͬͨ • ͋ͱ͔Β௥Ճͨ͠෦෼ • ͜͜Λ"Cache"͢ΔͱΑ͘ճΔ

  23. ༧બϕϯνϚʔΧʔ • Go੡ • ࢀՃऀ͕ࣗ༝ʹͳΔϗετͰಈ࡞͢ΔͨΊɺղੳ͞Εʹ͍͘ Α͏ʹ • --workload$Φϓγϣϯॳಋೖ • ISUCON$1,2Ͱ͸ௐ੔Ͱ͖ͳ͔ͬͨ

  24. ༧બϕϯνϚʔΧʔ • ੩తϑΝΠϧ͚ͩΞΫηε͢Δ"sta&c"worker • ϦΫΤετ͝ͱʹ"10ms"wait • /recent/*"͚ͩΞΫηε͢Δ"recent"worker • ϩάΠϯɺ౤ߘɺӾཡɺϩάΞ΢τɺӾཡΛ܁Γฦ͢"main" worker

  25. ༧બϕϯνϚʔΧʔ !͕߹ܭ!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)

  26. ༧બϕϯνϚʔΧʔͷʮ݀ʯ recent&worker&͸ • wait&ͳ͠ʹճΔ • දࣔཁૉ͕ߋ৽͞Ε͍ͯΔ͔Ͳ͏͔ͷνΣοΫΛͯ͠ͳ ͍ʂʂʂ /recent/*!ΛΩϟογϡͯ͠ߴ଎ʹฦ͢ͱ!είΞ↑↑

  27. ༧બͷ൓ল఺ είΞࢉग़ͷৄࡉ͸ެ։͢΂͠ ա౓ͳʮ᠘ʯ͸Α͘ͳ͍ ϕϯνϚʔΧʔͷ݀͸Ͱ͖ΔݶΓ௵͢΂͠

  28. 11/9$ຊબ

  29. ຊબग़୊ʹ౰ͨͬͯ ʮ᠘ʯ͸΍ΊΑ͏ ෳ਺αʔόΛ༗ޮʹ࢖͑Δग़୊ʹ͠Α͏

  30. ຊબ୲౰ !@fujiwara!໰୊ɺϕϯνϚʔΫɺείΞूܭγεςϜ !@acidlemon!ࣄલղ౴ɺϕϯνϚʔΫνΣοΫɺΦʔϓχϯ άɺϨΪϡϨʔγϣϯ !@handlename:!nodeҠ২ɺಈ࡞֬ೝ !@mix3:!GoҠ২ɺಈ࡞֬ೝ !@nobu_ohta:!RubyҠ২ɺPythonҠ২ !@m0t0k1ch1:!PHPҠ২ɺ෧౵σβΠϯ

  31. ຊબ४උ 10/17%ΩοΫΦϑ 10/29%ग़୊ͱϕϯνϚʔΧʔϓϩτλΠϓͰղ͖࢝ΊΔ%ଟݴޠҠ ২։࢝ 11/5%5୆ߏ੒Ͱղ͘,%ຊ൪༻αʔό࢓ࠐΈ 11/7%ຊ൪αʔό্Ͱςετ։࢝ 11/8%݁Ռूܭը໘࡞੒ɺσόοά 11/9%ISUCON3%ຊબ

  32. ຊબग़୊಺༰ ը૾౤ߘ͕Ͱ͖ΔSNS HTMLΛฦ͢෦෼͸ͳ͘ɺJSON)APIͷΈ ϢʔβΛϑΥϩʔͰ͖ΔɻϑΥϩʔ͍ͯ͠ΔϢʔβͷ౤ߘ͕ྲྀΕ ͯ͘Δ Long%polling%API%͋Γ ϕϯνϚʔΧʔ͸ը૾Λ౤ߘͨ͠ΓJSONΛऔಘͨ͠Γ͢Δ

  33. είΞࢉग़ํ๏ Լهͷ!(a)+(b)+(c)!͕૯߹είΞ (a)$౤ߘεϐʔυ఺$=$ϨεϙϯελΠϜ͕଎͍΄ͲߴείΞ (b)$λΠϜϥΠϯ൓ө଎౓఺$=$౤ߘͨ͠ΤϯτϦͷ৘ใ͕൓ө͞Ε Δͷ͕଎͍΄ͲߴείΞ (c)$ͦͷଞϦΫΤετ఺$=$1఺

  34. είΞࢉग़ํ๏ ϨεϙϯελΠϜʹґଘ͢ΔείΞ͸ҎԼͷܭࢉࣜʹΑΔ 5"sec"="1 1"sec"="3.3 100"msec"="6.64 10"msec"="9.9

  35. ຊબͷϙΠϯτ 5୆ͷαʔόΛͲ͏࢖͏͔ ॳظঢ়ଶͰ͸1୆ͷΈʹΞϓϦέʔγϣϯ͕ىಈ͍ͯ͠Δ 2ʙ4୆໨͸ʮۭʯ(OSɺϛυϧ΢ΣΞͷॳظઃఆͷΈ) ଳҬ͸1୆͋ͨΓ • eth0&:&100Mbps&(ϕϯνϚʔΧʔ͕ΞΫηε) • eth1&:&1Gbps&(ࣗ༝ʹ࢖͑Δ)

  36. ຊબͷϙΠϯτ ը૾ͷϦαΠζΛ͍ͭߦ͏͔ ॳظঢ়ଶ͸ϦΫΤετ͝ͱʹຖճಈతੜ੒ 1. ౤ߘ࣌ʹ#S,#M,#L#ͷ3αΠζ#+#ΦϦδφϧΛશͯੜ੒͠อଘ 2. ౤ߘ࣌͸ΦϦδφϧͷΈอଘ͠ɺαϜωΠϧ͸Ӿཡ࣌ʹੜ੒ ※!શͯͷαϜωΠϧ͕ϦΫΤετ͞ΕΔΘ͚Ͱ͸ͳ͍

  37. ຊબͷϙΠϯτ ը૾ͷϦαΠζΛԿͰߦ͏͔ ॳظ࣮૷͸!ImageMagick!convert!ίϚϯυΛ(֎෦)࣮ߦ • ը૾ϥΠϒϥϦʹΑͬͯม׵݁Ռʹࠩҟ͕ͰΔ • ը૾Λൺֱ͢ΔπʔϧΛఏڙɻϦϑΝϨϯε࣮૷ͱͷޡ͕ࠩҰ ఆҎԼͰͳ͍ͱfail

  38. ຊબͷϙΠϯτ Long%poll%API%ΛͲ͏ߴ଎Խ͢Δ͔ ॳظ࣮૷͸2ඵsleepͯ͠ฦͤΔ΋ͷ͕͋Δ͔νΣοΫ • ฏۉϨεϙϯελΠϜ͕1ඵʹͳΔ • ԿΒ͔ͷΠϕϯτ௨஌Λར༻ͯ͠ߴ଎ʹ൓өͰ͖ΔͱߴείΞ

  39. ຊબͷϙΠϯτ ଳҬΛ͍͔ʹຒΊΔ͔ ϕϯνϚʔΧʔ͸࠷େ!100Mbps! !5!=!500Mbps!Λ࢖͑Δ Ͱ͖Δ͚ͩଟ͘ͷϗετ͔Β഑৴͢ΔͱଳҬΛ༗ޮʹ࢖͑Δ

  40. ຊબϕϯνϚʔΧʔ 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

  41. ຊબϕϯνϚʔΧʔͷଳҬ੍ޚ LVS$Ͱ$localhost:[νʔϜʹରԠ͢Δport]$͔Βϕϯν૬खʹ$NAT ϕϯνϚʔΫϦΫΤετ࣌ʹ!NAT!ઌͷෳ਺ϗετΛ!on!/!off QoS$github.com/matsumoto1r/qos1control tc#ͷ#wrapper.#100Mbps#ʹ੍ݶ

  42. ຊબͷ൓ল ଟগͷτϥϒϧ͸͋ͬͨ΋ͷͷ͓͓ΉͶָ͠ΜͰ໯͑ͨ • ϕϯνϚʔΧʔͷෳ਺୆੾Γସ͑όά • Pythonॳظ࣮૷Ͱ·Εʹ(Fail(͢Δ • tmpfile(ͷ(flush(λΠϛϯά ࠷ޙ!Fail!͢ΔνʔϜ͕ଟ͔ͬͨͷ͕࢒೦

  43. None