提高web服務(wù)并發(fā)實踐

引言

最近有個同事反映某個老舊項目總是有請求失敗的情況,早期項目為了快速上線完成任務(wù)钟病,很多代碼基本是怎么方便怎么寫蟹地,這樣就留下了很多隱患,于是找到服務(wù)器查看日志果然發(fā)現(xiàn)了大量的502去扣、499錯誤,然后又跟那個同事大致了解了下情況樊破,原來是客戶端最近增加了不少愉棱,并且有集中訪問的情況,根據(jù)情況自己寫了個測試腳本模擬真實請求開始測試哲戚,發(fā)現(xiàn)只要到大概200的并發(fā)奔滑,就會出現(xiàn)上述的錯誤(好吧,確實有點弱╮(╯╰)╭)

目標(biāo)

以目前的訪問量在不更換框架的情況下盡量把并發(fā)提高到1000以上
不影響現(xiàn)在的業(yè)務(wù)

服務(wù)器配置

硬件:16核CPU+32G內(nèi)存
軟件:gunicorn+django+postgresql
其他:gunicorn開了50個work

優(yōu)化流程

先從軟件配置開始查找問題顺少,發(fā)現(xiàn)gunicorn沒用gevent朋其,于是增加配置如下:

#gun.conf
worker_class = "gevent"
worker_connections = 2048
workers = 33 #官方建議(2 x $num_cores) + 1
backlog = 4096

#wsgi.py(別忘了打monkey patch)
import gevent.monkey
gevent.monkey.patch_all()
 

測試并發(fā)達(dá)到了300王浴,并且沒有錯誤,這個量還遠(yuǎn)遠(yuǎn)不夠令宿,繼續(xù)查找問題叼耙,發(fā)現(xiàn)每次測試的時候,數(shù)據(jù)庫服務(wù)器負(fù)載非常之高粒没,cpu使用率非常大筛婉,查下當(dāng)前慢查詢

select * from pg_stat_activity where state<>'idle' and now()-query_start > interval '1 s' order by query_start ;  
 

果然有條很簡單的查詢很耗時,居然可以用12s癞松,這能忍么爽撒,原因有張百萬數(shù)據(jù)的表居然在查詢條件那沒建索引ㄟ( ▔, ▔ )ㄏ,建了索引之后响蓉,發(fā)現(xiàn)果然快了好多硕勿,至少大于1s的查詢沒有了,感覺正個數(shù)據(jù)庫都輕松了好多枫甲,又繼續(xù)300個并發(fā)走起源武,果然負(fù)載下來了很多,是以前的1/10想幻,繼續(xù)加大并發(fā)測試粱栖,發(fā)現(xiàn)大概到600的時候就開始出現(xiàn)錯誤了,同時數(shù)據(jù)庫的壓力也上來了脏毯,索性加個慢查詢?nèi)罩景赡志浚^續(xù)看看:

log_min_duration_statement = 100ms
log_destination = 'csvlog'

發(fā)現(xiàn)了大量的耗時的sql類似這種:

select * from tablename where upper(columnname) = upper(aaa);

之后去代碼里看了下,有幾條django orm 語句類似這樣的食店,忽略大小寫:

XXX.objects.filter(xxx__iexact='aaa',xxx__iexact='bbb')
 

用了這個__iexact之后渣淤,數(shù)據(jù)庫就會進(jìn)行upper操作,django源碼里的一段代碼:

 operators = {
        'exact': '= %s',
        'iexact': '= UPPER(%s)',
        'contains': 'LIKE %s',
        'icontains': 'LIKE UPPER(%s)',
        'regex': '~ %s',
        'iregex': '~* %s',
        'gt': '> %s',
        'gte': '>= %s',
        'lt': '< %s',
        'lte': '<= %s',
        'startswith': 'LIKE %s',
        'endswith': 'LIKE %s',
        'istartswith': 'LIKE UPPER(%s)',
        'iendswith': 'LIKE UPPER(%s)',
    }

在stackoverflow上查到的一條建議:

I'd say your best bet is to simply create an index with upper(column) as well or instead of, and go have a drink

跟業(yè)務(wù)那邊溝通了下,數(shù)據(jù)都是非常標(biāo)準(zhǔn)的不會出現(xiàn)大小寫的問題吉嫩,所以改用exact价认,再次測試600并發(fā),果然負(fù)載小了很多自娩,直到并發(fā)達(dá)到1000開始出錯刻伊,也算有點進(jìn)步了~
進(jìn)一步優(yōu)化,由于這個服務(wù)每次請求都會往數(shù)據(jù)庫寫一條數(shù)據(jù)椒功,想了下能不能改成異步的,查找官網(wǎng)資料智什,直到如下配置:

#postgresql.conf
synchronous_commit = off

這個配置安全性還是很高的动漾,幾乎不會造成數(shù)據(jù)丟失參考鏈接
到目前為止并發(fā)已經(jīng)達(dá)到1000沒有報任何錯誤了,因為這是線上實時跑的業(yè)務(wù)荠锭,還沒想到更換框架

參考

gunicorn文檔
gevent官網(wǎng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旱眯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌删豺,老刑警劉巖共虑,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異呀页,居然都是意外死亡妈拌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門蓬蝶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尘分,“玉大人,你說我怎么就攤上這事丸氛∨喑睿” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵缓窜,是天一觀的道長定续。 經(jīng)常有香客問我,道長禾锤,這世上最難降的妖魔是什么私股? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮时肿,結(jié)果婚禮上庇茫,老公的妹妹穿的比我還像新娘。我一直安慰自己螃成,他們只是感情好旦签,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著寸宏,像睡著了一般宁炫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氮凝,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天羔巢,我揣著相機(jī)與錄音,去河邊找鬼罩阵。 笑死竿秆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的稿壁。 我是一名探鬼主播幽钢,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼傅是!你這毒婦竟也來了匪燕?” 一聲冷哼從身側(cè)響起蕾羊,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帽驯,沒想到半個月后龟再,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡尼变,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年利凑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片享甸。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡截碴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛉威,到底是詐尸還是另有隱情日丹,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布蚯嫌,位于F島的核電站哲虾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏择示。R本人自食惡果不足惜束凑,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栅盲。 院中可真熱鬧汪诉,春花似錦、人聲如沸谈秫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拟烫。三九已至该编,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間硕淑,已是汗流浹背课竣。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留置媳,地道東北人于樟。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像拇囊,于是被迫代替她去往敵國和親隔披。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360