Peter Baumgartner
Just Enough Ops
for Developers
DjangoCon US 2022
@ipmb
lincolnloop.com
Slide 2
Slide 2 text
About Me
• Founder at Lincoln Loop — lincolnloop.com
• Co-author of High Performance Django —
highperformancedjango.com
• Building AppPack — apppack.io
Slide 3
Slide 3 text
Prepping your project for production
Watch my talk at DjangoCon 2019
Slide 4
Slide 4 text
Why just enough Ops?
Slide 5
Slide 5 text
PaaS & Managed Services
are really good
Slide 6
Slide 6 text
Forget about 😴
• System security/hardening
• Routing/networking
• Secrets management
• Deployments
• Scaling how to, not when to
• Process Management (systemd, docker, etc.)
• Hardware failures
Slide 7
Slide 7 text
But! You need to understand the basics
• CPU
• RAM
• I/O
Slide 8
Slide 8 text
No content
Slide 9
Slide 9 text
No content
Slide 10
Slide 10 text
CompSci 101
Slide 11
Slide 11 text
No content
Slide 12
Slide 12 text
Disk (HDD, SSD)
Persistent File Storage
Slide 13
Slide 13 text
• Disk access is slow
• Usually ephemeral
Disk (HDD, SSD)
Persistent File Storage
Slide 14
Slide 14 text
CPU (processor)
Code execution
Slide 15
Slide 15 text
How many CPUs do I need?
Slide 16
Slide 16 text
How many CPUs do I need?
It depends
Slide 17
Slide 17 text
1 request/1 process/1 CPU
Slide 18
Slide 18 text
https://fastapi.tiangolo.com/async/
Cook = CPU
Cashier = Python Process
Customer = Request
Slide 19
Slide 19 text
How many CPUs do I need?
It depends
Slide 20
Slide 20 text
How many cooks do I need?
It depends
Slide 21
Slide 21 text
More Users → More CPU
Rule of
👍
Slide 22
Slide 22 text
2 requests/1 process/1 CPU
Slide 23
Slide 23 text
2 requests/2 process/2 CPU
Slide 24
Slide 24 text
💸
Slide 25
Slide 25 text
How do I minimize cost?
Slide 26
Slide 26 text
How do I maximize
CPU usage?
Slide 27
Slide 27 text
Multiple Processes per CPU
How do I maximize CPU usage?
Slide 28
Slide 28 text
2 requests/2 processes/1 CPU
Slide 29
Slide 29 text
2 requests/2 processes/1 CPU
Slide 30
Slide 30 text
2 requests/2 processes/1 CPU
Slide 31
Slide 31 text
gunicorn \
--workers=3 \
…
Slide 32
Slide 32 text
Tuning Worker Count
Each app is different
• Start at double your CPU count
• You can experiment with adding workers until
• Not enough memory
• Response times plateau or degrade
Slide 33
Slide 33 text
Improve Application
Performance
How do I maximize CPU usage?
Slide 34
Slide 34 text
1 CPU / 1 minute
100ms response time = 6000 requests
1s response time = 60 requests
Django memory tips
• Don’t read huge files into a string/byte object
• Don’t process a huge queryset
• Use Model.objects.iterator()
• Use .values() to avoid creating a model instance
• Use .only() to avoid loading large text fields
Slide 66
Slide 66 text
Memory Leak
Slide 67
Slide 67 text
Memory Leak Causes
• Bug in C extension (no garbage collection)
• Leaving file descriptors or network sockets open (use context
managers)
• Global objects (sometimes accidental)