高峰期之后線上服務(wù)器出現(xiàn)零星502的問(wèn)題排查

背景:上周消息中心 上線了一個(gè)新功能(群發(fā)消息)恋日,監(jiān)控系統(tǒng)發(fā)現(xiàn)調(diào)用我的系統(tǒng)里接口總是出現(xiàn)莫名其妙的502狀態(tài)碼拟逮,告警了

502概念:502 Bad Gateway是指錯(cuò)誤網(wǎng)關(guān)檀头,無(wú)效網(wǎng)關(guān);在互聯(lián)網(wǎng)中表示一種網(wǎng)絡(luò)錯(cuò)誤憔古。表現(xiàn)在WEB瀏覽器中給出的頁(yè)面反饋。它通常并不意味著上游服務(wù)器已關(guān)閉(無(wú)響應(yīng)網(wǎng)關(guān)/代理) 淋袖,而是上游服務(wù)器和網(wǎng)關(guān)/代理使用不一致的協(xié)議交換數(shù)據(jù)投放。鑒于互聯(lián)網(wǎng)協(xié)議是相當(dāng)清楚的,它往往意味著一個(gè)或兩個(gè)機(jī)器已不正確或不完全編程适贸。

一 原因分析

1.1 可能是服務(wù)器出現(xiàn)了大規(guī)模報(bào)錯(cuò)導(dǎo)致網(wǎng)關(guān)認(rèn)為服務(wù)不可用,直接拒絕

本次上線的功能是群發(fā)消息功能涝桅,目前疫情結(jié)束拜姿,通常會(huì)有許多人有群發(fā)消息通知顧客已恢復(fù)正常運(yùn)營(yíng)的需求,因此目前這個(gè)功能使用非常多冯遂,而且這個(gè)消息通知規(guī)模比較大蕊肥,每次通常會(huì)向幾萬(wàn)或者幾十萬(wàn)人發(fā)送消息,在現(xiàn)有資源情況下蛤肌,通常會(huì)帶動(dòng)服務(wù)器有一定的資源波動(dòng)壁却,因此第一時(shí)間懷疑是服務(wù)器資源不夠用了,系統(tǒng)產(chǎn)生大規(guī)模超時(shí)等報(bào)錯(cuò)讓網(wǎng)關(guān)層產(chǎn)生了假性服務(wù)器不可用的判斷,致使網(wǎng)關(guān)直接拒絕第三方調(diào)用的情況裸准。

我看了下展东,確實(shí)是每次出現(xiàn)502基本都是出現(xiàn)在群發(fā)任務(wù)調(diào)度比較多的情況,但是我在我們?nèi)罩鞠到y(tǒng)并沒有發(fā)現(xiàn)成規(guī)模的其他報(bào)錯(cuò)炒俱,另外服務(wù)器資源有波動(dòng)但是也沒那么大的波動(dòng)盐肃,因?yàn)槲覀冞@一般申請(qǐng)服務(wù)器資源比較容易爪膊,都是做了一定的富余的。

這邊咨詢了下運(yùn)維側(cè)最近是否有什么變動(dòng)或者解決方案砸王,運(yùn)維側(cè)覺得是服務(wù)器資源問(wèn)題推盛,先直接給我們加了一倍的機(jī)器

但是觀察后發(fā)現(xiàn)502少了但是問(wèn)題還是沒解決

1.2 網(wǎng)關(guān)兩邊鏈接保活時(shí)間不一致

我新功能上線的那一天的同時(shí)把我們的服務(wù)切到了K8s下谦铃,運(yùn)維側(cè)對(duì)那邊服務(wù)架構(gòu)做了比較大的調(diào)整耘成,對(duì)于代理這塊,以前使用的是nginx驹闰,現(xiàn)在改用了traefik瘪菌,我們知道在用了代理的情況下,其實(shí)客戶端和服務(wù)器并不是直接交互建立連接的疮方,而是客戶端請(qǐng)求交給代理控嗜,代理再進(jìn)行轉(zhuǎn)發(fā), 兩邊都是對(duì)代理層建立連接骡显。

