Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
大規模Webサービス入門 2回目 / Introduction to large scale ...
Search
muttan
August 04, 2017
0
120
大規模Webサービス入門 2回目 / Introduction to large scale web service 2
muttan
August 04, 2017
Tweet
Share
More Decks by muttan
See All by muttan
さわやか待ち時間LINE botを作った話 / Sawayaka LINE bot
bath_poo_
0
110
コンテナ開発入門 1回目/Introduction to Container Development 1
bath_poo_
0
160
ISUCONってなんだ / What is ISUCON
bath_poo_
0
350
Web技術の基本 8回目 / Introduction to Web technologies 8th class
bath_poo_
0
190
Web技術の基本 7回目 / Introduction to Web technologies 7th class
bath_poo_
0
160
Web技術の基本 6回目 / Introduction to Web technologies 6th class
bath_poo_
1
260
Web技術の基本 5回目 / Introduction to Web technologies 5th class
bath_poo_
0
140
Web技術の基本 4回目 / Introduction to Web technologies 4th class
bath_poo_
0
220
Web技術の基本 3回目 / Introduction to Web technologies 3rd class
bath_poo_
0
250
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
71
4.9k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
How to Ace a Technical Interview
jacobian
277
23k
Code Review Best Practice
trishagee
68
18k
Why Our Code Smells
bkeepers
PRO
337
57k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
32
5.9k
Six Lessons from altMBA
skipperchong
28
3.8k
Practical Orchestrator
shlominoach
188
11k
RailsConf 2023
tenderlove
30
1.1k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
Building Adaptive Systems
keathley
43
2.6k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.7k
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ෛՙΛࢄ͢Δ͜ͱͰ͖ͳ͍. • ϚϧνίΞͳڥʹ͓͍ͯෛՙΛݟΔ߹, ίΞ ͦΕͧΕʹ͍ͭͯݟ͍ͯ͘ඞཁ͕͋Δ.