Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
High Performance FastAPI
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Ikuo Suyama
October 15, 2021
Programming
10k
17
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
High Performance FastAPI
PyCon JP 2021 発表資料です。
Ikuo Suyama
October 15, 2021
More Decks by Ikuo Suyama
See All by Ikuo Suyama
A Journey as Staff Engineer at SmartNews! 〜一年間の経験から語る、ICキャリアの今とこれから〜
martin_lover
1
1.3k
[zh-TW] DevOpsDays Taipei 2025 -- Creating Awesome Change in SmartNews!(machine translation)
martin_lover
1
1.5k
DevOpsDays Taipei 2025 -- Creating Awesome Change in SmartNews!
martin_lover
1
920
Creating Awesome Change in SmartNews! En
martin_lover
0
220
Creating Awesome Change in SmartNews
martin_lover
2
1.2k
Dive into JVM JIT Compiler
martin_lover
2
340
InvokeDynamic完全に理解した / Completely Understand InvokeDynamic
martin_lover
0
1.1k
10分で完全に理解するInvokeDynamic / 10min To Understand InvokeDynamic
martin_lover
0
910
High Performance FastAPI EN
martin_lover
0
1.2k
Other Decks in Programming
See All in Programming
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
350
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
8.4k
コードで差別化できない時代の ソフトウェアエンジニアリング / Software Engineering in an Era Where Code Doesn’t Differentiate
kishida
2
170
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
530
ジョジョの世界をXRで再現する
mofurune
0
160
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
490
The Rails Doctrine Decade
koic
2
580
最近”作らせてる” ローカルAIアプリの話
akit37
0
470
気持ちぃ〜角丸 Squircle
ryu1013
0
300
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
0
350
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
200
Railsバージョンを4倍にした話
optim
0
290
Featured
See All Featured
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
7k
Mind Mapping
helmedeiros
1
400
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
450
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Making the Leap to Tech Lead
cromwellryan
135
10k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
490
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
400
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Fireside Chat
paigeccino
43
4.1k
Large-scale JavaScript Application Architecture
addyosmani
516
110k
Speed Design
sergeychernyshev
33
2.2k
Transcript
)JHI1FSGPSNBODF 'BTU"1* *LVP4VZBNB
ಃࢁҭஉ*LVP4VZBNB !NBSUJO@MPWFS@TF 4NBSU/FXT *OD ✤"ET#BDLFOE&OHJOFFS ✤Πϯλʔωοτࠂ͕ઐ ✤zࡾͷ൧ΑΓࠂ͕͖z ✤+7.͍ 1ZUIPOྺ͘Β͍ ✤͓खॊΒ͔ʹʜ🙇
͜ͷηογϣϯ͔ΒಘΒΕΔ͜ͱ ✤ ϓϩϑΝΠϦϯάख๏ͱϘτϧωοΫͷಛఆ ✤զʑͷڥͰൃੜͨ͠۩ମతͳ՝ͱͦͷରࡦ 1ZUIPO8FC"QQMJDBUJPO ύϑΥʔϚϯενϡʔχϯάͷ۩ମతͳख๏
λΠτϧ͔Β͔ΔΑ͏ʹ ͜ͷຊʹ େม͓ੈʹͳΓ·ͨ͠🙇
*OUSPEVDUJPO ෛՙςετͱϓϩϑΝΠϦϯά ໘ͨ͠՝ͱରࡦ ·ͱΊ "HFOEB
*OUSPEVDUJPO ෛՙςετͱϓϩϑΝΠϦϯά ໘ͨ͠՝ͱରࡦ ·ͱΊ "HFOEB
"CPVU4NBSU/FXT ݄ؒ 2,000ສਓ ɹɹɹར༻ऀ 116.7ར༻ ※2 1ਓ͋ͨΓ ʢ20198݄ ถ߹ࢉʣ
No.1 χϡʔεΞϓϦ Ϣʔβʔ※1 ੜ׆ऀͷʮຖͷश׳ʯ ຊ࠷େͷχϡʔεΞϓϦ ※1. Nielsen Mobile NetView 20211݄࣌ ʢεϚʔτχϡʔεͷར༻ऀΛΞϓϦέʔγϣϯϨϕϧͰूܭʣ ※2. ࣗࣾ20211݄ฏۉ
1ZUIPOJO4NBSU/FXT$PVQPO$IBOOFM OFXTTFSWJDF DPVQPOTFSWJDF BQJHBUFXBZ DPVQPOBENJO 3FEJT 3%# 8FCαʔόʔʹ'BTU"1*Λ࠾༻
• 'MBTLMJLFͳΞϊςʔγϣϯϕʔεͷϧʔςΟϯά"1* • 0QFO"1*ରԠ • ؆қతͳ%*ػೳ • ֮͑Δ͜ͱ͕গͳ͘ɺૉૣ͘։ൃΛ্ཱͪ͛ΒΕΔ l'BTU"1*ɺ1ZUIPOͷඪ४Ͱ͋Δܕώϯτʹج͍ͮͯ 1ZUIPOҎ߱Ͱ"1*Λߏங͢ΔͨΊͷɺ
ϞμϯͰɺߴ ߴύϑΥʔϚϯε ͳɺ8FCϑϨʔϜϫʔΫͰ͢ɻz 'BTU"1* αʔϏεͷਝͳ্ཱͪ͛Λ࣮ݱʂ
'BTU"1*ඦฉҰߦʹ͔ͣ
1IBTFE3PMMPVUʜ OFXTTFSWJDF DPVQPOTFSWJDF BQJHBUFXBZ DPVQPOBENJO 3FEJT 3%#
'VMMZ3PMMPVU OFXTTFSWJDF DPVQPOTFSWJDF BQJHBUFXBZ DPVQPOBENJO 3FEJT 3%# εϚχϡʔͷશྗʂʂ
'VMMZ3PMMPVU OFXTTFSWJDF DPVQPOTFSWJDF BQJHBUFXBZ DPVQPOBENJO 3FEJT 3%# εϚχϡʔͷશྗʂʂ 🔥 🔥
🔥 🔥
'VMMZ3PMMPVU OFXTTFSWJDF DPVQPOTFSWJDF BQJHBUFXBZ DPVQPOBENJO 3FEJT 3%# εϚχϡʔͷશྗʂʂ 🔥 🔥
🔥 🔥 ύϑΥʔϚϯενϡʔχϯάͷཱྀʜ
*OUSPEVDUJPO ෛՙςετͱϓϩϑΝΠϦϯά ໘ͨ͠՝ͱରࡦ ·ͱΊ "HFOEB
ύϑΥʔϚϯενϡʔχϯάͷ৺ಘ ̍ɽੑೳඪΛܾΊΔ ̎ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ ̏ɽϘτϧωοΫΛղফ͢Δ ੑೳඪΛୡͨ͠ʁ &/%🎉 :&4 /0
8FC"QQMJDBUJPOʹ͓͚Δʮੑೳʯ ඪ͕ͳ͍ͱແݶʹΓଓ͚ͯ͠·͏ʂ εϧʔϓοτ ୯Ґ࣌ؒʹͲΕ͘Β͍ͨ͘͞Μ ϦΫΤετΛ͚͞Δ͔ʁ ? ָ͗͢͠ΔͷͰ ϨΠςϯγ ̍ͭͷϦΫΤετʹ ͲΕ͘Β͍͕͔͔࣌ؒΔ͔ʁ
ɽੑೳඪΛܾΊΔ
-ʜฏۉͪϓϩηε Еʜ ୯Ґ࣌ؒ͋ͨΓ ౸ண 8ʜฏۉࡏ࣌ؒ 8FC"QQMJDBUJPOੑೳͷʹஔ͖͑Δͱʜ WIP(Parallerism) = Throughput ×
Latency L = λW Ϧτϧͷ๏ଇ ɽੑೳඪΛܾΊΔ
ྫɿ SQTͷγεςϜΛDPSFͰࡹ͖͍ͨ ɹDPSFͷΠϯελϯε ͋Δ͍1PET ΛฒΔͱͯ͠ ̍͋ͨΓSQTࡹ͚ྑ͍ͷͰ ͭ·Γ̍ΠϯελϯεͷੑೳඪΛ εϧʔϓοτSQT Ҏ্
ɺϨΠςϯγNT ҎԼ ɺͱઃఆ͢Δ 5(WIP)/100rps = 0.05s = 50ms ɿ࣮ࡍʹ$16Λ͍͖ΕΔΘ͚Ͱͳ͍͠ɺ*0$PODVSSFODZ͋Δ͠ɺ ,Tͷ1PEͰར༻Ͱ͖Δ$16ίΞͱMJNJU͕Ұக͠ͳ͍͠ɺ ʜͳͲͳͲͳͲͬͱෳࡶͰ͕͢ɺେମͷ҆ͱͯ͠ ੑೳඪͷܾΊํɿྫ ɽੑೳඪΛܾΊΔ
ϧʔϧϓϩάϥϜ͕Ͳ͜Ͱ࣌ؒΛফඅ͢Δ͜ͱʹͳΔ͔Δ͜ͱͰ͖ͳ͍ɻ ϘτϧωοΫڻ͖͘ՕॴͰى͜ΔͷͰ͋Δɻ ͕ͨͬͯ͠ɺͲ͕͜ϘτϧωοΫͳͷ͔Λ͖ͬΓͤ͞Δ·Ͱɺ ਪଌΛߦͬͨΓɺεϐʔυϋοΫΛͯ͠ͳΒͳ͍ɻ ϧʔϧܭଌ͢͠ɻܭଌ͢Δ·ͰͷͨΊͷௐΛͯ͠ͳΒͳ͍ɻ ίʔυͷҰ෦͕ΓΛѹ͠ͳ͍ͷͰ͋Εɺͳ͓͞ΒͰ͋Δɻ 3PC1JLF/PUFTPO1SPHSBNNJOHJO$ <8JLJQFEJB>ύΠΫ$ϓϩάϥϛϯάʹؔ͢Δ֮͑ॻ͖ ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ ϘτϧωοΫҎ֎νϡʔχϯάͯ͠ແବແବ
ਪଌ͢ΔͳܭଌͤΑ ܭଌͤͣϘτϧωοΫΛΔ͜ͱͰ͖ͳ͍͠ɺ
̍ɽੑೳඪΛܾΊΔ ̎ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ ̏ɽϘτϧωοΫΛղফ͢Δ ੑೳඪΛୡͨ͠ʁ &/%🎉 :&4 /0 ෛՙΛ͔͚ͯ 4ZTUFNશମͷෛՙঢ়گΛ֬ೝ "QQMJDBUJPOͷෛՙঢ়گΛ֬ೝ
-PDBMͰͰ͖ΔݶΓಉ͡ঢ়گΛ࠶ݱ͠ɺ ෛՙΛ͔͚ͭͭܭଌ ϘτϧωοΫͷ ࠷ٙΘ͍͠ՕॴΛ͢ ϘτϧωοΫ͕ղফ͞Ε͔ͨʁ ੑೳ্͕͔ͨ͠ʁ ෛՙࢼݧڥʹ σϓϩΠͯ͠ܭଌ ϘτϧωοΫ "QQMJDBUJPO ෛՙࢼݧʹར༻Ͱ͖Δ ڥΛ४උ͢Δ ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ "QQMJDBUJPO͕ ϘτϧωοΫʹͳΔ·Ͱमਖ਼ :&4 /0 :&4 /0 ܭଌͷखॱͱπʔϧͨͪ Datadog APM • fastapi_profiler • py-spy ϑΟʔυόοΫϧʔϓΛ ૣ͍ͨ͘͠
• 1ZUIPOͷ͍ΘΏΔϕϯνϚʔΫɾෛՙࢼݧπʔϧ • 1ZUIPO"1*ͰγφϦΦΛهड़ • γϯϓϧ͔ͭඞཁेͳઃఆ • ΫϥελԽͯ͠େ͖ͳෛՙʹରԠ -PDVTUJTBOFBTZUPVTF TDSJQUBCMFBOE
TDBMBCMFQFSGPSNBODFUFTUJOHUPPM -0$645 ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ ෛՙΛ͔͚Δɿ-0$645
ෛՙΛ͔͚Δɿ-0$645 ಉ࣌ଓΛࢦఆ rps,median/95% tile latencyΛάϥϑԽ ಉ࣌ଓΛ૿͠ͳ͕ΒϨΠςϯγ͕ѱԽ͢Δݶք·ͰෛՙΛ͔͚ɺ ࠷େεϧʔϓοτͱͦͷ࣌ͷϨΠςϯγΛ֬ೝ ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ
• ෛՙΛ͔͚ͨঢ়ଶͰͷγεςϜશମͷϦιʔεঢ়گΛ֬ೝ • 2ΞϓϦέʔγϣϯ͕ϘτϧωοΫʹͳ͍ͬͯΔ͔ʁ • ϘτϧωοΫ͕ΞϓϦέʔγϣϯʹҠΔ·ͰɺΞϓϦέʔγϣϯͷνϡʔχϯά Λͯ͠ແବແବ • ͍͍ͩͨ%BUBCBTFͳͲͷϛυϧΣΞ͕ઌʹϘτϧωοΫʹͳΔ •
6QTUSFBNͷαʔϏεଓ͢ΔϛυϧΣΞͷϦιʔεʹ༨༟͕͋Δ͕ɺΞϓ Ϧέʔγϣϯͷεϧʔϓοτ্͕͕Βͳ͍ঢ়ଶ·Ͱνϡʔχϯά • ΞϓϦέʔγϣϯҎ֎ͷνϡʔχϯάࠓճׂѪ🙇 γεςϜશମͷෛՙঢ়گΛ֬ೝɿ%BUBEPH ҎޙͷΞϓϦέʔγϣϯ͕ϘτϧωοΫͰ͋Δલఏ ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ
αʔϏεຖͷϦΫΤετ CPU/MemoryͳͲͷར༻ঢ়گΛ֬ೝ ϛυϧΣΞͷCPU Usage ίωΫγϣϯͷมԽΛ֬ೝ ࡉ͔͍ঢ়گίϯςφʹBUUBDIͯ֬͠ೝͨ͠Γ͢Δ͕ɺ શମͷΛ௫Ήͷʹେมศར ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ
• ηοτΞοϓ؆୯ɺαΠυΧʔͱߦͷىಈίʔυ • ࣮ࡍʹՔಇ͍ͯ͠ΔڥͰͷσʔλ͕खʹೖΔ • ඞཁͳใେମἧ͓ͬͯΓɺϘτϧωοΫͷൃݟʹཱͭ ΞϓϦέʔγϣϯܭଌᶃɿ%BUBEPH"1. %BUBEPH"1.ͱ$POUJOVPVT1SPGJMFSɺ8FCαʔϏεɺΩϡʔɺσʔλϕʔε͕ ϦΫΤετɺΤϥʔɺϨΠςϯγʔΛࢹ͢ΔͨΊͷඪ४ͷύϑΥʔϚϯεμογϡ ϘʔυΛ༻ͯ͠ɺΞϓϦέʔγϣϯΛৄࡉʹՄࢹԽ͠·͢ɻ
%BUBEPH"1. ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ
ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ ෛՙڥΞϓϦέʔγϣϯܭଌɿ%BUBEPH"1. Latency histgram CPU time by scripts CPU time
by function ͍͕ͭ͜Ұ൪࣌ؒΛ͓ͬͯΓɺ ϘτϧωοΫީิ ͕ͩߴ͍💸ɺಛఆͷΠϯελϯεͷΈʹదԠ͢ΔͳͲͷΛʜ
-PDBMΞϓϦέʔγϣϯܭଌᶃɿGBTUBQJ@QSPGJMFS ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ "'BTU"1*.JEEMFXBSFPGQZJOTUSVNFOUUP DIFDLZPVSTFSWJDFDPEFQFSGPSNBODF GBTUBQJ@QSPGJMFS • 'BTU"1*ϛυϧΣΞͱͯ͠QZJOTUSVNFOUΛ౷߹ • ϩʔΧϧͰίʔυΛमਖ਼ͭͭ͠ɺ$16࣌ؒΛܭଌ͢Δͱ͖ʹศར •
ύϑΥʔϚϯεӨڹ͕େ͖͍ͨΊɺຊ൪ෛՙঢ়گԼͰ͑ͳ͍
-PDBMΞϓϦέʔγϣϯܭଌᶃɿGBTUBQJ@QSPGJMFS ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ add_middleware ͢Δ͚ͩͰOK sortϝιου͕ ͍ʹϘτϧωοΫީิ
• 3VTUͷϓϩϑΝΠϥɺΦʔόʔϔου • ϩʔΧϧڥෛՙڥͰͬ͞ͱ$16Λܭଌ͍ͨ͠ͱ͖ʹศར • (*-ϚϧνεϨουॲཧͷϘτϧωοΫ͕ٙΘ͍͠ͱ͖ʹศར • GBTUBQJ@QSPGJMFSGBTUBQJཧԼʹͳ͍εϨουΛܭଌͰ͖ͳ͍ʜ -PDBMΞϓϦέʔγϣϯܭଌᶄɿQZTQZ ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ
*UMFUTZPVWJTVBMJ[FXIBUZPVS1ZUIPOQSPHSBN JTTQFOEJOHUJNFPOXJUIPVUSFTUBSUJOHUIF QSPHSBNPSNPEJGZJOHUIFDPEFJOBOZXBZ QZTQZ
͜ͷϝιου͕ΤϯυϙΠϯτ ॲཧͷຆͲͷ࣌ؒΛΊ͍ͯΔ ɽܭଌɾϘτϧωοΫΛಛఆ͢Δ -PDBMΞϓϦέʔγϣϯܭଌᶄɿQZTQZ
*OUSPEVDUJPO ෛՙςετͱϓϩϑΝΠϦϯά ໘ͨ͠՝ͱରࡦ ·ͱΊ "HFOEB
'BTU"1*ͷσϓϩΠ࣌ߏͱෛՙಛੑ (VOJDPSOTVQQPSUTXPSLJOHBTBQSPDFTTNBOBHFSBOEBMMPXJOHVTFSTUPUFMMJUXIJDITQFDJGJDXPSLFS QSPDFTTDMBTTUPVTF5IFO(VOJDPSOXPVMETUBSUPOFPSNPSFXPSLFSQSPDFTTFTVTJOHUIBUDMBTT "OE6WJDPSOIBTB(VOJDPSODPNQBUJCMFXPSLFSDMBTT 4FSWFS8PSLFST(VOJDPSOXJUI6WJDPSO <Process Manager> <ASGI Server> <ASGI
Framework> <Web Framework> ϓϩηεͷىಈͱGPSL TPDLFUΛXPSLFSʹ͢ ϦΫΤετϨεϙϯε ඇಉظॲཧ Request Response Func call callback Extends <Application> Worker ΞϓϦέʔγϣϯ ϏδωεϩδοΫ
'BTU"1*ͷσϓϩΠ࣌ߏͱෛՙಛੑ (VOJDPSOTVQQPSUTXPSLJOHBTBQSPDFTTNBOBHFSBOEBMMPXJOHVTFSTUPUFMMJUXIJDITQFDJGJDXPSLFS QSPDFTTDMBTTUPVTF5IFO(VOJDPSOXPVMETUBSUPOFPSNPSFXPSLFSQSPDFTTFTVTJOHUIBUDMBTT "OE6WJDPSOIBTB(VOJDPSODPNQBUJCMFXPSLFSDMBTT 4FSWFS8PSLFST(VOJDPSOXJUI6WJDPSO <Process Manager> <ASGI Server> <ASGI
Framework> <Web Framework> Request Response Func call callback Extends <Application> Worker ϓϩηεཧͷΈͳͷͰ ύϑΥʔϚϯεӨڹͳ͠ 4UBSMFUUFΑΓૣ ͘ͳΒͳ͍͕ 1ZUIPO"4(*ք ࠷ 4UBSMFUUFΑΓԼ͕ϘτϧωοΫʹͳΔ͜ͱࠓճͳ͔ͬͨ
*0CPVOEͳॲཧ͕͍ $16CPVOEͳॲཧ͕͍ .VMUJ5ISFBE͕͍ ॲཧܥͷมߋʹΑΔશମతͳੑೳ্ ̏ɽ໘ͨ͠՝
*0CPVOEͳॲཧ͕͍ ✤ ໘ͨ͠՝ 3FEJTͷSFBEΞΫηε͕͍ ✤ ঢ় • $16Λ͍ͬͯͳ͍ͷʹεϧʔϓοτ্͕͕Βͳ͍ •
UPQ WNTUBUͰDQVVTΛ֬ೝ ✤ ݪҼ • %#ΞΫηεͳͲɺωοτϫʔΫ*0Λཁ͢Δॲཧ • ϑΝΠϧॻ͖ࠐΈ
• ωοτϫʔΫ͕བྷΉͱ͜ΖBTZODBXBJUΛ͏ • ରԠϥΠϒϥϦଟ͍ • FHBJPSFEJTIUUQYʜ *0CPVOE3FEJTΞΫηε͕͍ ରࡦᶃɿBDZODJPΛ͏ BTZODJPBTZODBXBJUߏจΛ͍ฒߦॲཧͷ ίʔυΛॻͨ͘ΊͷϥΠϒϥϦͰ͢ɻ
BTZODJP
ରࡦᶃɿBDZODJPΛ͏ fastAPIͰϧʔςΟϯά ϝιουΛasyncʹ͢Δ͚ͩ async method ͷ෦Ͱawait *0CPVOE3FEJTΞΫηε͕͍
• ͦΕͰωοτϫʔΫ͕བྷΉͱ͜ΖجຊతʹΊͪΌ͍ • ϝϞϦࢀরͱൺΔͱdഒ͕͔͔ۙ࣌ؒ͘Δ • ݁Ռ߹ੑͷڐ༰͕ߴ͍߹ɺΞϓϦέʔγϣϯϝϞϦʹऔ ಘͨ݁͠ՌΛΩϟογϡ͢Δ ରࡦᶄɿDBDIF͢Δ Latency Comparison
Numbers (~2012) ---------------------------------- : Main memory reference 100 ns : Round trip within same datacenter 500,000 ns 500 us — Latency Numbers Every Programmer Should Know *0CPVOE3FEJTΞΫηε͕͍
3FEJTΞΫηε͕͍ʜରࡦᶄɿDBDIF͢Δ OrderedDictΛར༻ͨ͠ ؆қͳLRUCache Cache͕ͳ͔ͬͨ߹ͷΈ RedisʹΞΫηε method͝ͱΩϟγϡͯ͘͠ΕΔ lru_cacheΞϊςʔγϣϯศར *0CPVOE3FEJTΞΫηε͕͍
✤ ໘ͨ͠՝ 63-Τϯίʔυॲཧ͕͍ ҐஔใͷHFPIBTIͷܭࢉ͕͍ Ґஔใ͔Βͷڑͷܭࢉ͕͍ ✤ ঢ়
• UPQ WNTUBUͰVTFSUJNF͕ுΓ͘ɺ-"͕ߴ͍ • LTڥͰ͋Ε5ISPUUMF͞ΕΔ ✤ ओͳݪҼ • ුಈখܭࢉͳͲγϯϓϧʹॏ͍ܭࢉ • ඇޮͳΞϧΰϦζϜ $16CPVOEͳॲཧ͕͍
ରࡦɿࣄલܭࢉDBDIF͢Δ τϥϯβΫγϣϯ͝ͱʹ݁Ռ͕มΘΒͳ͍ͷ ΦϑϥΠϯͰࣄલʹܭࢉ͓͔ͯ͘͠ɺ ܭࢉ݁ՌΛDBDIF͢Δ͜ͱͰॏ͍ܭࢉࣗମΛόΠύε͢Δ urllib/parse.py Ͱଟ͘ͷ࣌ؒΛ͍ͬͯΔ Urlͷܭࢉ݁ՌΛ Cache͢Δ $16CPVOE63-Τϯίʔυॲཧ
• ϦΫΤετ͝ͱʹΦϯϥΠϯͰܭࢉ͠ͳ͚ΕͳΒͣɺ͔ͭܭࢉෛՙͷ ߴ͍ͷ • (FPIBTIʜҐஔใ MBUMPO ΛಛఆͷྖҬ͝ͱʹIBTIԽ͢Δ • $ݴޠͳͲͷਫ४ݴޠʹ༧ΊίϯύΠϧͯ͠͠·͏ •
ؔ͝ͱͳͲɺ෦తʹదԠ͢Δ͜ͱ͕Մೳ ରࡦɿ$ZUIPO $ZUIPOJTBOPQUJNJTJOHTUBUJDDPNQJMFSGPSCPUIUIF1ZUIPO QSPHSBNNJOHMBOHVBHFBOEUIFFYUFOEFE$ZUIPO QSPHSBNNJOHMBOHVBHF $ZUIPO $16CPVOEHFPIBTIͷܭࢉ͕͍
ࢦఆ͞ΕͨҐஔใ͔Β geohash(maptile)Λܭࢉ͢Δؔ .pyxʹॻ͍ͯίϯύΠϧ͢Δ ݺͼग़͠ଆ௨ৗͷPythonͱಉ͡ ͜Μͳײ͡ͷ setup.pyΛ४උͯ͠ docker build͢Δͱ͖ʹ ίϯύΠϧ͍ͯ͠Δ ରࡦɿ$ZUIPO
$16CPVOEHFPIBTIͷܭࢉ͕͍
• ϦΫΤετͷҐஔใͱɺۙ͘ͷΫʔϙϯͱͷڑͷܭࢉ • ۙ͘ʹ͋ΔΫʔϙϯͷ͚ͩϧʔϓͯ͠ܭࢉ͍ͯͨ͠ • ϧʔϓॲཧΛɺOVNQZͷϕΫτϧܭࢉΛ༻͍ͯ$16DBDIFͷར༻Λ࠷దԽ͢Δ • $16$BDIF͔Βͷϩʔυ3".ΑΓང͔ʹߴ ରࡦɿOVNQZ $16CPVOEڑͷܭࢉ͕͍
Latency Comparison Numbers (~2012) ---------------------------------- L1 cache reference 0.5 ns L2 cache reference 7 ns 14x L1 cache : Main memory reference 100 ns 20x L2 cache, 200x L1 cache — Latency Numbers Every Programmer Should Know
ϕΫτϧԽͯ͠ɺ ҎޙͷܭࢉϕΫτϧܭࢉ ϦΫΤετͷҐஔใͱͦΕͧΕͷ ΫʔϙϯͷڑΛ ΦϯϥΠϯͰܭࢉ͍ͨ͠ ରࡦɿOVNQZ $16CPVOEڑͷܭࢉ͕͍
.VMUJ5ISFBE͕͍ ✤ ໘ͨ͠՝ -PHHJOH͕͍ ✤ ঢ় • 'BTU"1*Ҏ֎ͷ5ISFBEͰ$16Λ͍ͬͯΔ •
%BUBEPH"1.Ͱ֬ೝ • QZTQZUPQͰ(*-ͷ͕͍ ✤ ݪҼ • ࠓճMPHSVͱ͍͏ϥΠϒϥϦ͕.VMUJ5ISFBEͰϩάΛॻ͍͍ͯͯɺͦ ͜ʹ͕͔͔͍࣌ؒͬͯͨ • 1ZUIPO5ISFBEΛѻ͑Δ͕ɺ(*-͕͋ΔͨΊޮ͕ѱ͍
.VMUJ5ISFBE͕͍ *O$1ZUIPO UIFHMPCBMJOUFSQSFUFSMPDL PS(*- JTBNVUFY UIBUQSPUFDUTBDDFTTUP1ZUIPOPCKFDUT QSFWFOUJOHNVMUJQMF UISFBETGSPNFYFDVUJOH1ZUIPOCZUFDPEFTBUPODF (MPCBM*OUFSQSFUFS-PDL (*-(MPCBM*OUFSQSFUFS-PDL
• 5ISFBEΛཱͯͯಉ࣌ʹ࣮ߦ͞ΕΔͷϓϩηεͰ̍ͭ • 1ZUIPOͰฒྻॲཧ.VJUM1SPDFTTJOH ͜Εʹฒߦॲཧ BTZODJPΛΈ߹Θͤͯରॲ͢Δ
.VMUJ5ISFBE͕͍ LogใͷγϦΞϥΠζͱ emmitʹ͕͔͔͍࣌ؒͬͯΔ Queue͔Βऔಘͯ͠σγ ϦΞϥΠζ͍ͯ͠Δ༷ _enqueue͕true(default) ͩͱɺSimpleQueueͱlogग़ྗ༻ ͷThreadΛͨͯΔ multiprocessing.SimpleQueue ͷ࣮ମProcessؒ௨৴ͷPipe
8SJUFS5ISFBEͱͷσʔλड͚͕ͦ͠͏
.VMUJ5ISFBE-PHHJOH͕͍ ରࡦɿϩΪϯάͷ੍ͱϥΠϒϥϦͷมߋ w GBTUMPHHJOHʹΓ͑ͨ w ͦͦ͜͜༰ྔͷେ͖͍MPHΛు͖͍͕ͨɺະղܾ
• ීஈ͍ͬͯΔ$1ZUIPOҎ֎ʹ༷ʑͳॲཧܥ͕͋Δ • ڃݴޠʹίϯύΠϧ͢Δͷɺ+*5ίϯύΠϥΛ࣋ͭͷɺFUDʜ • ࠓճͭΛࢼͯ͠ɺ1Z1ZΛ࠾༻ͨ͠ DJOEFS 1Z1Z
• $16͕ϘτϧωοΫͰ͋Εɺશମతͳੑೳ্͕ظͰ͖Δ ॲཧܥͷมߋʹΑΔશମతͳੑೳ্
ॲཧܥͷมߋDJOEFS $JOEFSJT*OTUBHSBNTJOUFSOBMQFSGPSNBODFPSJFOUFEQSPEVDUJPO WFSTJPOPG$1ZUIPO *UDPOUBJOTBOVNCFSPGQFSGPSNBODFPQUJNJ[BUJPOT JODMVEJOH CZUFDPEFJOMJOFDBDIJOH FBHFSFWBMVBUJPOPGDPSPVUJOFT ʜ DJOEFS •
'BDFCPPLۘͷύϑΥʔϚϯεվળ͞Εͨ$1ZUIPO • զʑͷڥͰɺ ఔͷੑೳ্͕ݟΒΕͨ • $1ZUIPOͱͷޓੑ͕ߴ͘ɺϥΠϒϥϦ΄ͱΜͲ͑Δ • ͕ɺࣗલͰϏϧυ͢Δඞཁ͕͋ͬͨΓ(JU)VC׆ൃͰͳ͔ͬͨΓυΩϡϝϯτ͕օແͩͬͨ Γͱɺӡ༻໘ͰͭΒ͘அ೦
ॲཧܥͷมߋ1Z1Z "GBTU DPNQMJBOUBMUFSOBUJWFJNQMFNFOUBUJPOPG1ZUIPO 0OBWFSBHF 1Z1ZJTUJNFTGBTUFS UIBO$1ZUIPO 1Z1Z • +*5ίϯύΠϥ*ODNJOJNBSL($
• $1ZUIPOͱͷޓੑ͔ͳΓߴ͍ • ͪΖΜσϝϦοτͦΕͳΓʹ͋Δ • ͕ɺੑೳ໘ͰͷϝϦοτ͕େ͖͔ͬͨͨΊɺݱࡏຊ൪Քಇத • ͍ۙੑೳ্Λ֬ೝ
ۜͷؙͰͳ͍ ✤ ࡌͤସ͑ɾӡ༻ʹ͋ͨͬͯ໘ͨ͠՝ ࠷৽൛͕1ZUIPO Ұ෦ͷϥΠϒϥϦ͕͑ͳ͍ ($0QUJPOࢦఆ࿙ΕͰ00.ࢮ
'BTU"1*ͱͷΈ߹ΘͤͰϝϞϦϦʔΫʁ ॲཧܥͷมߋ1Z1Z
՝ᶃɿ࠷৽൛͕1ZUIPO ✤ ՝ɿݱࡏͷ࠷৽൛͕1ZUIPO • CFUB DPNNJOHTPPO ✤ ରԠ • ϕʔεͰ։ൃ͍ͯͨ͠ͷͰɺҰ෦ͷՕॴΛμϯάϨʔυ
• ηΠνԋࢉࢠ:= • Ґஔઐ༻Ҿdef huga(hoge, /, …) • ࣮࣭͋Μ·Γࠔ͍ͬͯͳ͍ ॲཧܥͷมߋ1Z1Z
՝ᶄɿҰ෦ͷϥΠϒϥϦ͕͑ͳ͍ ✤ ՝ɿ1&1֎෦ιʔεͷϏϧυΛ͏ϥΠϒϥϦ΄΅/( • FH • PSKTPOʜSVTUߴ+40/γϦΞϥΠβ😭 • EEUSBDFQZʜ%BUB%PH"1.ܭଌ༻😭 •
GBTUBQJQSPGJMFSʜ͜͜·Ͱେ׆༂ͷϓϩϑΝΠϥ😭 • CMBDL DBVTFECZUZQFEBTU ʜ-JOUFS'PSNBUUFS QZTFOܦ༝Ͱར༻😭 ✤ ରԠ • ผͷϥΠϒϥϦΛ͏ • ։ൃڥ༻ͱσϓϩΠ༻ͰผʑͷॲཧܥΛར༻͢Δ ॲཧܥͷมߋ1Z1Z
՝ᶄɿҰ෦ͷϥΠϒϥϦ͕͑ͳ͍ $1ZUIPOͰಈ͕͘1Z1ZͰಈ͔ͳ͍ͱ͍ͬͨෆ۩߹Λճආ͢ΔͨΊɺ $%ͷࡍʹຊ൪༻ίϯςφΛ༻͍ͯFFςετΛ࣮ࢪ͍ͯ͠Δ ։ൃ༻ / CPython3.7 CI্ͰͷUTͪ͜ΒͰ࣮ߦ ຊ൪༻ / PyPy3.7
ॲཧܥͷมߋ1Z1Z
՝ᶅɿ($0QUJPOࢦఆ࿙ΕͰ00.ࢮ ✤ ՝ɿϝϞϦ͕ϞϦϞϦ͠ɺ00.,JMMFSʹΑΓࢮ • 1Z1Zͷ($JODNJOJNBSL • ($0QUJPOͷઃఆ͕ඞཁ ✤ ରԠ •
1:1:@($@%(Λࢦఆͯ͠($-PHΛग़ྗ͢Δ • 1:1:@($@."9Λࢦఆͯ͠ώʔϓ্ݶΛ੍ݶ͢Δ ॲཧܥͷมߋ1Z1Z
՝ᶅɿ($0QUJPOࢦఆ࿙ΕͰ00.ࢮ MaxWorker x PYPY_GC_MAX Λ֬อ ࠷ݶ PYPY_GC_MAXࢦఆ ॲཧܥͷมߋ1Z1Z
՝ᶆɿ'BTU"1*ͱͷΈ߹ΘͤͰϝϞϦϦʔΫʁ ✤ ՝ɿϝϞϦ͕ϞϦϞϦ͠ɺ00.,JMMFSͰࢮʢ̎ʣ • &DIPαʔόʔͰɺෛՙΛ͔͚ΔͱϝϞϦ͕୯ௐ૿Ճ͢Δ • Ϧόϓϩ͍ͯͨ͠OHJOYͰ,FFQ"MJWF͍ͯ͠ͳ͔ͬͨʜ ✤ ରԠ •
)551ଓʢ%FGBVMU,FFQ"MJWFʣʹ͢Δͱղফͨ͠ • VWJDPSOͷUJNFPVULFFQBMJWFઃఆ͓ͯ͘͠ • ͋·Γਂ͍͍ͯ͠ͳ͍͕ɺDPOOFDUJPOपΓͷΆ͍ͷͰɺ 'BTU"1*ͱ͍͏ΑΓVWJDPSOͷ͔ ॲཧܥͷมߋ1Z1Z
̏ɽ໘ͨ͠՝ <5ISPVHIQVU> SQT <UJMF-BUFODZ> NT <5ISPVHIQVU> SQT ‐ <UJMF-BUFODZ>
NT ‐ ͯ͢ରԠͨ͠ޙɺΠϯελϯεͰͷੑೳվળ
*OUSPEVDUJPO ෛՙςετͱϓϩϑΝΠϦϯά ໘ͨ͠՝ͱରࡦ ·ͱΊ "HFOEB
·ͱΊ ✤ ෛՙςετͱϓϩϑΝΠϦϯά • ඪΛܾΊΔˠܭଌ͢ΔˠϘτϧωοΫʹରԠ͢Δ • ཱͭπʔϧͨͪɿMPDVTU EBUBEPH GBTUBQJQSPGJMFS QZTQZ
✤ ՝ͱରԠ • *0CPVOEBTZODJP DBDIF • $16CPVOEDBDIF $ZUIPO OVNQZ • ॲཧܥͷมߋ1Z1Z
)JHI1FSGPSNBODFͳ 'BTU"1*-JGFΛ
Thank You for Your Kind Attention! UXJUUFS!NBSUJO@MPWFS@TF