Skip to content

Instantly share code, notes, and snippets.

@flisky
Created July 7, 2014 03:48
Show Gist options
  • Save flisky/9a85ab5154dfef324e10 to your computer and use it in GitHub Desktop.
Save flisky/9a85ab5154dfef324e10 to your computer and use it in GitHub Desktop.
Django部署方案

Django服务部署

## About Me

  • 09年底至今,主要工作内容:基于Django的Web开发,从0.96版本到1.7,向Django及相关社区贡献了50+ commits
  • 期间涉猎了javascript, golang, clojure等开发语言,对nginx, tornado, nodejs等工具的异步模型有一定了解
  • 熟悉Linux下开发,了解部署,但之前未接触过Django的服务部署调优

Builtin Server

  • python manage.py runserver - just for development
  • two threads 监控(自动重启)/实际运行
  • drop-in replace: dcramer/django-devserver

Web Servers

  • mod_wsgi / mod_python : Apache/Nginx内置Python环境
  • uWSGI: C语言编写,内置uwsgi协议
  • Gunicorn: 纯Py编写, 以Ruby的Unicorn为原型

Gunicorn

  • 貌似更流行
  • 与uWSGI相比
    • 性能并不弱:Web应用更多是IO Bound服务
    • 我们用不到uWSGI更强大的功能
  • 多种worker模式, 方便部署
    • sync
    • async

Sync worker

  • Django作为full stack framework, 本身性能并不好,参见Techempower Benchmarks.
  • Sync模式选择Ready的链接,依次执行
  • 存在threads参数时,使用concurrent.futures.ThreadPoolExcutor执行,内存消耗大,且有线程安全的风险

Async worker

  • tornado - epoll/keque事件模型
  • aiohttp - 基于asyncio, py3k
  • gevent/eventlet - 基于greenlet,协程模式

Gevent

  • 成熟,使用广泛,API接口简单
  • 方便在Django内部使用

注意事项

  • gevent.monkey.patch_all: done in worker_class
  • 数据库Adaptor : MySQL-python -> pymysql
  • 每个核心建议两个worker
  • 在Comet/Long Polling/WebSocket下,gevent_pywsgi提升性能,否则proxy_buffering,

Django自身优化

  • cached template loaders
  • cached_db session engine
  • db connection max age

风险:

  • 在高并发的情况下,DB或pool的连接会增大,产生雪崩的效应

系统层面优化方式

  • Taskset CPU亲和度,减少context switch
  • 缓存DNS请求结果, 减少对第三方服务的依赖
  • 数据库, 缓存服务器的读写分离

Nuclear Weapon

  • DB Index
  • CACHE

Written with StackEdit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment