引言

手头上的项目有一些采用django框架编写, 如果说并发量比较小的时候简单的runserver是可以应对的.

那么当并发达到一两千的时候,该怎么提高django的并发能力呢?

Overview

环境说明:

python: 3.5

django: 1.8.2

gunicorn: 19.7.1

系统:

服务器: centos 4核

压测机器: centos 4核

压测环境

siege/ysab

4核centos测试机

为什么用django

开发效率高

好上手

关于gunicorn

Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX.It's a pre-fork worker model. The Gunicorn server is broadly compatible with various web frameworks, simply implemented, light on server resources, and fairly speedy.(这是官方给出的回答)

压测方式及命令

压测方式:

压测方式

压测命令:

siege: siege -c255 -t200S -v -b 'http://B_ip:8080/test POST appid=111'

ysab: ysab -n 900 -m POST -u http://B_ip:8080/test -d '{"appid": "111", "other": "other"}'

备注: 欢迎使用ysab, ysab文档

本次实验业务场景

业务

代码展示

settings部分

# 这里我们用mysql,其他配置都是默认

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.mysql',

'NAME': 'ce',

'USER': 'root',

'PASSWORD': '',

'HOST': '192.168.96.95',

'PORT': '3306',

# 'CONN_MAX_AGE': 600,

}

}

models部分

class Test(models.Model):

url = models.CharField(max_length=228, blank=True, null=True)

img_url = models.CharField(max_length=228, blank=True, null=True)

title = models.CharField(max_length=228, blank=True, null=True)

content = models.CharField(max_length=228, blank=True, null=True)

class Meta:

db_table = 'test'

verbose_name = "test表"

def __unicode__(self):

return self.id

views部分

class Test(APIView):

def post(self, requsts):

Test.objects.create(

**{'url': str(1000000 * time.time())})

return Response({"status": 200})

开始压测

数据说明

目前数据库test表的数据量是, 其中id是自增主键

MySQL [ce]> select id from test order by id desc limit 2;

+--------+

| id |

+--------+

| 627775 |

| 627774 |

+--------+

runserver 方式压测结果

Lifting the server siege... done.

Transactions: 24041 hits

Availability: 99.93 %

Elapsed time: 99.60 secs

Data transferred: 0.32 MB

Response time: 1.03 secs

Transaction rate: 241.38 trans/sec # 并发量只有241

Throughput: 0.00 MB/sec

Concurrency: 248.94

Successful transactions: 24041

Failed transactions: 16

Longest transaction: 32.55

Shortest transaction: 0.05

gunicorn + gevent (4个worker)

Lifting the server siege... done.

Transactions: 23056 hits

Availability: 100.00 %

Elapsed time: 99.49 secs

Data transferred: 0.31 MB

Response time: 1.09 secs

Transaction rate: 231.74 trans/sec # 并发量只有231

Throughput: 0.00 MB/sec

Concurrency: 252.95

Successful transactions: 23056

Failed transactions: 0

Longest transaction: 8.21

Shortest transaction: 0.01

gunicorn + gthread (4个worker, --threads=50)

启动方式

gunicorn --env DJANGO_SETTINGS_MODULE=ce.settings ce.wsgi:application -w 4 -b 0.0.0.0:8080 -k gthread --threads 40 --max-requests 4096 --max-requests-jitter 512

压测结果

启动方式:

done.

siege aborted due to excessive socket failure; you

can change the failure threshold in $HOME/.siegerc

Transactions: 28231 hits

Availability: 95.67 %

Elapsed time: 30.71 secs

Data transferred: 0.41 MB

Response time: 0.27 secs

Transaction rate: 919.28 trans/sec # 提高了不少吧,能不能在提高?

Throughput: 0.01 MB/sec

Concurrency: 251.06

Successful transactions: 28231

Failed transactions: 1278 # 但是失败的有些多

Longest transaction: 8.06

Shortest transaction: 0.01

gunicorn + gthread + CONN_MAX_AGE(4个worker, --threads=50)

CONN_MAX_AGE: 复用数据库链接

Lifting the server siege... done.

Transactions: 110289 hits

Availability: 99.62 %

Elapsed time: 99.65 secs

Data transferred: 1.47 MB

Response time: 0.23 secs

Transaction rate: 1106.76 trans/sec # 这次又提升了不少啊

Throughput: 0.01 MB/sec

Concurrency: 253.84

Successful transactions: 110289

Failed transactions: 422

Longest transaction: 3.85

Shortest transaction: 0.01

能不能gunicorn+gevent+CONN_MAX_AGE(4个worker)

这里我不建议使用,这样的话你的数据库连接数会飚的很高,服务会挂的很惨, 毕竟数据库是不会允许

无休止的建立连接的。前边的提高手段无非用的多线程,如果一定要用协程(gevent)的方式呢,能不

能解决数据库连接数过高的问题,而且还能有不错的性能呢?可以看一下这篇文章:

如何再次增加并发量

采用nginx做负载

[图片上传失败...(image-55dc84-1555064167047)]

去掉自增主键

