## About Me
- 09年底至今,主要工作内容:基于Django的Web开发,从0.96版本到1.7,向Django及相关社区贡献了50+ commits
- 期间涉猎了javascript, golang, clojure等开发语言,对nginx, tornado, nodejs等工具的异步模型有一定了解
- 熟悉Linux下开发,了解部署,但之前未接触过Django的服务部署调优
- python manage.py runserver - just for development
- two threads 监控(自动重启)/实际运行
- drop-in replace: dcramer/django-devserver
- mod_wsgi / mod_python : Apache/Nginx内置Python环境
- uWSGI: C语言编写,内置uwsgi协议
- Gunicorn: 纯Py编写, 以Ruby的Unicorn为原型
- 貌似更流行
- 与uWSGI相比
- 性能并不弱:Web应用更多是IO Bound服务
- 我们用不到uWSGI更强大的功能
- 多种worker模式, 方便部署
- sync
- async
- Django作为full stack framework, 本身性能并不好,参见Techempower Benchmarks.
- Sync模式选择Ready的链接,依次执行
- 存在threads参数时,使用concurrent.futures.ThreadPoolExcutor执行,内存消耗大,且有线程安全的风险
- tornado - epoll/keque事件模型
- aiohttp - 基于asyncio, py3k
- gevent/eventlet - 基于greenlet,协程模式
- 成熟,使用广泛,API接口简单
- 方便在Django内部使用
- gevent.monkey.patch_all: done in worker_class
- 数据库Adaptor : MySQL-python -> pymysql
- 每个核心建议两个worker
- 在Comet/Long Polling/WebSocket下,gevent_pywsgi提升性能,否则proxy_buffering,
- cached template loaders
- cached_db session engine
- db connection max age
- 在高并发的情况下,DB或pool的连接会增大,产生雪崩的效应
- Taskset CPU亲和度,减少context switch
- 缓存DNS请求结果, 减少对第三方服务的依赖
- 数据库, 缓存服务器的读写分离
- DB Index
- CACHE
Written with StackEdit.