99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

線上四臺(tái)機(jī)器同一時(shí)間全部OOM,到底發(fā)生了什么?

數(shù)據(jù)分析與開發(fā) ? 來(lái)源:數(shù)據(jù)分析與開發(fā) ? 2023-02-08 15:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

案發(fā)現(xiàn)場(chǎng)

昨天晚上突然短信收到 APM (即 Application Performance Management 的簡(jiǎn)稱,我們內(nèi)部自己搭建了這樣一套系統(tǒng)來(lái)對(duì)應(yīng)用的性能、可靠性進(jìn)行線上的監(jiān)控和預(yù)警的一種機(jī)制)大量告警畫外音: 監(jiān)控是一種非常重要的發(fā)現(xiàn)問(wèn)題的手段,沒(méi)有的話一定要及時(shí)建立哦

緊接著運(yùn)維打來(lái)電話告知線上部署的四臺(tái)機(jī)器全部 OOM (out of memory, 內(nèi)存不足),服務(wù)全部不可用,趕緊查看問(wèn)題!

問(wèn)題排查

首先運(yùn)維先重啟了機(jī)器,保證線上服務(wù)可用,然后再仔細(xì)地看了下線上的日志,確實(shí)是因?yàn)?OOM 導(dǎo)致服務(wù)不可用

680a4348-a761-11ed-bfe3-dac502259ad0.png

第一時(shí)間想到 dump 當(dāng)時(shí)的內(nèi)存狀態(tài),但由于為了讓線上盡快恢復(fù)服務(wù),運(yùn)維重啟了機(jī)器,導(dǎo)致無(wú)法 dump 出事發(fā)時(shí)的內(nèi)存。所以我又看了下我們 APM 中對(duì) JVM 的監(jiān)控圖表

畫外音:一種方式不行,嘗試另外的角度切入!再次強(qiáng)調(diào),監(jiān)控非常重要!完善的監(jiān)控能還原當(dāng)時(shí)的事發(fā)現(xiàn)場(chǎng),方便定位問(wèn)題。

681ef536-a761-11ed-bfe3-dac502259ad0.png

不看不知道,一看嚇一跳,從 16:00 開始應(yīng)用中創(chuàng)建的線程居然每時(shí)每刻都在上升,一直到 3w 左右,重啟后(藍(lán)色箭頭),線程也一直在不斷增長(zhǎng)),正常情況下的線程數(shù)是多少呢,600!問(wèn)題找到了,應(yīng)該是在下午 16:00 左右發(fā)了一段有問(wèn)題的代碼,導(dǎo)致線程一直在創(chuàng)建,且創(chuàng)建的線程一直未消亡!查看發(fā)布記錄,發(fā)現(xiàn)發(fā)布記錄只有這么一段可疑的代碼 diff:在 HttpClient 初始化的時(shí)候額外加了一個(gè)evictExpiredConnections配置

682b5b0a-a761-11ed-bfe3-dac502259ad0.png

問(wèn)題定位了,應(yīng)該是就是這個(gè)配置導(dǎo)致的?。ň€程上升的時(shí)間點(diǎn)和發(fā)布時(shí)間點(diǎn)完全吻合?。?,于是先把這個(gè)新加的配置給干掉上線,上線之后線程數(shù)果然恢復(fù)正常了。那evictExpiredConnections做了什么導(dǎo)致線程數(shù)每時(shí)每刻在上升呢?這個(gè)配置又是為了解決什么問(wèn)題而加上的呢?于是找到了相關(guān)同事來(lái)了解加這個(gè)配置的前因后果

還原事發(fā)經(jīng)過(guò)

最近線上出現(xiàn)不少NoHttpResponseException的異常, 而上面那個(gè)配置就是為了解決這個(gè)異常而添加的,那是什么導(dǎo)致了這個(gè)異常呢?

在說(shuō)這個(gè)問(wèn)題之前我們得先了解一下 http 的 keep-alive 機(jī)制。

先看下正常的一個(gè) TCP 連接的生命周期

6843813a-a761-11ed-bfe3-dac502259ad0.png