原因很简单,因为自增主键的存在写库存在抢锁, 可以利用全局id生成器提前生成id直接写入数据库

换成异步任务去写库

如果数据只是存在mysql中做备份,建议使用异步的方式写入库,先把数据写到缓存下发给用户,之后在

利用后台异步任务一点点的写入,例如聊天系统可以这样干

换成更高效的框架或者语言

可以试试tornado, 如果tornado依然无法满足,可以尝试使用golango,毕竟golang是以高并发著称,

而且是编译语言,而且基于它的web框架也很容易上手,性能很可观,例如Gin

Gin

文章推荐

python diango 并发_利用gunicorn提高django的并发能力相关推荐

  1. python照片墙地图_利用python生成照片墙的示例代码

    PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了.其官方主页为:PIL. PIL历 ...

  2. python mysql 分页_利用python对mysql表做全局模糊搜索并分页实例

    在写django项目的时候,有的数据没有使用模型管理(数据表是动态添加的),所以要直接使用mysql.前端请求数据的时候可能会指定这几个参数:要请求的页号,页大小,以及检索条件. "&quo ...

  3. python 私有云_利用Docker+NextCloud搭建私有云盘

    利用Docker+NextCloud搭建私有云盘 NextCloud 是一款开源网络硬盘系统,最新版本是15,NextCloud 源代码完全开放,你可以在开源许可协议的约束下免费使用,对于需要专业支持 ...

  4. python 词云_利用Python生成词云

    利用Python生成词云 一.第三方库的安装与介绍 1.1  Python第三方库jieba(中文分词) 1.介绍 "结巴"中文分词:做最好的 Python 中文分词组件. 2.特 ...

  5. nginx + uWSGI 提高 Django的并发性(看着不错)

    1. uWSGI : uWSGI是一个web服务器,实现了WSGI协议.uwsgi协议.http协议等. uWSGI的主要特点是: 超快的性能 低内存占用 多app管理 详尽的日志功能(可以用来分析a ...

  6. 数据挖掘 python roc曲线_利用scikitlearn画ROC曲线实例

    一个完整的数据挖掘模型,最后都要进行模型评估,对于二分类来说,AUC,ROC这两个指标用到最多,所以 利用sklearn里面相应的函数进行模块搭建. 具体实现的代码可以参照下面博友的代码,评估svm的 ...

  7. 群晖python套件包_利用群晖Docker安装ubuntu16.04搭建python网站服务器(部署篇)

    在帖子<利用群晖Docker安装ubuntu16.04搭建python网站服务器(安装篇)(地址:http://www.cirdown.com:81/thread-185-1-1.html)&g ...

  8. python批量生成图片_利用Python批量生成任意尺寸的图片

    实现效果 通过源图片,在当前工作目录的/img目录下生成1000张,分别从1*1到1000*1000像素的图片. 效果如下: 目录结构 实现示例 # -*- coding: utf-8 -*- imp ...

  9. python高斯求和_利用Python进行数据分析(3)- 列表、元组、字典、集合

    本文主要是对Python的数据结构进行了一个总结,常见的数据结构包含:列表list.元组tuple.字典dict和集合set. image 索引 左边0开始,右边-1开始 通过index()函数查看索 ...

最新文章

  1. win下我的windows键失效了
  2. python保存至对应目录_python如何实现复制目录到指定目录
  3. 快速保留小数点后面几位(转)
  4. ssh连接不上linux虚拟机
  5. python3字符串转数字_Python3基础语法和基本数据类型
  6. java - 判断任意一天是这年的第几天
  7. C/C++ OpenCV之Laplacian边缘检测
  8. Servlet中参数获取方法
  9. java开发业务流程图,什么是业务流程图?业务流程图如何绘制?
  10. ArcGIS API For JavaScript 利用GP服务生成等值线、等值面(二)之生成等值面
  11. shareX截图工具提示:shareX\Tools\ffmpeg.exe不存在。解决方案2020年
  12. AG9300|Type-C 转VGA数据转换器解决方案
  13. 年仅28岁的程序员宣布从字节跳动退休,他是如何实现财务自由的?
  14. Excel 数据爬取
  15. 3.4 函数的单调性和曲线的凹凸性
  16. BTC-Relay与RootStock侧链技术对比
  17. 轻量应用服务器阿里云和腾讯云哪个好?
  18. java/php/net/python互联网 智慧云诊所管理系统设计
  19. UNCTF2022中RSA题目总结
  20. 帝国cms网站迁移到新的服务器,最简单的帝国CMS网站转移方法详解

热门文章

  1. Https 公钥、私钥、证书
  2. Ora_Excel 碉堡了
  3. Maven project deploy to Nexus
  4. 批量获取成员机管理员组用户信息
  5. 机器学习基础专题:特征工程
  6. CF1012F Passports
  7. 【分享】在线解析微信h5网页标签跳转到手机默认浏览器的实现方式
  8. acm寒假特辑1月24日 HDU - 2191(背包)/CodeForces - 500A
  9. ASFNU SC Day6
  10. java实现ad域登陆验证