SlideShare a Scribd company logo
Django
Performance
Recipes
September 2015
Jon Atkinson
Technical Director
FARM Digital
Me
• I am not a very good programmer.
• I’m quite a good problem solver.
• I have made a lot of mistakes.
• I prefer valuable solutions.
My Context
• “Fast-moving agency environment”.
• We often participate in launches; demand is
spiky.
• Complex software.
Shared Context
• Traffic is unpredictable.
• We probably host in the cloud.
• The Django ecosystem.
Performance Matters
Speed is all about perception, but:
0-100ms Instant!
100-300ms Small delay.
300-1000ms Something is happening.
1000ms+ Likely task switch.
10000ms+ Abandoned task.
Rule of thumb
50% of users will abandon a task after
3 seconds.
Environment
A web server, talking to:
A managed python process, talking to:
A cache, and a database.
Request Cycle
Web Server
ORM
Middleware
Views + Templates
Web Server
Tools
!
ORM
• Optimising your database is a separate
presentation entirely.
• There are no ‘slow’ databases any more.
• In a read-heavy environment, caching Querysets
is a huge advantage.
ORM
django-cachalot
Caches your Django ORM queries and
automatically invalidates them.
ORM
$ pip install django-cachalot
INSTALLED_APPS += (‘cachalot’)
settings.CACHALOT_ENABLED = True
ORM
from django.conf import settings
from django.test.utils import override_settings
with override_settings(CACHALOT_ENABLED=False):
# SQL queries are not cached in this block
@override_settings(CACHALOT_CACHE=‘second_cache')
def your_function():
# What’s in this function uses another cache
# Globally disables SQL caching until you set it back to True
settings.CACHALOT_ENABLED = False
ORM
• A few other data access tips:
• Is your database doing DNS lookups?
• Do you have a connection timeout set? The
default is 0, and setup/teardown costs time.
settings.DATABASES[‘…’][‘CONN_MAX_AGE’] = 600
Middleware
Middleware is dumb.
Middleware
Middleware
• Think hard. Milliseconds add up.
• Middleware (and context processors!) often
becomes a dumping ground for common
features.
Middleware
Middleware is helpful.
Middleware
django.middleware.http.ConditionalGetMiddleware
Optimises GET requests from modern browsers
django.middleware.http.GZipMiddleware
Compresses responses. But be aware of BREACH!
Middleware
$ pip install django-cprofile-middleware
“Once you've installed it, log in as a user who has
staff privileges and add ?prof to any URL to see the
profiler's stats.”
eg. http://localhost:8000/foo/?prof.
Middleware
7986 function calls (7850 primitive calls) in 1.725 CPU seconds
Ordered by: internal time, call count
List reduced from 392 to 20 due to restriction <20>
ncalls tottime percall cumtime percall filename:lineno(function)
2 1.570 0.785 1.570 0.785 /…/django/db/backends/__init__.py:36(_commit)
15 0.043 0.003 0.043 0.003 /…/linecache.py:68(updatecache)
1 0.020 0.020 0.027 0.027 /…/django/contrib/auth/models.py:1(<module>)
12 0.014 0.001 0.030 0.002 /…/django/utils/importlib.py:18(import_module)
1013 0.010 0.000 0.010 0.000 /…/posixpath.py:56(join)
Views & Templates
• View performance problems are usually obvious:
• Avoid nested loops (especially when generating
QuerySets!)
• Cache where you can.
• Always return at the earliest possible moment.
Views & Templates
• Templates are more interesting.
• It’s easy to duplicate ORM calls already made in
the view.
• It’s easy to traverse relationships in the template
language.
• Templates are loaded from disk by default.
Views & Templates
class Person(models.Model):
def friends(self):
# Hit the database here for something complex…
return friends
# View:
if person.friends():
# Do something here…
# Template:
{% for friend in person.friends %}
Views & Templates
from django.utils.functional import
cached_property
@cached_property
def friends(self):
# Hit the database here for something complex…
return friends
Views & Templates
• Caching template fragments is very powerful.
• Sometimes you need to do something expensive in a
template, but:
{% load cache %}
{% cache 500 sidebar %}
… do something expensive here …
{% endcache %}
Views & Templates
• Where do your templates actually live?
• Cloud disk performance can be erratic.
Views & Templates
# Default setting.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)
Views & Templates
TEMPLATE_LOADERS = (
('django.template.loaders.cached.Loader', (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)),
)
nginx
This is my “one weird tip”…
… with a trade-off.
uwsgi_cache_path /tmp/nginx levels=1:2 keys_zone=my_zone:10m;
server {
listen 80;
server_name example.com;
…
uwsgi_cache_use_stale error timeout invalid_header http_500;
uwsgi_cache_valid 10m;
location / {
include uwsgi_params;
uwsgi_pass unix:///tmp/example.sock;
uwsgi_cache cache;
uwsgi_cache_key $scheme:$host$request_uri:$request_method;
uwsgi_cache_bypass $http_pragma $http_authorization;
uwsgi_no_cache $http_pragma $http_authorization;
}
nginx
Tools
• The tool ecosystem is richer now than ever
before.
$ pip install django-debug-toolbar
$ pip install dogslow
• Measure twice, cut once.
• Remember, Schrödinger’s web app.
Tools
Tools
import newrelic.agent
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
# This needs to be called after we bootstrapped the application
# otherwise the settings wouldn't be configured
from django.conf import settings # noqa
if hasattr(settings, 'NEWRELIC_CONFIG'):
newrelic.agent.initialize(settings.NEWRELIC_CONFIG 
getattr(settings, 'NEWRELIC_ENVIRONMENT', None))
application = newrelic.agent.WSGIApplicationWrapper(application)
Meta 1
Performance can be personal.
Meta 2
Meta 2
Meta 3
Performance is of huge value.
10x programmers probably don’t exist.
Keep your eyes up.
Concentrate on where the value lies.
Thank You
Questions?
Resources & Credits: http://blog.wearefarm.com

More Related Content

PDF
Hybrid Web Applications
PDF
Django a whirlwind tour
PDF
Introduction To Django (Strange Loop 2011)
PPTX
The Django Web Application Framework 2
PDF
The Best (and Worst) of Django
PPTX
Django Architecture Introduction
PPTX
PDF
Create responsive websites with Django, REST and AngularJS
Hybrid Web Applications
Django a whirlwind tour
Introduction To Django (Strange Loop 2011)
The Django Web Application Framework 2
The Best (and Worst) of Django
Django Architecture Introduction
Create responsive websites with Django, REST and AngularJS

What's hot (20)

PDF
Building a Dynamic Website Using Django
ODP
Getting started with Django 1.8
PDF
Php go vrooom!
PPTX
jQuery from the very beginning
ODP
Ruby on Rails
PPT
Writing Pluggable Software
PDF
PECL Picks - Extensions to make your life better
PPT
Django multi-tier
PDF
Django Heresies
PPTX
Php on the Web and Desktop
PPT
WordPress and Ajax
PDF
Realize mais com HTML 5 e CSS 3 - 16 EDTED - RJ
PDF
HTML5: friend or foe (to Flash)?
PDF
Free django
PDF
Django Rest Framework and React and Redux, Oh My!
PPT
Web::Scraper
PPT
High Performance Ajax Applications
PDF
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
KEY
Web application development with Django framework
PDF
Learning django step 1
Building a Dynamic Website Using Django
Getting started with Django 1.8
Php go vrooom!
jQuery from the very beginning
Ruby on Rails
Writing Pluggable Software
PECL Picks - Extensions to make your life better
Django multi-tier
Django Heresies
Php on the Web and Desktop
WordPress and Ajax
Realize mais com HTML 5 e CSS 3 - 16 EDTED - RJ
HTML5: friend or foe (to Flash)?
Free django
Django Rest Framework and React and Redux, Oh My!
Web::Scraper
High Performance Ajax Applications
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
Web application development with Django framework
Learning django step 1
Ad

Similar to Django Performance Recipes (20)

PDF
Where Django Caching Bust at the Seams
PDF
Drupal Performance : DrupalCamp North
PDF
Expecto Performa! The Magic and Reality of Performance Tuning
PDF
2019 StartIT - Boosting your performance with Blackfire
PDF
Dr Elephant: LinkedIn's Self-Service System for Detecting and Treating Hadoop...
PDF
High Performance Django
PDF
High Performance Django 1
PPTX
Performance & Scalability Improvements in Perforce
PDF
Top ten-list
PDF
Beat the devil: towards a Drupal performance benchmark
PPT
Capacity Management from Flickr
PDF
Scaling PHP apps
PDF
Cloud Best Practices
PPT
Cloud Computing with .Net
PDF
Gearman - Northeast PHP 2012
PDF
Profiling PHP with Xdebug / Webgrind
PDF
Gearman: A Job Server made for Scale
PDF
Real-Time Query for Data Guard
PPTX
PyGrunn 2017 - Django Performance Unchained - slides
ODP
* DJANGO - The Python Framework - Low Kian Seong, Developer
Where Django Caching Bust at the Seams
Drupal Performance : DrupalCamp North
Expecto Performa! The Magic and Reality of Performance Tuning
2019 StartIT - Boosting your performance with Blackfire
Dr Elephant: LinkedIn's Self-Service System for Detecting and Treating Hadoop...
High Performance Django
High Performance Django 1
Performance & Scalability Improvements in Perforce
Top ten-list
Beat the devil: towards a Drupal performance benchmark
Capacity Management from Flickr
Scaling PHP apps
Cloud Best Practices
Cloud Computing with .Net
Gearman - Northeast PHP 2012
Profiling PHP with Xdebug / Webgrind
Gearman: A Job Server made for Scale
Real-Time Query for Data Guard
PyGrunn 2017 - Django Performance Unchained - slides
* DJANGO - The Python Framework - Low Kian Seong, Developer
Ad

Recently uploaded (20)

PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Machine learning based COVID-19 study performance prediction
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
cuic standard and advanced reporting.pdf
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PPTX
Spectroscopy.pptx food analysis technology
PDF
Network Security Unit 5.pdf for BCA BBA.
PPT
Teaching material agriculture food technology
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PPTX
MYSQL Presentation for SQL database connectivity
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PPTX
Understanding_Digital_Forensics_Presentation.pptx
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Building Integrated photovoltaic BIPV_UPV.pdf
Machine learning based COVID-19 study performance prediction
Digital-Transformation-Roadmap-for-Companies.pptx
Review of recent advances in non-invasive hemoglobin estimation
NewMind AI Weekly Chronicles - August'25 Week I
Encapsulation_ Review paper, used for researhc scholars
Advanced methodologies resolving dimensionality complications for autism neur...
Agricultural_Statistics_at_a_Glance_2022_0.pdf
cuic standard and advanced reporting.pdf
Programs and apps: productivity, graphics, security and other tools
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
The Rise and Fall of 3GPP – Time for a Sabbatical?
Spectroscopy.pptx food analysis technology
Network Security Unit 5.pdf for BCA BBA.
Teaching material agriculture food technology
Dropbox Q2 2025 Financial Results & Investor Presentation
MYSQL Presentation for SQL database connectivity
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Understanding_Digital_Forensics_Presentation.pptx

Django Performance Recipes

  • 2. Me • I am not a very good programmer. • I’m quite a good problem solver. • I have made a lot of mistakes. • I prefer valuable solutions.
  • 3. My Context • “Fast-moving agency environment”. • We often participate in launches; demand is spiky. • Complex software.
  • 4. Shared Context • Traffic is unpredictable. • We probably host in the cloud. • The Django ecosystem.
  • 5. Performance Matters Speed is all about perception, but: 0-100ms Instant! 100-300ms Small delay. 300-1000ms Something is happening. 1000ms+ Likely task switch. 10000ms+ Abandoned task.
  • 6. Rule of thumb 50% of users will abandon a task after 3 seconds.
  • 7. Environment A web server, talking to: A managed python process, talking to: A cache, and a database.
  • 8. Request Cycle Web Server ORM Middleware Views + Templates Web Server Tools
  • 9. !
  • 10. ORM • Optimising your database is a separate presentation entirely. • There are no ‘slow’ databases any more. • In a read-heavy environment, caching Querysets is a huge advantage.
  • 11. ORM django-cachalot Caches your Django ORM queries and automatically invalidates them.
  • 12. ORM $ pip install django-cachalot INSTALLED_APPS += (‘cachalot’) settings.CACHALOT_ENABLED = True
  • 13. ORM from django.conf import settings from django.test.utils import override_settings with override_settings(CACHALOT_ENABLED=False): # SQL queries are not cached in this block @override_settings(CACHALOT_CACHE=‘second_cache') def your_function(): # What’s in this function uses another cache # Globally disables SQL caching until you set it back to True settings.CACHALOT_ENABLED = False
  • 14. ORM • A few other data access tips: • Is your database doing DNS lookups? • Do you have a connection timeout set? The default is 0, and setup/teardown costs time. settings.DATABASES[‘…’][‘CONN_MAX_AGE’] = 600
  • 17. Middleware • Think hard. Milliseconds add up. • Middleware (and context processors!) often becomes a dumping ground for common features.
  • 19. Middleware django.middleware.http.ConditionalGetMiddleware Optimises GET requests from modern browsers django.middleware.http.GZipMiddleware Compresses responses. But be aware of BREACH!
  • 20. Middleware $ pip install django-cprofile-middleware “Once you've installed it, log in as a user who has staff privileges and add ?prof to any URL to see the profiler's stats.” eg. http://localhost:8000/foo/?prof.
  • 21. Middleware 7986 function calls (7850 primitive calls) in 1.725 CPU seconds Ordered by: internal time, call count List reduced from 392 to 20 due to restriction <20> ncalls tottime percall cumtime percall filename:lineno(function) 2 1.570 0.785 1.570 0.785 /…/django/db/backends/__init__.py:36(_commit) 15 0.043 0.003 0.043 0.003 /…/linecache.py:68(updatecache) 1 0.020 0.020 0.027 0.027 /…/django/contrib/auth/models.py:1(<module>) 12 0.014 0.001 0.030 0.002 /…/django/utils/importlib.py:18(import_module) 1013 0.010 0.000 0.010 0.000 /…/posixpath.py:56(join)
  • 22. Views & Templates • View performance problems are usually obvious: • Avoid nested loops (especially when generating QuerySets!) • Cache where you can. • Always return at the earliest possible moment.
  • 23. Views & Templates • Templates are more interesting. • It’s easy to duplicate ORM calls already made in the view. • It’s easy to traverse relationships in the template language. • Templates are loaded from disk by default.
  • 24. Views & Templates class Person(models.Model): def friends(self): # Hit the database here for something complex… return friends # View: if person.friends(): # Do something here… # Template: {% for friend in person.friends %}
  • 25. Views & Templates from django.utils.functional import cached_property @cached_property def friends(self): # Hit the database here for something complex… return friends
  • 26. Views & Templates • Caching template fragments is very powerful. • Sometimes you need to do something expensive in a template, but: {% load cache %} {% cache 500 sidebar %} … do something expensive here … {% endcache %}
  • 27. Views & Templates • Where do your templates actually live? • Cloud disk performance can be erratic.
  • 28. Views & Templates # Default setting. TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader', )
  • 29. Views & Templates TEMPLATE_LOADERS = ( ('django.template.loaders.cached.Loader', ( 'django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader', )), )
  • 30. nginx This is my “one weird tip”… … with a trade-off.
  • 31. uwsgi_cache_path /tmp/nginx levels=1:2 keys_zone=my_zone:10m; server { listen 80; server_name example.com; … uwsgi_cache_use_stale error timeout invalid_header http_500; uwsgi_cache_valid 10m; location / { include uwsgi_params; uwsgi_pass unix:///tmp/example.sock; uwsgi_cache cache; uwsgi_cache_key $scheme:$host$request_uri:$request_method; uwsgi_cache_bypass $http_pragma $http_authorization; uwsgi_no_cache $http_pragma $http_authorization; }
  • 32. nginx
  • 33. Tools • The tool ecosystem is richer now than ever before. $ pip install django-debug-toolbar $ pip install dogslow • Measure twice, cut once. • Remember, Schrödinger’s web app.
  • 34. Tools
  • 35. Tools
  • 36. import newrelic.agent from django.core.wsgi import get_wsgi_application application = get_wsgi_application() # This needs to be called after we bootstrapped the application # otherwise the settings wouldn't be configured from django.conf import settings # noqa if hasattr(settings, 'NEWRELIC_CONFIG'): newrelic.agent.initialize(settings.NEWRELIC_CONFIG getattr(settings, 'NEWRELIC_ENVIRONMENT', None)) application = newrelic.agent.WSGIApplicationWrapper(application)
  • 37. Meta 1 Performance can be personal.
  • 40. Meta 3 Performance is of huge value. 10x programmers probably don’t exist. Keep your eyes up. Concentrate on where the value lies.
  • 41. Thank You Questions? Resources & Credits: http://blog.wearefarm.com