大規模Webサービス入門 2回目 / Introduction to large scale web service 2

Fd09da0d9751bb7875ef4ff7e6201860?s=47 muttan
August 04, 2017
46

大規模Webサービス入門 2回目 / Introduction to large scale web service 2

Fd09da0d9751bb7875ef4ff7e6201860?s=128

muttan

August 04, 2017
Tweet

Transcript

  1. େن໛αʔϏεٕज़ೖ໳ ୈ2ճ ISUCONରࡦษڧձ 2017/8/4

  2. ֓ཁ • શ෦Ͱ15ճ෼͋Γ·͕͢, 1ճ໨͸ύε͠·͢. • ඞཁͦ͏ͳͱ͜ΖΛ͔͍ఠΜͰ঺հ͠·͢. • ίϥϜ͸جຊతʹޙ͔Β΍Γ·͢. • ࢀߟॻɿ


    Web։ൃऀͷͨΊͷ
 େن໛αʔϏεٕज़ೖ໳
  3. ୈ2ճ େن໛σʔλॲཧೖ໳ - ϝϞϦͱσΟεΫ, WebΞϓϦέʔγϣϯͱෛՙ -

  4. େن໛σʔλಛ༗ͷࣄ৘Λ஌Δ • 2ʙ5ճ͸େن໛σʔλͷѻ͍ํΛ஌Δ. ճ਺ ಺༰ ճ ॲཧͷجຊͱͳΔ஌ࣝ ճ 04ͷΩϟογϡ ճ

    .Z42-ͷӡ༻ ճ େن໛ΞϓϦ։ൃʹ͍ͭͯ
  5. Lesson4 ͸ͯͳϒοΫϚʔΫͷ σʔλن໛

  6. Lesson4 • ͸ͯͳϒοΫϚʔΫʹ͸, 3ԯ5000ສ݅ͷσʔ λ͕ೖ͍ͬͯΔΒ͍͠. • ࠷ॳʹΑ͘౤͛Δ͜ͱ͕͋ΔQueryʮSELECT * FROM <table>ʯΛ౤͛Δͱ,

    ౰ͨΓલ͚ͩ ͲԠ౴͕ฦͬͯ͜ͳ͍.
  7. Lesson5 େن໛σʔλॲཧͷ೉ॴ

  8. Կ͕೉͍͠ͷ͔ • σʔλ͕େن໛ա͗ͯϝϞϦʹࡌΒͳ͍. • ϝϞϦʹࡌΒͳ͍ͷͰ, σΟεΫঢ়Λݕࡧ͠ ͍ͯ͘͜ͱʹͳΔ. • I/O଎౓͕, σΟεΫ>>>ϝϞϦͳͷͰ͸͍.

  9. ϝϞϦͱσΟεΫͷ଎౓ࠩ • ϝϞϦ্Λ୳ࡧ͢ΔͷͱσΟεΫΛ୳ࡧ͢Δ ͷʹͲͷ͘Β͍ͷ଎౓͕ࠩ͋Δͷ͔. • 10^5͔Β10^6͘Β͍ͷ͕ࠩ͋Δ. • ʂʂσΟεΫ͸ϝϞϦͷ10^6ഒ͔͔Δʂʂͱ ͍͏ײ֮Λ࣋ͱ͏.

  10. ԿނσΟεΫ͸஗͍ͷ͔ • ͜Ε͸ྲྀੴʹৗࣝͳͷͰলུ. • ϝϞϦͳΒϚΠΫϩඵͷΦʔμʔ͕ͩ, σΟεΫͰ͸ϛϦ ඵͷΦʔμʔͳͷͰ. • ϝϞϦͱCPU͸ૣ͍όεͰͭͳ͕͍ͬͯΔ͕, σΟεΫͱ

    CPU͸ϝϞϦͱCPUʹൺ΂Δͱ͔ͳΓ஗͍. • ϝϞϦͱσΟεΫͷؾ࣋ͪʹͳͬͯΞϓϦΛ࡞Ζ͏.
  11. ԿނσΟεΫ͸஗͍ͷ͔ HDD͸ಡΈग़͢·Ͱͷ޻ఔʹ͕͔͔࣌ؒΔ

  12. Lesson6 εέʔϦϯάͷཁॴ

  13. εέʔϦϯά, εέʔϥϏϦςΟ • ෛՙ෼ࢄΛ͢Δ࿩. • ڧ͍PCͰԥΔ͜ͱΛʮεέʔϧΞοϓʯ • ҆ՁͰී௨ͷੑೳͷϋʔυ΢ΣΞΛฒྻʹฒ ΂ͯγεςϜશମͷੑೳΛΞοϓͤ͞Δ͜ͱ ΛʮεέʔϧΞ΢τʯ

  14. εέʔϦϯάͷཁॴ • HTTPϦΫΤετΛड෇͚, DBαʔόʹ໰͍߹ΘͤΛ͠, Ճ޻ͯ͠ฦ͢Α͏ͳॲཧ͸CPUʹͷΈෛՙ͕͔͔Δ. • ͜ͷΑ͏ͳॲཧΛ͢ΔαʔόΛΞϓϦέʔγϣϯαʔ όʢAPαʔόʣͱ͍͏. • APαʔόʹରͯ͠,

    DBαʔό͸I/Oෛՙ͕େ͖͔͔ͬ͘ ͯ͘Δ.
  15. WebΞϓϦέʔγϣϯͱෛՙ WebΞϓϦέʔγϣϯ3૚ߏ଄ APαʔό ϓϩΩγ DBαʔό ᶃϦΫΤετ ᶄϦΫΤετ ᶅI/Oൃੜ ᶆϨεϙϯε $16ͷॲཧ͸

    جຊతʹσʔλΛ෼ࢄ ͍ͯ࣋ͬͯ͠ΔΘ͚Ͱ͸ͳ͍ͷͰ୆਺ Λ૿΍͚ͩ͢ͰεέʔϦϯάՄೳ
  16. WebΞϓϦέʔγϣϯͱෛՙ WebΞϓϦέʔγϣϯ3૚ߏ଄ APαʔό ϓϩΩγ DBαʔό ᶃϦΫΤετ ᶄϦΫΤετ ᶅI/Oൃੜ ᶆϨεϙϯε ۃ୺ͳ࿩

    ୆਺Λ૿΍ͯ͠ϩʔυόϥϯ αʹ͍͍ײ͡ʹৼΓ෼͚ͯ΋Β͏͚ͩ Ͱྑ͍ͱ͜Ζ΋͋Δ
  17. WebΞϓϦέʔγϣϯͱෛՙ WebΞϓϦέʔγϣϯ3૚ߏ଄ APαʔό ϓϩΩγ DBαʔό ᶃϦΫΤετ ᶄϦΫΤετ ᶅI/Oൃੜ ᶆϨεϙϯε ͜ͷߏ੒ʹDBΛ1ͭ௥Ճ͢Δ͜ͱΛߟ͑Δ.

  18. WebΞϓϦέʔγϣϯͱෛՙ WebΞϓϦέʔγϣϯ3૚ߏ଄ APαʔό ϓϩΩγ DBαʔόᶃ ᶃϦΫΤετ ᶄϦΫΤετ ᶅI/Oൃੜ ᶆϨεϙϯε DBαʔόᶄ

    %#Λ૿΍ͨ࣌͠ %#ᶃͱ%#ᶄ ΛͲ͏΍ͬͯಉظΛͱΔͷ͔ ͱ͍͏໰୊͕ग़ͯ͘Δ ॻ͖ࠐΈͷ෼ࢄ͸೉͍͠ ???
  19. DBͷεέʔϥϏϦςΟ͸Ϡό͍ • I/O͕ൃੜ͢Δͱ͜ΖͷεέʔϥϏϦςΟΛ֬อ͢Δͷ ͸೉͍͠. • ͦͷ্σΟεΫͷI/O଎౓͕ඇৗʹ஗͍ͷͰ, I/O͕ͨ͘ ͞Μൃੜ͢ΔΑ͏ͳ΋ͷ͸ʢ౰ͨΓલ͕ͩʣ஗͘ͳΔ. • σʔλ͕େ͖͘ͳΕ͹ͳΔ΄ͲσΟεΫ্Ͱͷ୳ࡧ͕

    ૿͑ΔͷͰ஗͘ͳ͍ͬͯ͘.
  20. DBͷεέʔϥϏϦςΟ͸Ϡό͍ • ҆қʹʮ଎౓͕஗͍͔Βαʔό૿΍ͤΑʯͳ ͲͱӡӦʹݴͬͯ͸͍͚ͳ͍. • ͱʹ͔͘I/O͸͔ͬ͠Γߟ͑Α͏Ͷͱ͍͏͓࿩

  21. Lesson7 େن໛σʔλΛѻ͏ͨΊͷ جૅ஌ࣝ

  22. 3ͭͷצॴ 1. ·ͣ͸͡ΊʹΦϯϝϞϦͰͰ͖ͳ͍͔ߟ͑Δ. • σʔλ਺͕গͳ͚Ε͹ϝϞϦʹ৐͍ͤͯ͑ͬ ͯ΍Ε͹͍͍. 2. ΞϧΰϦζϜΛֶΜͰѹ౗త଎౓Λग़ͦ͏. 3. σʔλѹॖ΍ݕࡧٕज़Λ͏·͘࢖͓͏.

  23. ΦϯϝϞϦʹ͢Δ • σΟεΫ͸஗͍. • γʔΫճ਺ΛͳΔ΂͘ݮΒ͢. • ہॴੑΛ׆͔͢.

  24. ΞϧΰϦζϜΛվྑ • શ୳ࡧ, ઢܗ୳ࡧ͢ΔΑΓ΋ར༻ՄೳͳΒೋ෼ ୳ࡧΛ࢖͓͏.(nlog(n)ͷΦʔμʔ) • ΍ͬͺΓͶΞϧΰϦζϜͬͯͷ͸ॏཁ

  25. ࡾେલఏ஌ࣝ 1. OSͷΩϟογϡ 2. ෼ࢄΛߟྀͨ͠RDBMSͷӡ༻ 3. ΞϧΰϦζϜͱσʔλߏ଄ΛͲ͏΍ͬͯద༻ ͢Δ͔. ͜ͷ3ͭ͸͜Ε͔Β΍͖ͬͯ·͢

  26. ίϥϜ

  27. Linux୯Ұϗετͷෛՙ

  28. ਪଌ͢Δͳ, ܭଌͤΑ • ਪଌΛͤͣܭଌΛͯ͠ϘτϧωοΫΛ୳ͦ͏. • ISUCONͰ΋ܭଌ͸ඇৗʹॏཁͳςΫχοΫ. • ϘτϧωοΫΛऔΓআ͍ͯຊདྷͷੑೳΛऔΓ ໭ͦ͏.

  29. ϘτϧωοΫΛݟۃΊΔྲྀΕ • ϩʔυΞϕϨʔδΛݟΔ • CPU, I/OͷϘτϧωοΫΛݟΔ • ͜ͷ2ͭͷ࡞ۀΛߦ͏.

  30. ϩʔυΞϕϨʔδΛݟΔ • ϩʔυΞϕϨʔδΛݟΔ • ϩʔυΞϕϨʔδ͸ʮγεςϜશମͷෛՙঢ় گΛࣔ͢ࢦඪʯ • ϩʔυΞϕϨʔδ͚ͩͰ͸ϘτϧωοΫʹ ͳ͍ͬͯΔՕॴ͸Θ͔Βͳ͍ͷͰ, ख͕͔Γ

    ʹͯ͠ௐࠪ͢Δ.
  31. CPU, I/Oͷ͍ͣΕ͔͕Ϙτϧ ωοΫ͔Λ୳͢ • ϩʔυΞϕϨʔδ͕ߴ͔ͬͨ৔߹, ͦͷݪҼ͕ CPUͳͷ͔I/Oͳͷ͔Λ୳͢. • sar, vmstat౳Λ࢖ͬͯ୳͢.

  32. CPUෛՙ͕ߴ͍৔߹ • ϢʔβʔϓϩάϥϜ͕ѱ͍ͷ͔, γεςϜͦͷ ΋ͷ͕ѱ͍ͷ͔Λtop΍sarͰ֬ೝ. • psΛ࢖ͬͯϓϩηεͷঢ়ଶΛݟΔ. • strace΍oprofileͰϓϩϑΝΠϦϯά͍ͯ͘͠. •

    ϓϩϑΝΠϥ͸৭ʑ͋ΔͷͰ߹͏΋ͷΛ୳͢
  33. CPUෛՙ͕ߴ͍৔߹ • ҰൠʹCPUʹෛՙ͕͔͔ͬͯΔͷ͸ • CPUҎ֎͕ϘτϧωοΫʹͳ͍ͬͯͳ͍. • αʔόͷ૿ڧͳͲͰରԠ. • ϓϩάϥϜͷ๫૸ͳͲʹΑΓ, ඞཁҎ্ͷෛՙ͕CPUʹ͔

    ͔͍ͬͯΔ. • ϓϩάϥϜΛมߋ.
  34. I/Oෛՙ͕ߴ͍৔߹ • ϓϩάϥϜதͷI/O͕ଟ͍ • σΟεΫͷεϫοϓ͕େྔʹൃੜ͍ͯ͠Δ͍ͤ Ͱ஗͍ • sar΍vmstatͰ୳ͦ͏.

  35. I/Oෛՙ͕ߴ͍৔߹ • εϫοϓ͕େྔʹൃੜ͍ͯ͠Δ৔߹ • ಛఆͷϓϩηε͕઎༗ͯ͠ͳ͍͔ௐ΂Δ. • ϓϩάϥϜ͕ϝϞϦΛେྔʹফඅ͢ΔΑ͏ ͳ΋ͷͳΒमਖ਼͢Δ. • ϝϞϦΛ૿ઃ͢Δ.

  36. ύϑΥʔϚϯενϡʔχϯά • ༩͑ΒΕͨίϯϐϡʔλ͕ͦΕҎ্ͷ଎౓Ͱ ܭࢉΛ͢Δ͜ͱ͸Ͱ͖ͳ͍. • 10ඵ͔͔Δॲཧʹ100ඵඅ΍͍ͯ͠ΔΑ͏ͳ Β, ͦΕΛऔΓআ͘͜ͱ͕ग़དྷΔ͔Ͳ͏͔͕ॏ ཁʹͳͬͯ͘Δ.

  37. ೋछྨͷෛՙͱ
 WebΞϓϦέʔγϣϯ

  38. ෛՙͷछྨ • ෛՙ͸େ͖͘෼͚ͯ2ͭʹ෼ྨ͞ΕΔ. • CPUෛՙ • I/Oෛՙ

  39. CPUෛՙ • CPUෛՙͱ͍͏ͷ͸, ೖग़ྗͰ͸ͳ͘CPU্Ͱ ͷܭࢉʹΑͬͯෛՙ͕͔͔Δ͜ͱ.ʢܭࢉྔ͕ ଟ͍ʣ • CPUό΢ϯυͳϓϩάϥϜͱ΋ݺ͹ΕΔ.

  40. I/Oෛՙ • σΟεΫʹେྔͷσʔλ͕༗Γ, ͦͷத͔Β໨ తͱ͢ΔσʔλΛऔΓग़͢ϓϩάϥϜ. • ͜ͷ଎౓͸CPUͷੑೳͰ͸ͳ͘, σΟεΫͷੑ ೳʹґଘ͢Δ. •

    I/Oό΢ϯυͳϓϩάϥϜͱݺ͹ΕΔ.
  41. CPUෛՙͱI/Oෛՙ • APαʔό(ϦΫΤετʹରͯ͠ద౰ͳ݁ՌΛฦ ͢αʔό)͸CPUό΢ϯυͰ͋Δ. • ҰํͰ, DBαʔό͸σΟεΫ͔Βର৅ͷσʔλ ΛऔΓग़͢΋ͷͰ͋Γ, CPUෛՙΑΓ΋I/Oෛ ՙͷํ͕େ͖͘ͳΔͨΊI/Oό΢ϯυͰ͋Δ.

  42. ϚϧνλεΫOSͱෛՙ • ϚϧνλεΫͱ͍͏ͷ͸, ෳ਺ͷλεΫΛ୹͍ ִؒͰ੾Γସ͑ͯॲཧ͠, ͔͋ͨ΋ෳ਺͕ฒྻ ʹಈ͍ͯΔΑ͏ʹݟͤΔٕज़. " # $

    " ࣌ؒ
  43. ϚϧνλεΫOSͱෛՙ • λεΫ͕૿͑Ε͹ͦΕ͚ͩ଴͕ͪ௕͘ͳΔ. • ࣮ߦ଴ͪͷ࣌ؒ͸ϓϩάϥϜͷ࣮ߦ஗Ԇͱ͠ ͯݱΕͯ͘Δ. topίϚϯυΛ࣮ߦ

  44. ϩʔυΞϕϨʔδ͕ใࠂ͢Δ
 ෛՙͷਖ਼ମ • ϋʔυ΢ΣΞ͸CPUʹҰఆͷपظͰλΠϚׂΓࠐ ΈΛൃੜ͍ͤͯ͞Δ. • λΠϚׂΓࠐΈ͝ͱʹϩʔυΞϕϨʔδ͕ܭࢉ͞ Ε͍ͯΔ. • λΠϚׂΓࠐΈ͕ൃੜͨ͠ͱ͖ʹI/O଴ͪλεΫΛ

    ਺͑, ୯Ґ࣌ؒ͋ͨΓͷฏۉΛද͍ࣔͯ͠Δ.
  45. ϩʔυΞϕϨʔδ͕ใࠂ͢Δ
 ෛՙͷਖ਼ମ • ϩʔυΞϕϨʔδ͕ใࠂ͢Δෛՙ͸, ҎԼͷ2ͭͰ ͋Δͱߟ͑ΒΕΔ. • CPUͷ࣮ߦݖݶ͕༩͑ΒΕΔͷΛ଴͍ͬͯΔϓ ϩηε. •

    σΟεΫI/O͕׬ྃ͢ΔͷΛ଴͍ͬͯΔϓϩηε
  46. CPU࢖༻཰ͱI/O଴ͪ཰

  47. CPU࢖༻཰ͱI/O଴ͪ཰ • աෛՙͰγεςϜͷύϑΥʔϚϯε͕ྼԽ͢Δ ݪҼͱͯ͠͸, ҎԼͷ2ͭͰ͋Δ. 1. CPUෛՙ 2. I/Oෛՙ •

    ͲͪΒʹݪҼ͕͋Δͷ͔ௐ΂Δඞཁ͕͋Δ.
  48. sarίϚϯυΛ࢖͏ • sar(System Activity Reporter)ίϚϯυΛ࢖͏ ͱ, CPU࢖༻཰΍I/O଴ͪ཰Λ֬ೝ͢Δ͜ͱ͕ ग़དྷΔ. • ͳΜ͔macOSʹsar͸ແ͍Β͍͠…൵͍͠…

    • ksarͱ͍͏άϥϑΟΧϧͳsar΋͋ΔΒ͍͠
  49. sarίϚϯυΛ࢖͏(CPUෛՙฤ) • sarͷ͍͍ॴ͸࣌ؒܦաͱͱ΋ʹൺֱ͠ͳ͕Β ෛՙΛݟΔ͜ͱ͕ग़དྷΔ. • %user͸CPUͷϢʔβʔϞʔυͰͷ࢖༻཰ • %system͸γεςϜϞʔυͷ࢖༻཰

  50. sarίϚϯυΛ࢖͏(CPUෛՙฤ) • user͕ߴ͚Ε͹ಛఆͷϓϩηε͕େྔফඅ͍ͯ͠Δ Մೳੑ. • system͕ߴ͚Ε͹, ίϯςΩετεΠον͕ଟൃͯ͠ ͍ΔՄೳੑ͕͋Δ. • ϩʔυΞϕϨʔδ͕ߴ͘,

    ͜ΕΒͷෛՙ͕ଟ͚Ε͹ CPUϦιʔε͕ෆ଍͍ͯ͠Δ.
  51. sarίϚϯυΛ࢖͏(I/Oෛՙฤ) • CPUෛՙ͕ߴ͍৔߹͸%user΍%systemͷෛ ՙ͕ߴ͍. • I/Oෛՙ͕ߴ͍৔߹, %iowait͕ߴ͘ͳΔ. • ϩʔυΞϕϨʔδ͕ߴ͘, iowait͕ߴ͍৔߹͸I/

    Oෛՙ͕ඇৗʹߴ͘ͳ͍ͬͯΔͱߟ͑ΒΕΔ.
  52. ϚϧνCPUͱCPU࢖༻཰ CPUෛՙ͕ߴ͍ྫ I/Oෛՙ͕ߴ͍ྫ

  53. ϚϧνCPUͱCPU࢖༻཰ • ෺ཧతʹ͸1ͭͷίΞͰ͋ͬͯ΋, ݟ্͔͚ෳ ਺ͷCPU͕౥ࡌ͞Ε͍ͯΔΑ͏ʹݟ͑Δ෺͕ ͋Δ(ϚϧνίΞ) • LinuxΧʔωϧ͸CPU࢖༻཰ΛͦΕͧΕͷCPU ͝ͱʹอ͍࣋ͯ͠Δ.

  54. ϚϧνCPUͱCPU࢖༻཰ • CPU-id͕ৼΒΕͯදࣔ͞ΕΔ. ͜ͷ৔߹͸4ί ΞͷCPUͷsarίϚϯυ(-p͸ίΞ͝ͱʹग़ྗ) • ͜Ε͸CPUෛՙ͕ߴ͍ྫ

  55. ϚϧνCPUͱCPU࢖༻཰ • I/Oό΢ϯυ͕ߴ͍γεςϜͩͱͲ͏ͳΔͩΖ ͏͔ʁ • -pΛൈ͍ͯදࣔͯ͠ΈΔ. ฏۉ

  56. ϚϧνCPUͱCPU࢖༻཰ • -pΛ෇͚ͯΈΔͱ… ยํͰ଴͕ͪൃੜ͍ͯ͠ Δ͜ͱ͕෼͔Δ 

  57. ϚϧνCPUͱCPU࢖༻཰ • CPUͷ਺͕૿͑ͨͱ͜ΖͰ, σΟεΫ͕1͔ͭ͠ ͳ͚Ε͹I/OෛՙΛ෼ࢄ͢Δ͜ͱ͸Ͱ͖ͳ͍. • ϚϧνίΞͳ؀ڥʹ͓͍ͯෛՙΛݟΔ৔߹, ίΞ ͦΕͧΕʹ͍ͭͯݟ͍ͯ͘ඞཁ͕͋Δ.