Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
大規模Webサービス入門 2回目 / Introduction to large scale web service 2
muttan
August 04, 2017
0
46
大規模Webサービス入門 2回目 / Introduction to large scale web service 2
muttan
August 04, 2017
Tweet
Share
More Decks by muttan
See All by muttan
bath_poo_
0
22
bath_poo_
0
71
bath_poo_
0
220
bath_poo_
0
80
bath_poo_
0
80
bath_poo_
1
170
bath_poo_
0
80
bath_poo_
0
110
bath_poo_
0
160
Featured
See All Featured
smashingmag
283
47k
samlambert
237
9.9k
rmw
11
750
jensimmons
207
10k
philhawksworth
190
17k
ddemaree
274
31k
mthomps
39
2.3k
garrettdimon
287
110k
carmenhchung
26
1.4k
bkeepers
52
4.2k
andyhume
62
3.5k
holman
461
280k
Transcript
େنαʔϏεٕज़ೖ ୈ2ճ ISUCONରࡦษڧձ 2017/8/4
֓ཁ • શ෦Ͱ15ճ͋Γ·͕͢, 1ճύε͠·͢. • ඞཁͦ͏ͳͱ͜ΖΛ͔͍ఠΜͰհ͠·͢. • ίϥϜجຊతʹޙ͔ΒΓ·͢. • ࢀߟॻɿ
Web։ൃऀͷͨΊͷ େنαʔϏεٕज़ೖ
ୈ2ճ େنσʔλॲཧೖ - ϝϞϦͱσΟεΫ, WebΞϓϦέʔγϣϯͱෛՙ -
େنσʔλಛ༗ͷࣄΛΔ • 2ʙ5ճେنσʔλͷѻ͍ํΛΔ. ճ ༰ ճ ॲཧͷجຊͱͳΔࣝ ճ 04ͷΩϟογϡ ճ
.Z42-ͷӡ༻ ճ େنΞϓϦ։ൃʹ͍ͭͯ
Lesson4 ͯͳϒοΫϚʔΫͷ σʔλن
Lesson4 • ͯͳϒοΫϚʔΫʹ, 3ԯ5000ສ݅ͷσʔ λ͕ೖ͍ͬͯΔΒ͍͠. • ࠷ॳʹΑ͛͘Δ͜ͱ͕͋ΔQueryʮSELECT * FROM <table>ʯΛ͛Δͱ,
ͨΓલ͚ͩ ͲԠ͕ฦͬͯ͜ͳ͍.
Lesson5 େنσʔλॲཧͷॴ
Կ͕͍͠ͷ͔ • σʔλ͕େنա͗ͯϝϞϦʹࡌΒͳ͍. • ϝϞϦʹࡌΒͳ͍ͷͰ, σΟεΫঢ়Λݕࡧ͠ ͍ͯ͘͜ͱʹͳΔ. • I/O͕, σΟεΫ>>>ϝϞϦͳͷͰ͍.
ϝϞϦͱσΟεΫͷࠩ • ϝϞϦ্Λ୳ࡧ͢ΔͷͱσΟεΫΛ୳ࡧ͢Δ ͷʹͲͷ͘Β͍ͷ͕ࠩ͋Δͷ͔. • 10^5͔Β10^6͘Β͍ͷ͕ࠩ͋Δ. • ʂʂσΟεΫϝϞϦͷ10^6ഒ͔͔Δʂʂͱ ͍͏ײ֮Λ࣋ͱ͏.
ԿނσΟεΫ͍ͷ͔ • ͜ΕྲྀੴʹৗࣝͳͷͰলུ. • ϝϞϦͳΒϚΠΫϩඵͷΦʔμʔ͕ͩ, σΟεΫͰϛϦ ඵͷΦʔμʔͳͷͰ. • ϝϞϦͱCPUૣ͍όεͰͭͳ͕͍ͬͯΔ͕, σΟεΫͱ
CPUϝϞϦͱCPUʹൺΔͱ͔ͳΓ͍. • ϝϞϦͱσΟεΫͷؾ࣋ͪʹͳͬͯΞϓϦΛ࡞Ζ͏.
ԿނσΟεΫ͍ͷ͔ HDDಡΈग़͢·Ͱͷఔʹ͕͔͔࣌ؒΔ
Lesson6 εέʔϦϯάͷཁॴ
εέʔϦϯά, εέʔϥϏϦςΟ • ෛՙࢄΛ͢Δ. • ڧ͍PCͰԥΔ͜ͱΛʮεέʔϧΞοϓʯ • ҆ՁͰී௨ͷੑೳͷϋʔυΣΞΛฒྻʹฒ ͯγεςϜશମͷੑೳΛΞοϓͤ͞Δ͜ͱ ΛʮεέʔϧΞτʯ
εέʔϦϯάͷཁॴ • HTTPϦΫΤετΛड͚, DBαʔόʹ͍߹ΘͤΛ͠, Ճͯ͠ฦ͢Α͏ͳॲཧCPUʹͷΈෛՙ͕͔͔Δ. • ͜ͷΑ͏ͳॲཧΛ͢ΔαʔόΛΞϓϦέʔγϣϯαʔ όʢAPαʔόʣͱ͍͏. • APαʔόʹରͯ͠,
DBαʔόI/Oෛՙ͕େ͖͔͔ͬ͘ ͯ͘Δ.
WebΞϓϦέʔγϣϯͱෛՙ WebΞϓϦέʔγϣϯ3ߏ APαʔό ϓϩΩγ DBαʔό ᶃϦΫΤετ ᶄϦΫΤετ ᶅI/Oൃੜ ᶆϨεϙϯε $16ͷॲཧ
جຊతʹσʔλΛࢄ ͍ͯ࣋ͬͯ͠ΔΘ͚Ͱͳ͍ͷͰ Λ૿͚ͩ͢ͰεέʔϦϯάՄೳ
WebΞϓϦέʔγϣϯͱෛՙ WebΞϓϦέʔγϣϯ3ߏ APαʔό ϓϩΩγ DBαʔό ᶃϦΫΤετ ᶄϦΫΤετ ᶅI/Oൃੜ ᶆϨεϙϯε ۃͳ
Λ૿ͯ͠ϩʔυόϥϯ αʹ͍͍ײ͡ʹৼΓ͚ͯΒ͏͚ͩ Ͱྑ͍ͱ͜Ζ͋Δ
WebΞϓϦέʔγϣϯͱෛՙ WebΞϓϦέʔγϣϯ3ߏ APαʔό ϓϩΩγ DBαʔό ᶃϦΫΤετ ᶄϦΫΤετ ᶅI/Oൃੜ ᶆϨεϙϯε ͜ͷߏʹDBΛ1ͭՃ͢Δ͜ͱΛߟ͑Δ.
WebΞϓϦέʔγϣϯͱෛՙ WebΞϓϦέʔγϣϯ3ߏ APαʔό ϓϩΩγ DBαʔόᶃ ᶃϦΫΤετ ᶄϦΫΤετ ᶅI/Oൃੜ ᶆϨεϙϯε DBαʔόᶄ
%#Λ૿ͨ࣌͠ %#ᶃͱ%#ᶄ ΛͲ͏ͬͯಉظΛͱΔͷ͔ ͱ͍͏͕ग़ͯ͘Δ ॻ͖ࠐΈͷࢄ͍͠ ???
DBͷεέʔϥϏϦςΟϠό͍ • I/O͕ൃੜ͢Δͱ͜ΖͷεέʔϥϏϦςΟΛ֬อ͢Δͷ ͍͠. • ͦͷ্σΟεΫͷI/O͕ඇৗʹ͍ͷͰ, I/O͕ͨ͘ ͞Μൃੜ͢ΔΑ͏ͳͷʢͨΓલ͕ͩʣ͘ͳΔ. • σʔλ͕େ͖͘ͳΕͳΔ΄ͲσΟεΫ্Ͱͷ୳ࡧ͕
૿͑ΔͷͰ͘ͳ͍ͬͯ͘.
DBͷεέʔϥϏϦςΟϠό͍ • ҆қʹʮ͕͍͔Βαʔό૿ͤΑʯͳ ͲͱӡӦʹݴ͍͚ͬͯͳ͍. • ͱʹ͔͘I/O͔ͬ͠Γߟ͑Α͏Ͷͱ͍͏͓
Lesson7 େنσʔλΛѻ͏ͨΊͷ جૅࣝ
3ͭͷצॴ 1. ·ͣ͡ΊʹΦϯϝϞϦͰͰ͖ͳ͍͔ߟ͑Δ. • σʔλ͕গͳ͚ΕϝϞϦʹ͍ͤͯ͑ͬ ͯΕ͍͍. 2. ΞϧΰϦζϜΛֶΜͰѹతΛग़ͦ͏. 3. σʔλѹॖݕࡧٕज़Λ͏·͓͘͏.
ΦϯϝϞϦʹ͢Δ • σΟεΫ͍. • γʔΫճΛͳΔ͘ݮΒ͢. • ہॴੑΛ׆͔͢.
ΞϧΰϦζϜΛվྑ • શ୳ࡧ, ઢܗ୳ࡧ͢ΔΑΓར༻ՄೳͳΒೋ ୳ࡧΛ͓͏.(nlog(n)ͷΦʔμʔ) • ͬͺΓͶΞϧΰϦζϜͬͯͷॏཁ
ࡾେલఏࣝ 1. OSͷΩϟογϡ 2. ࢄΛߟྀͨ͠RDBMSͷӡ༻ 3. ΞϧΰϦζϜͱσʔλߏΛͲ͏ͬͯద༻ ͢Δ͔. ͜ͷ3ͭ͜Ε͔Β͖ͬͯ·͢
ίϥϜ
Linux୯Ұϗετͷෛՙ
ਪଌ͢Δͳ, ܭଌͤΑ • ਪଌΛͤͣܭଌΛͯ͠ϘτϧωοΫΛ୳ͦ͏. • ISUCONͰܭଌඇৗʹॏཁͳςΫχοΫ. • ϘτϧωοΫΛऔΓআ͍ͯຊདྷͷੑೳΛऔΓ ͦ͏.
ϘτϧωοΫΛݟۃΊΔྲྀΕ • ϩʔυΞϕϨʔδΛݟΔ • CPU, I/OͷϘτϧωοΫΛݟΔ • ͜ͷ2ͭͷ࡞ۀΛߦ͏.
ϩʔυΞϕϨʔδΛݟΔ • ϩʔυΞϕϨʔδΛݟΔ • ϩʔυΞϕϨʔδʮγεςϜશମͷෛՙঢ় گΛࣔ͢ࢦඪʯ • ϩʔυΞϕϨʔδ͚ͩͰϘτϧωοΫʹ ͳ͍ͬͯΔՕॴΘ͔Βͳ͍ͷͰ, ख͕͔Γ
ʹͯ͠ௐࠪ͢Δ.
CPU, I/Oͷ͍ͣΕ͔͕Ϙτϧ ωοΫ͔Λ୳͢ • ϩʔυΞϕϨʔδ͕ߴ͔ͬͨ߹, ͦͷݪҼ͕ CPUͳͷ͔I/Oͳͷ͔Λ୳͢. • sar, vmstatΛͬͯ୳͢.
CPUෛՙ͕ߴ͍߹ • ϢʔβʔϓϩάϥϜ͕ѱ͍ͷ͔, γεςϜͦͷ ͷ͕ѱ͍ͷ͔ΛtopsarͰ֬ೝ. • psΛͬͯϓϩηεͷঢ়ଶΛݟΔ. • straceoprofileͰϓϩϑΝΠϦϯά͍ͯ͘͠. •
ϓϩϑΝΠϥ৭ʑ͋ΔͷͰ߹͏ͷΛ୳͢
CPUෛՙ͕ߴ͍߹ • ҰൠʹCPUʹෛՙ͕͔͔ͬͯΔͷ • CPUҎ֎͕ϘτϧωοΫʹͳ͍ͬͯͳ͍. • αʔόͷ૿ڧͳͲͰରԠ. • ϓϩάϥϜͷͳͲʹΑΓ, ඞཁҎ্ͷෛՙ͕CPUʹ͔
͔͍ͬͯΔ. • ϓϩάϥϜΛมߋ.
I/Oෛՙ͕ߴ͍߹ • ϓϩάϥϜதͷI/O͕ଟ͍ • σΟεΫͷεϫοϓ͕େྔʹൃੜ͍ͯ͠Δ͍ͤ Ͱ͍ • sarvmstatͰ୳ͦ͏.
I/Oෛՙ͕ߴ͍߹ • εϫοϓ͕େྔʹൃੜ͍ͯ͠Δ߹ • ಛఆͷϓϩηε͕༗ͯ͠ͳ͍͔ௐΔ. • ϓϩάϥϜ͕ϝϞϦΛେྔʹফඅ͢ΔΑ͏ ͳͷͳΒमਖ਼͢Δ. • ϝϞϦΛ૿ઃ͢Δ.
ύϑΥʔϚϯενϡʔχϯά • ༩͑ΒΕͨίϯϐϡʔλ͕ͦΕҎ্ͷͰ ܭࢉΛ͢Δ͜ͱͰ͖ͳ͍. • 10ඵ͔͔Δॲཧʹ100ඵඅ͍ͯ͠ΔΑ͏ͳ Β, ͦΕΛऔΓআ͘͜ͱ͕ग़དྷΔ͔Ͳ͏͔͕ॏ ཁʹͳͬͯ͘Δ.
ೋछྨͷෛՙͱ WebΞϓϦέʔγϣϯ
ෛՙͷछྨ • ෛՙେ͖͚ͯ͘2ͭʹྨ͞ΕΔ. • CPUෛՙ • I/Oෛՙ
CPUෛՙ • CPUෛՙͱ͍͏ͷ, ೖग़ྗͰͳ͘CPU্Ͱ ͷܭࢉʹΑͬͯෛՙ͕͔͔Δ͜ͱ.ʢܭࢉྔ͕ ଟ͍ʣ • CPUόϯυͳϓϩάϥϜͱݺΕΔ.
I/Oෛՙ • σΟεΫʹେྔͷσʔλ͕༗Γ, ͦͷத͔Β తͱ͢ΔσʔλΛऔΓग़͢ϓϩάϥϜ. • ͜ͷCPUͷੑೳͰͳ͘, σΟεΫͷੑ ೳʹґଘ͢Δ. •
I/OόϯυͳϓϩάϥϜͱݺΕΔ.
CPUෛՙͱI/Oෛՙ • APαʔό(ϦΫΤετʹରͯ͠దͳ݁ՌΛฦ ͢αʔό)CPUόϯυͰ͋Δ. • ҰํͰ, DBαʔόσΟεΫ͔Βରͷσʔλ ΛऔΓग़͢ͷͰ͋Γ, CPUෛՙΑΓI/Oෛ ՙͷํ͕େ͖͘ͳΔͨΊI/OόϯυͰ͋Δ.
ϚϧνλεΫOSͱෛՙ • ϚϧνλεΫͱ͍͏ͷ, ෳͷλεΫΛ͍ ִؒͰΓସ͑ͯॲཧ͠, ͔͋ͨෳ͕ฒྻ ʹಈ͍ͯΔΑ͏ʹݟͤΔٕज़. " # $
" ࣌ؒ
ϚϧνλεΫOSͱෛՙ • λεΫ͕૿͑ΕͦΕ͚͕ͩͪ͘ͳΔ. • ࣮ߦͪͷ࣌ؒϓϩάϥϜͷ࣮ߦԆͱ͠ ͯݱΕͯ͘Δ. topίϚϯυΛ࣮ߦ
ϩʔυΞϕϨʔδ͕ใࠂ͢Δ ෛՙͷਖ਼ମ • ϋʔυΣΞCPUʹҰఆͷपظͰλΠϚׂΓࠐ ΈΛൃੜ͍ͤͯ͞Δ. • λΠϚׂΓࠐΈ͝ͱʹϩʔυΞϕϨʔδ͕ܭࢉ͞ Ε͍ͯΔ. • λΠϚׂΓࠐΈ͕ൃੜͨ͠ͱ͖ʹI/OͪλεΫΛ
͑, ୯Ґ࣌ؒ͋ͨΓͷฏۉΛද͍ࣔͯ͠Δ.
ϩʔυΞϕϨʔδ͕ใࠂ͢Δ ෛՙͷਖ਼ମ • ϩʔυΞϕϨʔδ͕ใࠂ͢Δෛՙ, ҎԼͷ2ͭͰ ͋Δͱߟ͑ΒΕΔ. • CPUͷ࣮ߦݖݶ͕༩͑ΒΕΔͷΛ͍ͬͯΔϓ ϩηε. •
σΟεΫI/O͕ྃ͢ΔͷΛ͍ͬͯΔϓϩηε
CPU༻ͱI/Oͪ
CPU༻ͱI/Oͪ • աෛՙͰγεςϜͷύϑΥʔϚϯε͕ྼԽ͢Δ ݪҼͱͯ͠, ҎԼͷ2ͭͰ͋Δ. 1. CPUෛՙ 2. I/Oෛՙ •
ͲͪΒʹݪҼ͕͋Δͷ͔ௐΔඞཁ͕͋Δ.
sarίϚϯυΛ͏ • sar(System Activity Reporter)ίϚϯυΛ͏ ͱ, CPU༻I/OͪΛ֬ೝ͢Δ͜ͱ͕ ग़དྷΔ. • ͳΜ͔macOSʹsarແ͍Β͍͠…൵͍͠…
• ksarͱ͍͏άϥϑΟΧϧͳsar͋ΔΒ͍͠
sarίϚϯυΛ͏(CPUෛՙฤ) • sarͷ͍͍ॴ࣌ؒܦաͱͱʹൺֱ͠ͳ͕Β ෛՙΛݟΔ͜ͱ͕ग़དྷΔ. • %userCPUͷϢʔβʔϞʔυͰͷ༻ • %systemγεςϜϞʔυͷ༻
sarίϚϯυΛ͏(CPUෛՙฤ) • user͕ߴ͚Εಛఆͷϓϩηε͕େྔফඅ͍ͯ͠Δ Մೳੑ. • system͕ߴ͚Ε, ίϯςΩετεΠον͕ଟൃͯ͠ ͍ΔՄೳੑ͕͋Δ. • ϩʔυΞϕϨʔδ͕ߴ͘,
͜ΕΒͷෛՙ͕ଟ͚Ε CPUϦιʔε͕ෆ͍ͯ͠Δ.
sarίϚϯυΛ͏(I/Oෛՙฤ) • CPUෛՙ͕ߴ͍߹%user%systemͷෛ ՙ͕ߴ͍. • I/Oෛՙ͕ߴ͍߹, %iowait͕ߴ͘ͳΔ. • ϩʔυΞϕϨʔδ͕ߴ͘, iowait͕ߴ͍߹I/
Oෛՙ͕ඇৗʹߴ͘ͳ͍ͬͯΔͱߟ͑ΒΕΔ.
ϚϧνCPUͱCPU༻ CPUෛՙ͕ߴ͍ྫ I/Oෛՙ͕ߴ͍ྫ
ϚϧνCPUͱCPU༻ • ཧతʹ1ͭͷίΞͰ͋ͬͯ, ݟ্͔͚ෳ ͷCPU͕ࡌ͞Ε͍ͯΔΑ͏ʹݟ͑Δ͕ ͋Δ(ϚϧνίΞ) • LinuxΧʔωϧCPU༻ΛͦΕͧΕͷCPU ͝ͱʹอ͍࣋ͯ͠Δ.
ϚϧνCPUͱCPU༻ • CPU-id͕ৼΒΕͯදࣔ͞ΕΔ. ͜ͷ߹4ί ΞͷCPUͷsarίϚϯυ(-pίΞ͝ͱʹग़ྗ) • ͜ΕCPUෛՙ͕ߴ͍ྫ
ϚϧνCPUͱCPU༻ • I/Oόϯυ͕ߴ͍γεςϜͩͱͲ͏ͳΔͩΖ ͏͔ʁ • -pΛൈ͍ͯදࣔͯ͠ΈΔ. ฏۉ
ϚϧνCPUͱCPU༻ • -pΛ͚ͯΈΔͱ… ยํͰ͕ͪൃੜ͍ͯ͠ Δ͜ͱ͕͔Δ
ϚϧνCPUͱCPU༻ • CPUͷ͕૿͑ͨͱ͜ΖͰ, σΟεΫ͕1͔ͭ͠ ͳ͚ΕI/OෛՙΛࢄ͢Δ͜ͱͰ͖ͳ͍. • ϚϧνίΞͳڥʹ͓͍ͯෛՙΛݟΔ߹, ίΞ ͦΕͧΕʹ͍ͭͯݟ͍ͯ͘ඞཁ͕͋Δ.