压力测试

压力测试

  • 常⽤⼯具

    • ab (apache benchmark)

    • siege

    • wrk

    • locust

1.使用ab(apache benchmark) 进行压力测试

1.安装

sudo apt install apache2-utils

2.运行项目

python manage.py runserver

线上要把debug模式关掉:Debug=False

在终端中发起请求:curl http://127.0.0.1:8000/

带cookie登录发请求(有些接口需要登录):

 

 

 

 

3.压力测试:ab -n 100 -c 5 http://127.0.0.1:8000/

-n表示总的请求数,-c表示并发量

带cookie压力测试:

4.ab -k -n 10000 -c 5000 http://127.0.0.1:9000/

加上-k 表示客户端keepalive保持连接

HTTP 是建立在 TCP 之上的短连接协议,通信一次以后就会断开,频繁访问时会反复的进行三次握手和四次挥手,性能较差

KeepAlive: 从 HTTP 1.1 开始提供功能,能够重复利用 HTTP 建立好的连接,可以避免反复的进行三次握手和四次挥手的过程,提升性能

netstat -nat | grep 9000 查看9000端口Tcp网络连接

因为django自带的runserver性能不好,只适合代码开发调试,下面使用gunicorn代替runserver进行启动项目,然后再使用ab进行压力测试

2.gunicorn(是多进程+协程的工作模式)

1.安装

pip install gunicorn gevent

2.gunicorn运行项目

gunicorn -c swiper/gconfig.py swiper.wsgi

在项目路径下运行,-c代表gunicorn的配置文件(swiper/gconfig.py),swiper.wsgi表示项目的wsgi文件

报错socket:Too many open files 是文件描述符的限制

ulimit -n 命令为查看文件描述符数量,为当前程序能操作文件的最大数量

更改文件描述符数量:ulimit -n 65535 表示改为65535

更改最大连接数的配置:在/etc/sysctl.conf文件最后加上net.core.somaxconn=65535,最后命令sudo sysctl -p使更改生效

sudo sysctl -a 操作系统内核参数

sudo sysctl -a | grep conn 查看网络最大连接数

重启gunicorn: 先kill gunicorn的pid,在pidfile = 'logs/gunicorn.pid'文件中查看pid,然后gunicorn -c swiper/gconfig.py swiper.wsgi

总结:

1.使用gunicorn运行项目

2.更改文件描述符数量

3.更改最大连接数的配置

4.压力测试时加上参数-k,

这几点都可以让服务器性能有很大提升,压力测试的RPS提高

 

压力测试:

  • Echo 测试:

    • 系统零负载的情况下的压力,能够测得系统性能的上限

    • RPS (Requests per second, 每秒请求数):

      • Gunicorn + Gevent: 20000 r/s

      • Gunicorn + Meinheld: 36000 r/s

  • 带缓存的接口测试:

    • RPS: 9000 r/s

    • 工作中常见水平: 3000 r/s ~ 5000 r/s

  • 带数据库处理的接口测试:

    • RPS: 120 r/s

    • 工作中常见水平: 300 r/s ~ 600 r/s

QPS (每秒查询数) TPS (每秒事务数, 数据库指标)

影响服务器性能的因素:

  • 硬件

    • CPU

    • 内存

    • 硬盘

    • 网卡

    • 网络带宽

  • 软件

    • 程序语言: C/C++ > Go > Java > Python / Javascript / Ruby / PHP

    • 操作系统: Linux > Windows

    • 内核参数:

      • 服务器最大连接数: net.core.somaxconn = 65535

      • 最大文件描述符: ulimit -n 65535

      • KeepAlive: 使 HTTP 连接可以在一定时间内重用

      • IO处理模式: 异步 IO > 同步 IO,可以使用多进程、多线程、多协程等机制达到

      • IO多路复用: epoll

 

posted @ 2020-06-10 14:56  JustInTime  阅读(288)  评论(0)    收藏  举报