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

ISUCON大反省会

9318744519d282ae40e352e6a1b79b2a?s=47 takashabe
November 26, 2015

 ISUCON大反省会

社内のISUCON大反省会で話した資料です。

9318744519d282ae40e352e6a1b79b2a?s=128

takashabe

November 26, 2015
Tweet

Transcript

  1. ISUCONେ൓লձ 2015/11/13 Mynet Inc. Takashi Abe

  2. ͩΕʁ • @takashabe • ISUCON5͸ຊબ9ҐͰࢂഊ͠·ͨ͠ • ΞΠίϯˠ

  3. Agenda • ISUCONͱ͸ • ४උ • ܏޲ͱରࡦ • ײ૝

  4. None
  5. “͓୊ͱͳΔWebαʔϏεΛܾΊ ΒΕͨϨΪϡϨʔγϣϯͷதͰݶ ք·Ͱߴ଎ԽΛਤΔνϡʔχϯά ότϧɺͦΕ͕ISUCONͰ͢ɻ” - http://isucon.net/

  6. ϨΪϡϨʔγϣϯ • WebΞϓϦέʔγϣϯͷϨεϙϯε݁Ռ͕ม ΘΒͳ͍͜ͱ • ଞνʔϜͷ๦֐Λ͠ͳ͍͜ͱ

  7. WebΞϓϦέʔγϣϯͷߏ੒ཁૉ • OS • RHELܥ, Debianܥ • ݴޠ • Perl,

    Ruby, PHP, Python, go, Scala, Java, Node.js • ϛυϧ΢ΣΞ • MySQL, PostgreSQL, Redis, Memcached • Nginx, Apache, Varnish • ϋʔυ΢ΣΞ • Mem, HDD, SSD
  8. ݴޠɺϛυϧ΢ΣΞͷબ୒ • ݴޠ͸ෳ਺ͷࢀߟ࣮૷͔Βࣗ༝ʹબ୒ग़དྷΔ • ݴޠͷ༏ྼ͚ͩͰউ͕ܾͪ·Βͳ͍ • DB, Webαʔόͷࡌͤସ͑΋OK • PostgreSQL

    -> MySQL • Apache -> Nginx • ͳΜͳΒOSࡌͤସ͑ͯ΋ྑ͍
  9. શͯΛͿͬյ͢ݖར͕͋Δ

  10. ༧બͱຊબ

  11. ༧બ • ΦϯϥΠϯ • 2ʙ3ਓ1૊ • IaaS • AWS, GCPͳͲ

  12. ຊબ • ΦϑϥΠϯ • LINEձ৔ • ༧બΛউͬͨνʔϜ • ΦϯϓϨ্ͷVM͕ఏڙ͞ΕΔ •

    NHNςίϥε
  13. ४උ

  14. ΍ͬͨ͜ͱ • ༧બ2ϲ݄લ͔ΒISUCON෦Λ࡞ͬͯि2Ͱ׆ ಈͨ͠ • աڈ໰Λࢀߟճ౴ʹԊͬͯखΛಈ͔͢ • ౎౓Θ͔Βͳ͍΋ͷΛௐ΂ͨΓ

  15. աڈ໰Λղ͘ • MySQL͔ΒRedisʹࡌͤସ͑ • ΦϯϝϞϦ • Apache͔ΒNginxʹࡌͤସ͑ • ΠϕϯτۦಈͰܰྔ •

    ΫΤϦνϡʔχϯά • indexΛషΔ, index͕࢖ΘΕΔΑ͏ʹҙࣝ • MySQL, Nginxͷύϥϝʔλνϡʔχϯά • ΩϟογϡΛ૿΍͢ • ίʔυ্ͷνϡʔχϯά • ৑௕ͳϧʔϓͷഉআͳͲͳͲ
  16. ൿ఻ͷλϨ • ͱΓ͋͑ͣ౤ೖ͢Δ΋ͷ • sshपΓͷઃఆɺzshɺϓϩϑΝΠϦϯάπʔϧ • ࣄલʹ༻ҙͨ͠ઃఆϑΝΠϧ • nginx.conf, my.cnf

    • αʔόߏ੒ɺαʔϏεಛੑʹΑͬͯ͸ௐ੔͕ඞཁ
  17. ௐ΂ͨ͜ͱ΍λϨ͸githubͷ issueͰڞ༗

  18. None
  19. None
  20. ܏޲ͱରࡦ

  21. ༧બ • ্Ґ20νʔϜҐ͕ຊબग़৔Մೳ • 1ҐʹͳΔඞཁ͸ͳ͍ • جຊʹ஧࣮ʹ΍Ε͹ಥഁग़དྷΔ(ଟ෼) • ࣄલʹ༻ҙ͞ΕΔOS, ݴޠ,

    ΠϯϑϥͳͲͷ৘ ใ͕ެ։͞ΕΔ
  22. ISUCON5ͷ༧બ • ࣄલʹ෼͔͍ͬͯͨ͜ͱ • ग़৔νʔϜ270͘Β͍ • Ubuntu • Perl, Ruby,

    PHP, Python, go, Scala, Java, Node.js͕༻ҙ͞ΕΔ༧ఆ • Node.js͸४උ͕ؒʹ߹Θͣμϝͩͬͨ • Πϯϑϥ͸GCP(ϕʔεΠϝʔδ͕༻ҙ͞Ε͍ͯΔͷͰ֤ࣗ༻ҙ)
  23. ΞϓϦέʔγϣϯ • mixiͷΑ͏ͳSNS • ༑ͩͪొ࿥΍଍͋ͱ

  24. αʔόߏ੒ • Ubuntu 15.04 • systemd • MySQL • Nginx

    • 4CPU / 4GB Mem • 1୆
  25. ਐΊํ • ϓϩϑΝΠϦϯά • ϘτϧωοΫमਖ਼ • ϓϩϑΝΠϦϯά • ϘτϧωοΫमਖ਼ •

    … • ࠶ىಈςετ
  26. ϓϩϑΝΠϦϯά • NginxͷΞΫηεϩά • kataribe • MySQLͷεϩʔΫΤϦϩά • pt-query-digest

  27. ϘτϧωοΫ • ஗͍ϖʔδ • ஗͍ݪҼ • N+1ΫΤϦ • ΫΤϦύϑΥʔϚϯε

  28. ϘτϧωοΫͷ௵͠ํ • ݪҼʹΑΔ͕… • N+1ΫΤϦ • ϧʔϓ಺Ͱ౎౓ΫΤϦΛ౤͍͛ͯΔ • joinͳͲͰ1ΫΤϦͰࡁ·ͤΔΑ͏ʹ͢Δ •

    ΫΤϦࣗମ͕ॏ͍ • औಘ͢ΔσʔλΛݮΒ͢ • LIMIT OFFSETͳΫΤϦΛwhereͰߜΓࠐΉͳͲ
  29. ࠶ىಈςετ • ڝٕऴྃޙʹӡӦଆͰ࠶ىಈͯ͠࠷ऴείΞ ΛऔΔ • ࠶ىಈޙʹඞཁͳ΋ͷ্ཱ͕͕͍ͪͬͯͳ͍ ͱ٧Ή

  30. Ωϟογϡͷ΢ΥʔϜΞοϓ • MySQL(innoDB)͸ΫΤϦ݁ՌΛϝϞϦ্ʹόοϑΝ͠ ͯ͘ΕΔ • ࠶ىಈޙ͸όοϑΝ͕ແ͍ͷͰύϑΥʔϚϯε͕ग़ͳ ͍ • select *

    from user; • innodb_buffer_pool_dump_at_shutdown, innodb_buffer_pool_load_at_startup
  31. ͦΜͳײ͡Ͱண࣮ʹϘτϧωο ΫΛղফ͍͚ͯ͠͹༧બಥഁ Ͱ͖·͢(ؤுΕ͹)

  32. ISUCON5ͷຊબ • ෳ਺୆ߏ੒ • ༧બͰߦͬͨΑ͏ͳDBνϡʔχϯά͸طʹ׬ ͍ྃͯ͠Δঢ়ଶ • ֎෦APIʹΞΫηε͢Δ

  33. ΞϓϦέʔγϣϯ • Ϣʔβ͕ෳ਺ͷαʔϏε(API)Λొ࿥ͯ͠ɺͦ ͔͜Β݁ՌΛऔಘ͢ΔΑ͏ͳ΍ͭ • API݁ՌΛϕϯνϚʔΫʹฦ͢͜ͱ͕ग़དྷͨ਺ ͰείΞ͕ग़Δ

  34. ಛ௃ • ༧બ΄Ͳ୯७Ͱ͸ͳ͍ • αʔϏεಛੑʹ߹ͬͨνϡʔχϯά͕ٻΊΒ ΕΔ

  35. APIϦΫΤετͷฒྻԽ • γʔέϯγϟϧͰϦΫΤετ͢ΔͷͰ͸ͳ͘ɺ ฒྻʹϦΫΤετΛૹΔΑ͏ʹ͢Δ • goͱ͔Node.js͕༗རͩͬͨ • ※ ༏উνʔϜ͸Perl

  36. API݁ՌͷΩϟογϡ • APIϨεϙϯεΛΩϟογϡͯ͠͠·͏ • Ϩεϙϯε݁Ռ͕සൟʹมΘΔΑ͏ͳ΋ͷ͸ TTLΛ୹͘, ٯʹશ͘มΘΒͳ͍΋ͷ͸௕͘ • ΩϟογϡΛಡΉͱ͖ʹ΋N+1ʹͳΒͳ͍Α ͏ɺmset/mgetΛ࢖͏

  37. ෳ਺୆Ͱॲཧ͢Δ • NginxͳͲͰόϥϯγϯάͯ͠3୆શͯͰॲཧ ग़དྷΔΑ͏ʹ͢Δ

  38. HTTPϔομΛಡΜͰద੾ͳઃ ఆΛೖΕΔ • Last-Modified • if-Modified-SinceϔομΛ෇͚ͯAPIʹ໰͍߹ΘͤΔͱଈ࠲ʹ 304͕ฦͬͯ͘Δ࢓༷ͩͬͨ • ී௨ʹ໰͍߹ΘͤΔͱ಺෦Ͱ500ms sleep͍ͯ͠ΔAPIͩͬͨ

    • Accept-Encoding: gzip • Nginxͷgzip_staticͰ௨৴ྔΛݮΒͤͨ
  39. ຊબͰ͸ΩϟογϡΛҰ෦ઃఆ͠ ͯෳ਺୆ߏ੒ʹ͚ͨͩ͠ͰऴΘͬ ͯ͠·͍ࢂഊ͠·ͨ͠(չ͍͠)

  40. ײ૝

  41. ྑ͔ͬͨ఺ • νϡʔχϯάͷצॴ͕෼͔ΔΑ͏ʹͳͬͨ • ϛυϧ΢ΣΞͷ࢓૊Έʹৄ͘͠ͳͬͨ • ࣗ෼ͷ࣮ྗͷແ͕͞վΊͯ෼͔ͬͨ • ࠷ߴʹָ͔ͬͨ͠ •

  42. ѱ͔ͬͨ఺ • ಛʹແ͠

  43. དྷ೥΋(΋͠։࠵͞ΕΕ͹)ੋ ඇࢀՃ͠·͠ΐ͏!!!

  44. དྷ೥·Ͱ଴ͯͳ͍ʁ

  45. ࣾ಺ISUCON΍Δͧʂʂ̍

  46. ։࠵೔࣌ͱ͔ • 12্݄०ʙத० • 4࣌ؒ • 1ʙ2ਓ1νʔϜ • ࢀߟ࣮૷༧ఆ:PHP, Ruby,

    Python, Go, Java, Scala
  47. “ISUCONࢀՃલͱࢀՃޙʹ࠷ ΋ଟ͘ͷ΋ͷΛ࣋ͪؼͬͨਓ͜ ͕ͦউऀͱݴ͑ΔͰ͠ΐ͏ɻ” - http://tagomoris.hatenablog.com/entry/2015/07/10/131140