Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  8. ࣾ಺ISUCONͰͷܦݧ
    • Ր༵໷"WebAppॻ͘
    • ਫ༵໷"ςετॻ͘
    • ໦༵໷"ϕϯνϚʔΫॻ͘
    • @acidlemon"ʹղ͍ͯ΋Β͏
    • ༵ۚே͔Β"ISUCON
    (னؒ͸ݚमͷߨࢣۀ)

    View Slide

  9. ࣾ಺ISUCONͰͷ൓ল఺
    • ్தͰϕϯνϚʔΫϗετ"㱻"֤VMͷଳҬةͳ͍
    • ଳҬ͕๞࿨͢ΔͱείΞ͕ࠩ෇͔ͳ͘ͳΔ
    • ్தͰ"Accept-Encoding: gzip"௥Ճ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. ༧બͷʮ᠘ʯ

    View Slide

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

    View Slide

  20. ҙຯͷͳ͍!CSS!link

    • ϕϯνϚʔΧʔ͸ϦϯΫΛḷͬͯ"/"ʹϦΫΤετΛඈ͹͢
    • ͔͠͠είΞ͸"0఺
    • PageViewͰ͸ͳ͍ͱ͍͏ѻ͍
    • HTML͔Β࡟আ͢ΔͱϦΫΤετ͠ͳ͘ͳΔ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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)

    View Slide

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

    View Slide

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

    View Slide

  28. 11/9$ຊબ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  43. View Slide