可以看到每個(gè) TCP 連接都要經(jīng)過(guò)三次握手建立連接后才能發(fā)送數(shù)據(jù),要經(jīng)過(guò)四次揮手才能斷開連接,如果每個(gè) TCP 連接在 server 返回 response 后都立馬斷開,則發(fā)起多個(gè) HTTP 請(qǐng)求就要多次創(chuàng)建斷開 TCP, 這在Http 請(qǐng)求很多的情況下無(wú)疑是很耗性能的, 如果在 server 返回 response 不立即斷開 TCP 鏈接,而是復(fù)用這條鏈接進(jìn)行下一次的 Http 請(qǐng)求,則無(wú)形中省略了很多創(chuàng)建 / 斷開 TCP 的開銷,性能上無(wú)疑會(huì)有很大提升。

如下圖示,左圖是不復(fù)用 TCP 發(fā)起多個(gè) HTTP 請(qǐng)求的情況,右圖是復(fù)用 TCP 的情況,可以看到發(fā)起三次 HTTP 請(qǐng)求,復(fù)用 TCP 的話可以省去兩次建立 / 斷開 TCP 的開銷,理論上一個(gè)應(yīng)用只要開啟一個(gè) TCP 連接即可,其他 HTTP 請(qǐng)求都可以復(fù)用這個(gè) TCP 連接,這樣 n 次 HTTP 請(qǐng)求可以省去 n-1 次創(chuàng)建 / 斷開 TCP 的開銷。這對(duì)性能的提升無(wú)疑是有巨大的幫助。

6853a646-a761-11ed-bfe3-dac502259ad0.png

回過(guò)頭來(lái)看 keep-alive (又稱持久連接,連接復(fù)用)做的就是復(fù)用連接, 保證連接持久有效。

畫外音: Http 1.1 之后 keep-alive 默認(rèn)支持并開啟,目前大部分網(wǎng)站都用了 http 1.1 了,也就是說(shuō)大部分都默認(rèn)支持連接復(fù)用了

天下沒(méi)有免費(fèi)的午餐,雖然 keep-alive 省去了很多不必要的握手/揮手操作,但由于連接長(zhǎng)期?;?,如果一直沒(méi)有 http 請(qǐng)求的話,這條連接也就長(zhǎng)期閑著了,會(huì)占用系統(tǒng)資源,有時(shí)反而會(huì)比復(fù)用連接帶來(lái)更大的性能消耗。所以我們一般會(huì)為 keep-alive 設(shè)置一個(gè) timeout, 這樣如果連接在設(shè)置的 timeout 時(shí)間內(nèi)一直處于空閑狀態(tài)(未發(fā)生任何數(shù)據(jù)傳輸),經(jīng)過(guò) timeout 時(shí)間后,連接就會(huì)釋放,就能節(jié)省系統(tǒng)開銷。

看起來(lái)給 keep-alive 加 timeout 是完美了,但是又引入了新的問(wèn)題(一波已平,一波又起!),考慮如下情況:

如果服務(wù)端關(guān)閉連接,發(fā)送 FIN 包(注:在設(shè)置的 timeout 時(shí)間內(nèi)服務(wù)端如果一直未收到客戶端的請(qǐng)求,服務(wù)端會(huì)主動(dòng)發(fā)起帶 FIN 標(biāo)志的請(qǐng)求以斷開連接釋放資源),在這個(gè) FIN 包發(fā)送但是還未到達(dá)客戶端期間,客戶端如果繼續(xù)復(fù)用這個(gè) TCP 連接發(fā)送 HTTP 請(qǐng)求報(bào)文的話,服務(wù)端會(huì)因?yàn)樵谒拇螕]手期間不接收?qǐng)?bào)文而發(fā)送 RST 報(bào)文給客戶端,客戶端收到 RST 報(bào)文就會(huì)提示異常 (即NoHttpResponseException)

我們?cè)儆昧鞒虉D仔細(xì)梳理一下上述這種產(chǎn)生NoHttpResponseException的原因,這樣能看得更明白一些

686b5fca-a761-11ed-bfe3-dac502259ad0.png

費(fèi)了這么大的功夫,我們終于知道了產(chǎn)生NoHttpResponseException的原因,那該怎么解決呢,有兩種策略