先解釋下什么是keepalive疆栏?
這是http 1.1協(xié)議的缺省配置,在http 1.0的時(shí)候惫谤,如果你的網(wǎng)頁(yè)上有10個(gè)圖片壁顶,那么瀏覽器和服務(wù)器之間要同時(shí)建立10個(gè)連接,把這10個(gè)圖片發(fā)過(guò)去然后再關(guān)閉這10個(gè)連接溜歪,顯然對(duì)于服務(wù)器來(lái)說(shuō)若专,建立10個(gè)連接再關(guān)閉10個(gè)連接,消耗是比較大的蝴猪。所以在http 1.1協(xié)議里增加了keepalive的功能调衰,在發(fā)10張圖片的時(shí)候只需要建立一個(gè)連接就夠了,只要還有內(nèi)容要傳輸自阱,這個(gè)通道會(huì)始終保持開放狀態(tài)嚎莉,不會(huì)在傳輸完畢之后立刻關(guān)閉,這就是keepalive迸嫱悖活的意思趋箩。

但是keepalive不能把這個(gè)連接永遠(yuǎn)保持,如果沒有內(nèi)容了還繼續(xù)保持加派,無(wú)疑也是一種浪費(fèi)叫确,所以這里就產(chǎn)生了超時(shí)的概念,keepalive_timeout的意思是說(shuō)如果這個(gè)連接當(dāng)中沒有內(nèi)容傳輸了并且超過(guò)了這個(gè)時(shí)間芍锦,那么就把這個(gè)連接斷掉竹勉,keepalive_requests的意思是說(shuō)我們這個(gè)連接最多允許傳輸多少個(gè)內(nèi)容,超過(guò)這個(gè)內(nèi)容那么也把它斷掉醉旦。

那么這個(gè)keepalive_timout和我們的502錯(cuò)誤之間有什么關(guān)系呢饶米?
如我前面所說(shuō):因?yàn)樗芯W(wǎng)站的架構(gòu)都不是瀏覽器直接連接后端的應(yīng)用服務(wù)器桨啃,而一定是中間有nginx、traefik服務(wù)器做反向代理的檬输,瀏覽器和nginx服務(wù)器之間建立keepalive連接照瘾,nginx再和后端的應(yīng)用服務(wù)器建立keepalive連接,所以這是兩種不同的keepalive連接丧慈。
我們把瀏覽器和nginx之間的keepalive連接叫做ka1析命,把nginx和應(yīng)用服務(wù)器之間的keepalive連接叫做ka2。

如果ka1的超時(shí)設(shè)置為100秒逃默,也就是說(shuō)如果100秒之內(nèi)沒有新內(nèi)容要傳輸鹃愤,就把nginx和瀏覽器之間的連接斷掉。而同時(shí)完域,我們把ka2設(shè)置為50秒软吐,也就是說(shuō)如果nginx和應(yīng)用服務(wù)器之間沒有新內(nèi)容要傳輸,那么就把應(yīng)用服務(wù)器和nginx之間的連接斷掉吟税。那么這時(shí)候就會(huì)產(chǎn)生一個(gè)現(xiàn)象前50秒沒有傳輸內(nèi)容凹耙,在第51秒的時(shí)候,瀏覽器向nginx發(fā)了一個(gè)請(qǐng)求肠仪,這時(shí)候ka1還沒有斷掉肖抱,因?yàn)闆]有到100秒的時(shí)間,所以這是沒有問(wèn)題的异旧,但是當(dāng)nginx試圖向應(yīng)用服務(wù)器發(fā)請(qǐng)求的時(shí)候就出問(wèn)題了意述,ka2斷了!因?yàn)閗a2的超時(shí)設(shè)置是50秒吮蛹,這時(shí)候已經(jīng)超了荤崇,所以就斷了,這時(shí)候nginx無(wú)法再?gòu)膽?yīng)用服務(wù)器獲得正確響應(yīng)潮针,只好返回瀏覽器502錯(cuò)誤天试!

但是我們根本就沒有設(shè)置過(guò)這些參數(shù)啊,怎么會(huì)有這種問(wèn)題呢然低?
這沒關(guān)系,既然沒有設(shè)置過(guò)务唐,那系統(tǒng)肯定用的是缺省參數(shù)雳攘,我們來(lái)看一下ka1的缺省設(shè)置是多少,也就是nginx(ingress)和瀏覽器之間的缺省的keepalive_timeout值:

upstream-keepalive-timeout
Sets a timeout during which an idle keepalive connection to an upstream server will stay open. default: 60

ka1的缺省設(shè)置是60秒枫笛。
我們?cè)倏匆幌耴a2的缺省設(shè)置是多少秒吨灭,Tomcat官方文檔上說(shuō):

The number of milliseconds this Connector will wait for another HTTP request before closing the connection.
The default value is to use the value that has been set for the connectionTimeout attribute. Use a value of -1 to indicate no (i.e. infinite) timeout.

