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
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
High Performance FastAPI
Search
Ikuo Suyama
October 15, 2021
Programming
9.9k
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.2k
[zh-TW] DevOpsDays Taipei 2025 -- Creating Awesome Change in SmartNews!(machine translation)
martin_lover
1
1.4k
DevOpsDays Taipei 2025 -- Creating Awesome Change in SmartNews!
martin_lover
1
900
Creating Awesome Change in SmartNews! En
martin_lover
0
210
Creating Awesome Change in SmartNews
martin_lover
2
1.2k
Dive into JVM JIT Compiler
martin_lover
2
330
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
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
120
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
140
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
0
250
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
210
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
4
3.3k
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
2.6k
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
210
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
130
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
890
Swift愛好会100回記念 第1回を振り返る
jollyjoester
0
120
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
160
RSSとCodexを使ってX投稿自動化してみた
ochtum
0
110
Featured
See All Featured
How GitHub (no longer) Works
holman
316
150k
Raft: Consensus for Rubyists
vanstee
141
7.7k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
320
Crafting Experiences
bethany
1
310
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Are puppies a ranking factor?
jonoalderson
2
3.9k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
520
Deep Space Network (abreviated)
tonyrice
0
290
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
770
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
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