Django 并发简单测试

2019-10-16  本文已影响0人  自我实验室_村君

新建一个 Django Project,随便写个页面,sleep 3s

  1. 浏览器打开两个页面,一个页面完成才会开始响应另一个页面,总用时 6s
  2. 用 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 提高并发

  1. pip install gevent
  2. gunicorn 启动加上参数: gunicorn c10k.wsgi:application -w 5 -k gevent
    ab -n 30 -c 30 url 结果:
    • before: 7s
    • after: 2s
    • 效果非常明显
上一篇 下一篇

猜你喜欢

热点阅读