重試,收到異常后,重試一兩次,由于重試后客戶端會(huì)用有效的連接去請(qǐng)求,所以可以避免這種情況,不過(guò)一次要注意重試次數(shù),避免引起雪崩!

設(shè)置一個(gè)定時(shí)線程,定時(shí)清理上述的閑置連接,可以將這個(gè)定時(shí)時(shí)間設(shè)置為 keep alive timeout 時(shí)間的一半以保證超時(shí)前回收。

evictExpiredConnections就是用的上述第二種策略,來(lái)看下官方用法使用說(shuō)明

Makes this instance of HttpClient proactively evict idle connections from the connection pool using a background thread.

調(diào)用這個(gè)方法只會(huì)產(chǎn)生一個(gè)定時(shí)線程,那為啥應(yīng)用中線程會(huì)一直增加呢,因?yàn)槲覀儗?duì)每一個(gè)請(qǐng)求都創(chuàng)建了一個(gè) HttpClient! 這樣由于創(chuàng)建每一個(gè) HttpClient 實(shí)例j時(shí)都會(huì)調(diào)用 evictExpiredConnections,導(dǎo)致有多少請(qǐng)求就會(huì)創(chuàng)建多少個(gè)定時(shí)線程!

還有一個(gè)問(wèn)題,為啥線上四臺(tái)機(jī)器幾乎同一時(shí)間點(diǎn)全掛呢?因?yàn)橛捎谪?fù)載均衡,這四臺(tái)機(jī)器的權(quán)重是一樣的,硬件配置也一樣,收到的請(qǐng)求其實(shí)也可以認(rèn)為是差不多的,這樣這四臺(tái)機(jī)器由于創(chuàng)建 HttpClient 而生成的后臺(tái)線程也在同一時(shí)間達(dá)到最高點(diǎn),然后同時(shí) OOM。

解決問(wèn)題

所以針對(duì)以上提到的問(wèn)題,我們首先把 HttpClient 改成了單例,這樣保證服務(wù)啟動(dòng)后只會(huì)有一個(gè)定時(shí)清理線程,另外我們也讓運(yùn)維針對(duì)應(yīng)用的線程數(shù)做了監(jiān)控,如果超過(guò)某個(gè)閾值直接告警,這樣能在應(yīng)用 OOM 前及時(shí)發(fā)現(xiàn)處理。

畫外音:再次強(qiáng)調(diào),監(jiān)控相當(dāng)重要,能把問(wèn)題扼殺在搖籃里!

總結(jié)

本文通過(guò)線上四臺(tái)機(jī)器同時(shí) OOM 的現(xiàn)象,來(lái)詳細(xì)剖析定位了產(chǎn)生問(wèn)題的原因,可以看到我們?cè)趹?yīng)用某個(gè)庫(kù)時(shí)首先要對(duì)這個(gè)庫(kù)要有充分的了解(上述 HttpClient 的創(chuàng)建不用單例顯然是個(gè)問(wèn)題),其次必要的網(wǎng)絡(luò)知識(shí)還是需要的,所以要成為一個(gè)合格的程序員,不光對(duì)語(yǔ)言本身有所了解,還要對(duì)網(wǎng)絡(luò),數(shù)據(jù)庫(kù)等也要有所涉獵,這些對(duì)排查問(wèn)題以及性能調(diào)優(yōu)等會(huì)有非常大的幫助,再次,完善的監(jiān)控非常重要,通過(guò)觸發(fā)某個(gè)閾值提前告警,可以將問(wèn)題扼殺在搖籃里!

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 機(jī)器
    +關(guān)注

    關(guān)注

    0

    文章

    791

    瀏覽量

    41288
  • APM
    APM
    +關(guān)注

    關(guān)注

    1

    文章

    72

    瀏覽量

    13423
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    508

    瀏覽量

    20220

原文標(biāo)題:震驚!線上四臺(tái)機(jī)器同一時(shí)間全部 OOM,到底發(fā)生了什么?

