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
100
大規模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
100
コンテナ開発入門 1回目/Introduction to Container Development 1
bath_poo_
0
140
ISUCONってなんだ / What is ISUCON
bath_poo_
0
320
Web技術の基本 8回目 / Introduction to Web technologies 8th class
bath_poo_
0
170
Web技術の基本 7回目 / Introduction to Web technologies 7th class
bath_poo_
0
140
Web技術の基本 6回目 / Introduction to Web technologies 6th class
bath_poo_
1
230
Web技術の基本 5回目 / Introduction to Web technologies 5th class
bath_poo_
0
110
Web技術の基本 4回目 / Introduction to Web technologies 4th class
bath_poo_
0
200
Web技術の基本 3回目 / Introduction to Web technologies 3rd class
bath_poo_
0
230
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.3k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
A better future with KSS
kneath
238
17k
Unsuck your backbone
ammeep
669
57k
Mobile First: as difficult as doing things right
swwweet
222
9k
Bash Introduction
62gerente
608
210k
Side Projects
sachag
452
42k
Become a Pro
speakerdeck
PRO
26
5k
Testing 201, or: Great Expectations
jmmastey
40
7.1k
GitHub's CSS Performance
jonrohan
1030
460k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
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ෛՙΛࢄ͢Δ͜ͱͰ͖ͳ͍. • ϚϧνίΞͳڥʹ͓͍ͯෛՙΛݟΔ߹, ίΞ ͦΕͧΕʹ͍ͭͯݟ͍ͯ͘ඞཁ͕͋Δ.