缺省值等同于connectionTimeout的值,那connectionTimeout等于多少呢刑巧?

The number of milliseconds this Connector will wait, after accepting a connection, for the request URI line to be presented.
Use a value of -1 to indicate no (i.e. infinite) timeout. The default value is 60000 (i.e. 60 seconds)
but note that the standard server.xml that ships with Tomcat sets this to 20000 (i.e. 20 seconds). 
Unless disableUploadTimeout is set to false, this timeout will also be used when reading the request body (if any).

connectionTimeout的缺省值是60秒喧兄,但是无畔,他們提供的標(biāo)準(zhǔn)的server.xml里把這個(gè)值設(shè)為了20秒!
那么現(xiàn)在問(wèn)題就很清楚了吠冤,我們的ka1是60秒浑彰,而ka2是20秒,從21秒到60秒之間的任何時(shí)間有請(qǐng)求進(jìn)來(lái)都會(huì)發(fā)生502錯(cuò)誤拯辙。
找到了問(wèn)題的根源郭变,解決起來(lái)就好辦了,我們只需要確保ka1的超時(shí)設(shè)置小于ka2的設(shè)置就夠了涯保∷弑簦或者修改ka1,或者修改ka2夕春,都是可以的未荒。

對(duì)于traefik也是一樣的,我們?cè)谇械絫raefik后及志,由于客戶端到traefik設(shè)置的keepalive為180s片排,而我們traefik到我們服務(wù)器設(shè)置的為60s,因此如果在客戶端到traefik的連接斷了后困肩,traefik到服務(wù)器連接還沒斷的時(shí)間區(qū)間內(nèi)請(qǐng)求服務(wù)划纽,那么極有可能出現(xiàn)502

二 解決

運(yùn)維側(cè)調(diào)整了客戶端到traefik的keepalive時(shí)間,調(diào)整為小于等于我們服務(wù)器到traefik的keepalive皆可锌畸,我們這里是調(diào)整的等于勇劣。
后面觀察了幾天,發(fā)現(xiàn)調(diào)整后服務(wù)器完全正常了潭枣,再也沒出現(xiàn)過(guò)502比默;

三 總結(jié)

其實(shí)這次問(wèn)題還是比較明顯的

  • 1.出現(xiàn)時(shí)機(jī)是新功能發(fā)布上線后
  • 2.502的同時(shí)往往伴隨著鏈接數(shù)的下降(先是系統(tǒng)充分預(yù)熱,鏈接數(shù)全部激活了,后期又逐漸下降)

這次的盲點(diǎn)
盲點(diǎn)主要是不清楚運(yùn)維側(cè)代理把nginx換成了traefik盆犁,不然問(wèn)題會(huì)更加明顯命咐,定位的更快些;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谐岁,一起剝皮案震驚了整個(gè)濱河市醋奠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伊佃,老刑警劉巖窜司,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異航揉,居然都是意外死亡塞祈,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門帅涂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)议薪,“玉大人尤蛮,你說(shuō)我怎么就攤上這事∷挂椋” “怎么了产捞?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捅位。 經(jīng)常有香客問(wèn)我轧葛,道長(zhǎng),這世上最難降的妖魔是什么艇搀? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任尿扯,我火速辦了婚禮,結(jié)果婚禮上焰雕,老公的妹妹穿的比我還像新娘衷笋。我一直安慰自己,他們只是感情好矩屁,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布辟宗。 她就那樣靜靜地躺著,像睡著了一般吝秕。 火紅的嫁衣襯著肌膚如雪泊脐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天烁峭,我揣著相機(jī)與錄音容客,去河邊找鬼。 笑死约郁,一個(gè)胖子當(dāng)著我的面吹牛缩挑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鬓梅,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼供置,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绽快?” 一聲冷哼從身側(cè)響起芥丧,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坊罢,沒想到半個(gè)月后娄柳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡艘绍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秫筏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诱鞠。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挎挖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出航夺,到底是詐尸還是另有隱情蕉朵,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布阳掐,位于F島的核電站始衅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缭保。R本人自食惡果不足惜汛闸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望艺骂。 院中可真熱鬧诸老,春花似錦、人聲如沸钳恕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)忧额。三九已至厘肮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間睦番,已是汗流浹背类茂。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抡砂,地道東北人大咱。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像注益,于是被迫代替她去往敵國(guó)和親碴巾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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