文章出處:【微信號(hào):DBDevs,微信公眾號(hào):數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何保證同一時(shí)間串口只進(jìn)行個(gè)操作

    程序在運(yùn)行的時(shí)候,有些地方串口是要寫入,有些地方是要讀取,但兩個(gè)地方是同時(shí)運(yùn)行的,那么我該怎么去保證在同一時(shí)間內(nèi),同一個(gè)串口只進(jìn)行個(gè)操作,要么讀取要么寫入。就是如何對(duì)這些操作進(jìn)行個(gè)
    發(fā)表于 02-05 09:31

    可以請(qǐng)教大家個(gè)問(wèn)題嗎!大家能幫我看看這個(gè)板子是不是上錯(cuò)物料呢!就是同一時(shí)

    可以請(qǐng)教大家個(gè)問(wèn)題嗎!大家能幫我看看這個(gè)板子是不是上錯(cuò)物料呢!就是同一時(shí)間生產(chǎn),可是兩個(gè)板子就出現(xiàn)兩個(gè)情況!個(gè)板子上的開關(guān)芯片內(nèi)阻抗非常大,個(gè)正常! . 因?yàn)檫x用的是美
    發(fā)表于 05-01 19:58

    電源電路控制,使用與非門的74,不知道這樣的是需要設(shè)計(jì)個(gè)什么樣的電路?

    您好:我想做個(gè)小型的電路,主要實(shí)現(xiàn)以下功能:倆個(gè)u***口全部正常無(wú)損壞,同一時(shí)間如果插入個(gè)可以充電傳輸,另個(gè)就斷開不能充電傳輸(
    發(fā)表于 04-03 12:01

    請(qǐng)問(wèn)OLED顯示屏可以讓整幀畫面同一時(shí)間顯示出來(lái)嗎,而不是行掃?

    OLED顯示屏是否可以讓整幀畫面同一時(shí)間顯示出來(lái),而不是行掃?
    發(fā)表于 07-23 16:35

    多個(gè)SmartXplorer在一臺(tái)機(jī)器上運(yùn)行

    嗨,我想在一臺(tái)機(jī)器上運(yùn)行多個(gè)smartXplorer運(yùn)行,即我有兩個(gè)不同的項(xiàng)目,并希望在同一臺(tái)機(jī)器上運(yùn)行SmartXplorer。但是,當(dāng)試圖啟動(dòng)第二個(gè)SmartXplorer運(yùn)行時(shí),我被告知它
    發(fā)表于 10-17 14:15

    ad9361基帶信號(hào)輸入為什么P路在同一時(shí)間周期內(nèi)攜帶兩個(gè)相位相反的信號(hào)?

    。 data_p與data_n是組相位相反的信號(hào)。為什么P路在同一時(shí)間周期內(nèi)攜帶兩個(gè)相位相反的信號(hào)? 對(duì)后面的DA轉(zhuǎn)換有什么影響??現(xiàn)在在看手冊(cè),還沒(méi)看這方面的解釋~~望大神指點(diǎn)?。。?! 附上程序圖
    發(fā)表于 02-25 10:49

    為什么般的無(wú)線遙控玩具同一時(shí)間只能控制個(gè)電機(jī)轉(zhuǎn)動(dòng)

    大家好,我想問(wèn)個(gè)可能很幼稚的問(wèn)題:為什么般的無(wú)線遙控玩具同一時(shí)間只能控制個(gè)電機(jī)轉(zhuǎn)動(dòng),買了個(gè)2.4GHz的無(wú)線遙控器+4通道電機(jī)控制,
    發(fā)表于 07-02 06:37

    為什么我打印出來(lái)的都是同一時(shí)間的CPU使用率?

    求助:stm32+ucosii,統(tǒng)計(jì)CPU使用率,通過(guò)串口打印出來(lái),結(jié)果打印出來(lái)的都是同一時(shí)間的CPU使用率希望大家?guī)臀铱?b class='flag-5'>一下,感激不盡?。?!
    發(fā)表于 08-19 04:35

    UART和CAN總線在同一時(shí)間會(huì)怎么樣

    )。同時(shí)用1至4個(gè)串行端口進(jìn)行SED。我知道可以使用PIC32 RAM來(lái)保存緩沖器。也許有更多的背景發(fā)生,我不知道。誰(shuí)有相似的經(jīng)驗(yàn),或者我有奇特的軟件,使UART和CAN總線在同一時(shí)間,以大約相同的速率起具有意想不到的數(shù)據(jù)?謝
    發(fā)表于 04-27 13:39

    可以在同一時(shí)間使用STM32WB55的外部RAM和FLASH呢?

    我正在嘗試向 STM32WB55 添加外部 FLASH 和 RAM,但他沒(méi)有 FMC 或 FSMC,并且可以找到與此主題相關(guān)的所有資源都使用 FMC 外設(shè),有任何方法可以使用外部 RAM和FLASH在同一時(shí)間?我應(yīng)該為它們都使用 1 QSPI 嗎?
    發(fā)表于 12-28 06:09

    百度對(duì)Robin第一時(shí)間做出回答:我沒(méi)說(shuō)過(guò)

    幾個(gè)做創(chuàng)投的朋友見面第句話就是問(wèn)Robin之事是否空穴來(lái)風(fēng)?百度當(dāng)然是第一時(shí)間做了辟謠回應(yīng),稱已于5月22日收集好證據(jù)向公安機(jī)關(guān)報(bào)了案。
    發(fā)表于 07-05 15:35 ?2611次閱讀

    高通、博通同一時(shí)間大量裁員_商量好了?

    15日最新消息,據(jù)路透社報(bào)道,美國(guó)芯片巨頭博通周宣布,在完成對(duì)博科通訊系統(tǒng)的收購(gòu)后,已裁減了約1100名員工,以削減成本。與此同時(shí),另家美國(guó)芯片巨頭高通15日(上午)也傳來(lái)裁員消息。據(jù)悉,高通數(shù)據(jù)中心芯片部門將裁減約280名員工。
    的頭像 發(fā)表于 06-19 16:16 ?4978次閱讀

    微軟第一時(shí)間采取措施適配搭載M1的macOS

    針對(duì)蘋果發(fā)布的基于ARM機(jī)構(gòu)的M1桌面處理器,微軟已經(jīng)第一時(shí)間跟進(jìn)了。
    的頭像 發(fā)表于 11-12 14:19 ?1646次閱讀

    現(xiàn)場(chǎng)設(shè)備發(fā)生故障,虹科物聯(lián)網(wǎng)HMI第一時(shí)間通知相關(guān)人員?

    現(xiàn)場(chǎng)設(shè)備是保證企業(yè)正常生產(chǎn)的關(guān)鍵條件之,當(dāng)設(shè)備發(fā)生故障時(shí),如何能夠第一時(shí)間發(fā)現(xiàn)故障并通知相關(guān)人員,降低設(shè)備故障帶來(lái)的影響?今天我們將帶您了解虹科物聯(lián)網(wǎng)HMI如何發(fā)現(xiàn)設(shè)備故障,并第一時(shí)間
    的頭像 發(fā)表于 03-02 13:15 ?683次閱讀
    現(xiàn)場(chǎng)設(shè)備<b class='flag-5'>發(fā)生</b>故障,虹科物聯(lián)網(wǎng)HMI第<b class='flag-5'>一時(shí)間</b>通知相關(guān)人員?

    虹科方案 | 現(xiàn)場(chǎng)設(shè)備發(fā)生故障,如何第一時(shí)間通知相關(guān)人員?

    虹科IIoT現(xiàn)場(chǎng)設(shè)備發(fā)生故障,如何第一時(shí)間通知相關(guān)人員?虹科方案01前言虹科物聯(lián)網(wǎng)HMI作為站式物聯(lián)網(wǎng)解決方案,致力于解決用戶在數(shù)據(jù)采集和可視化、遠(yuǎn)程監(jiān)控、邊緣計(jì)算、軟PLC、數(shù)據(jù)存儲(chǔ)(SQL
    的頭像 發(fā)表于 03-29 15:41 ?1006次閱讀
    虹科方案 | 現(xiàn)場(chǎng)設(shè)備<b class='flag-5'>發(fā)生</b>故障,如何第<b class='flag-5'>一時(shí)間</b>通知相關(guān)人員?