新建一个 Django Project,随便写个页面,sleep 3s
- 浏览器打开两个页面,一个页面完成才会开始响应另一个页面,总用时 6s
- 用 ab 测试,
ab -n 3 -c 3 http://127.0.0.1:8000/
,总用时 3s
疑问: 为什么用 ab 测试没有堵塞?
原因: 在开发环境中,Django 默认用 runserver 方式启动,请求默认是支持多线程的,可以通过加上 --nothreading
参数,禁止多线程运行
结果: 加 --nothreading
之后,ab 测试也是 6s
疑问: 为什么浏览器堵塞了?
原因: 浏览器有并发请求限制,Chrome 并发是 6。且 Chrome 访问相同的地址,会在一个加载完毕后再加载另一个
把请求的并发数提高到 30,ab 报错,服务器有请求会崩,所以部署时千万不要用默认的服务器
Benchmarking 127.0.0.1 (be patient)...Send request failed!
apr_socket_recv: Connection reset by peer (54)
Total of 2 requests completed
疑问: ab 并发 30 时就会有请求崩掉,用多线程同时发送 50 个请求,但不会崩掉
原因: 没找到
改为用 Gunicorn
启动
gunicorn c10k.wsgi:application -w 5
并发量加大没有出现请求崩掉的情况
Gunicorn 的作用,替换 Django 自带的默认服务器,更稳定
通过 Gevent 提高并发
pip install gevent
- gunicorn 启动加上参数:
gunicorn c10k.wsgi:application -w 5 -k gevent
ab -n 30 -c 30 url
结果:- before: 7s
- after: 2s
- 效果非常明显
网友评论