利用gunicorn提高django的并發(fā)能力

原文連接

引言

手頭上的項目有一些采用django框架編寫, 如果說并發(fā)量比較小的時候簡單的runserver是可以應(yīng)對的.
那么當(dāng)并發(fā)達(dá)到一兩千的時候臊恋,該怎么提高django的并發(fā)能力呢谚殊?

Overview

  • 環(huán)境說明:
    • python: 3.5
    • django: 1.8.2
    • gunicorn: 19.7.1
  • 系統(tǒng):
    • 服務(wù)器: centos 4核
    • 壓測機(jī)器: centos 4核
  • 壓測環(huán)境
    • siege/ysab
    • 4核centos測試機(jī)
  • 為什么用django
    • 開發(fā)效率高
    • 好上手
  • 關(guān)于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.(這是官方給出的回答)

壓測方式及命令

本次實驗業(yè)務(wù)場景

業(yè)務(wù)

代碼展示

settings部分

# 這里我們用mysql,其他配置都是默認(rèn)
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})

開始壓測

數(shù)據(jù)說明

目前數(shù)據(jù)庫test表的數(shù)據(jù)量是, 其中id是自增主鍵
MySQL [ce]> select id from test order by id desc limit 2;
+--------+
| id     |
+--------+
| 627775 |
| 627774 |
+--------+

runserver 方式壓測結(jié)果

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  # 并發(fā)量只有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 # 并發(fā)量只有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)

啟動方式

[官方有相應(yīng)說明]((http://docs.gunicorn.org/en/latest/settings.html)

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

壓測結(jié)果

啟動方式:

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)

關(guān)于CONN_MAX_AGE

CONN_MAX_AGE: 復(fù)用數(shù)據(jù)庫鏈接

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)

這里我不建議使用群井,這樣的話你的數(shù)據(jù)庫連接數(shù)會飚的很高传趾,服務(wù)會掛的很慘, 畢竟數(shù)據(jù)庫是不會允許
無休止的建立連接的晤郑。前邊的提高手段無非用的多線程,如果一定要用協(xié)程(gevent)的方式呢袍辞,能不
能解決數(shù)據(jù)庫連接數(shù)過高的問題鞋仍,而且還能有不錯的性能呢?可以看一下這篇文章:
gunicorn+gevent+django數(shù)據(jù)庫連接池

如何再次增加并發(fā)量

采用nginx做負(fù)載

[圖片上傳失敗...(image-55dc84-1555064167047)]

去掉自增主鍵

原因很簡單,因為自增主鍵的存在寫庫存在搶鎖, 可以利用全局id生成器提前生成id直接寫入數(shù)據(jù)庫

換成異步任務(wù)去寫庫

如果數(shù)據(jù)只是存在mysql中做備份搅吁,建議使用異步的方式寫入庫威创,先把數(shù)據(jù)寫到緩存下發(fā)給用戶落午,之后在
利用后臺異步任務(wù)一點點的寫入,例如聊天系統(tǒng)可以這樣干

換成更高效的框架或者語言

可以試試tornado, 如果tornado依然無法滿足肚豺,可以嘗試使用golango溃斋,畢竟golang是以高并發(fā)著稱,
而且是編譯語言,而且基于它的web框架也很容易上手吸申,性能很可觀梗劫,例如Gin
Gin

文章推薦

關(guān)于gunicorn的worker調(diào)度
gunicorn+gevent+django數(shù)據(jù)庫連接池

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市截碴,隨后出現(xiàn)的幾起案子梳侨,更是在濱河造成了極大的恐慌,老刑警劉巖日丹,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猫妙,死亡現(xiàn)場離奇詭異,居然都是意外死亡聚凹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門齐帚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妒牙,“玉大人,你說我怎么就攤上這事对妄∠娼瘢” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵剪菱,是天一觀的道長摩瞎。 經(jīng)常有香客問我,道長孝常,這世上最難降的妖魔是什么旗们? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮构灸,結(jié)果婚禮上上渴,老公的妹妹穿的比我還像新娘。我一直安慰自己喜颁,他們只是感情好稠氮,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著半开,像睡著了一般隔披。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寂拆,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天奢米,我揣著相機(jī)與錄音抓韩,去河邊找鬼。 笑死恃慧,一個胖子當(dāng)著我的面吹牛园蝠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痢士,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼彪薛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了怠蹂?” 一聲冷哼從身側(cè)響起善延,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎城侧,沒想到半個月后易遣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡嫌佑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年豆茫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屋摇。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡揩魂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炮温,到底是詐尸還是另有隱情火脉,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布柒啤,位于F島的核電站倦挂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏担巩。R本人自食惡果不足惜方援,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兵睛。 院中可真熱鬧肯骇,春花似錦、人聲如沸祖很。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽假颇。三九已至胚鸯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笨鸡,已是汗流浹背姜钳。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工坦冠, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哥桥。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓辙浑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拟糕。 傳聞我的和親對象是個殘疾皇子判呕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容