天天看点

在Centos下使用Siege对Django服务进行压力测试(Stress Testing)

Siege是linux下的一个web系统的压力测试工具,支持多链接,支持get和post请求,可以对web系统进行多并发下持续请求的压力测试。今天我们就使用Siege来对Django进行一次压力测试,看看单台Django服务到底能抗住多少的并发数。

首先安装Siege

wget http://download.joedog.org/siege/siege-3.0.8.tar.gz
tar zxvf siege-3.0.8.tar.gz
cd siege-3.0.8
./configure
make
make install

验证安装结果:输入siege -V 如果输出了版本号就代表安装没问题
           

Siege命令常用参数

-c 200 指定并发数200

-r 5 指定测试的次数5

-f urls.txt 制定url的文件

-i internet系统,随机发送url

-b 请求无需等待 delay=0

-t 5 持续测试5分钟

测试指标说明:

Transactions: 4 hits 完成4次处理

Availability: 100.00 % 成功率

Elapsed time: 1.19 secs 总共用时

Data transferred: 0.03MB 共数据传输:0.03MB

Response time: 0.13 secs 相应用时0.13秒,显示网络连接的速度

Transaction rate: 3.36 trans/sec平均每秒完成3.36次处理,表示服务器后台处理的速度

Throughput: 0.03MB/sec 平均每秒传送数据:0.03MB

Concurrency: 0.45 最高并发数 0.45

Successful transactions: 4成功处理次数

Failed transactions: 0 失败处理次数

Longest transaction:0.25请求最长响应时间/每次传输所花最长时间

Shortest transaction:0.09请求最短响应时间/每次传输所花最短时间

主要参考指标是Transaction rate

测试背景:

软件:python3.7.2 Django2.0.4

硬件 内存:1g cpu:1个1核 这个硬件配置有点惨,没办法了,因为没钱买好的

业务场景:Django使用mysql进行普通的读操作,没有使用任何缓存

压测命令:255个用户并发访问localhost:8000,持续时间为1分钟

siege -c255 -t60S -v -b 127.0.0.1:8000
           

首先使用runserver的起服务方式进行压测:

python3 manage.py runserver 0.0.0.0:8000
           
在Centos下使用Siege对Django服务进行压力测试(Stress Testing)

可以看到,这个有点凄惨,每秒后台只能处理166的请求,失败次数也有点高,更加说明了,runserver最好就是本地调试开发的时候用用就可以了,在生产环境使用runserver无异于自杀,不过在一些测试服务器上,如果懒得搭建uwsgi或者gunicorn,可以使用nohup配合runserver临时用一下。

使用uwsgi来起服务,uwsgi作为一款高性能的服务器,安装方式请见:https://v3u.cn/a_id_72起8个worker

uwsgi --http :8000 --module mypro.wsgi --processes 8
           
在Centos下使用Siege对Django服务进行压力测试(Stress Testing)

可以看到使用了uwsgi的提升还是很可观的,失败次数也减少了一半左右

最后,我们来试一试Gunicorn

Gunicorn是使用Python实现的WSGI服务器, 直接提供了http服务, 并且在woker上提供了多种选择, gevent, eventlet这些都支持, 在多worker最大化里用CPU的同时, 还可以使用协程来提供并发支撑, 对于网络IO密集的服务比较有利

安装 gunicorn

pip3 install gunicorn
           

起4个worker,50个线程

gunicorn --env DJANGO\_SETTINGS\_MODULE=mypro.settings mypro.wsgi:application -w 4 -b 0.0.0.0:8000 -k gthread --threads 50
           
在Centos下使用Siege对Django服务进行压力测试(Stress Testing)

可以看到性能上和uwsgi差不太多,但是失败数比较多。以1g1核的服务器,并发阈值也就在200左右了。

综上,单以性能论,Django的表现并非很好,但是你不能忽略它的学习成本低,简单并且容易上手的优势,鱼与熊掌不能兼得,如果要求高性能,可以试试tornado, 如果tornado依然无法满足,可以尝试使用golang,毕竟golang是以高并发著称的编译语言,而且基于它的web框架也很容易上手,性能很可观,例如Iris。