成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

震驚!線上4臺機器同時OOM,到底發生了什么?

運維 系統運維
昨天晚上突然短信收到 APM 大量告警。緊接著運維打來電話告知線上部署的四臺機器全部 OOM (out of memory,內存不足),服務全部不可用,趕緊查看問題!

 昨天晚上突然短信收到 APM 大量告警。緊接著運維打來電話告知線上部署的四臺機器全部 OOM (out of memory,內存不足),服務全部不可用,趕緊查看問題!

[[285094]] 

圖片來自 Pexels

問題排查

首先運維先重啟了機器,保證線上服務可用,然后再仔細地看了下線上的日志,確實是因為 OOM 導致服務不可用:

 

第一時間想到 Dump 當時的內存狀態,但由于為了讓線上盡快恢復服務,運維重啟了機器,導致無法 Dump 出事發時的內存。所以我又看了下我們 APM 中對 JVM 的監控圖表。

畫外音:一種方式不行,嘗試另外的角度切入!再次強調,監控非常重要!完善的監控能還原當時的事發現場,方便定位問題。

 

不看不知道,一看嚇一跳,從 16:00 開始應用中創建的線程居然每時每刻都在上升,一直到 3W 左右,重啟后(藍色箭頭),線程也一直在不斷增長,正常情況下的線程數是多少呢,600!

問題找到了,應該是在下午 16:00 左右發了一段有問題的代碼,導致線程一直在創建,且創建的線程一直未消亡!

查看發布記錄,發現發布記錄只有這么一段可疑的代碼 diff:在 HttpClient 初始化的時候額外加了一個 evictExpiredConnections 配置。

 

問題定位了,應該就是這個配置導致的!(線程上升的時間點和發布時間點完全吻合!),于是先把這個新加的配置給干掉上線,上線之后線程數果然恢復正常了。

那 evictExpiredConnections 做了什么導致線程數每時每刻在上升呢?這個配置又是為了解決什么問題而加上的呢?于是找到了相關同事來了解加這個配置的前因后果。

還原事發經過

最近線上出現不少 NoHttpResponseException 的異常,那是什么導致了這個異常呢?在說這個問題之前我們得先了解一下 Http 的 keep-alive 機制。

先看下正常的一個 TCP 連接的生命周期:

 

可以看到每個 TCP 連接都要經過三次握手建立連接后才能發送數據,要經過四次揮手才能斷開連接。

如果每個 TCP 連接在 Server 返回 Response 后都立馬斷開,則發起多個 Http 請求就要多次創建斷開 TCP,這在 Http 請求很多的情況下無疑是很耗性能的。

如果在 Server 返回 Response 不立即斷開 TCP 鏈接,而是復用這條鏈接進行下一次的 Http 請求,則無形中省略了很多創建/斷開 TCP 的開銷,性能上無疑會有很大提升。

如下圖示,左圖是不復用 TCP 發起多個 Http 請求的情況,右圖是復用 TCP 的情況。

 

可以看到發起三次 Http 請求,復用 TCP 的話可以省去兩次建立/斷開 TCP 的開銷。

理論上發起一個應用只要啟一個 TCP 連接即可,其他 Http 請求都可以復用這個 TCP 連接,這樣 N 次 Http 請求可以省去 N-1 次創建 / 斷開 TCP 的開銷。這對性能的提升無疑是有巨大的幫助。

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

畫中音: Http 1.1 之后 keep-alive 才默認支持并開啟,不過目前大部分網站都用了 HTTP 1.1 了,也就是說大部分都默認支持鏈接復用了。

天下沒有免費的午餐 ,雖然 keep-alive 省去了很多不必要的握手/揮手操作,但由于連接長期保活,如果一直沒有 Http 請求的話,這條連接也就長期閑著了,會占用系統資源,有時反而會比復用連接帶來更大的性能消耗。

所以我們一般會為 keep-alive 設置一個 timeout,這樣如果連接在設置的 timeout 時間內一直處于空閑狀態(未發生任何數據傳輸),經過 timeout 時間后,連接就會釋放,就能節省系統開銷。

看起來給 keep-alive 加 timeout 是完美了,但是又引入了新的問題(一波已平,一波又起)。

考慮如下情況:如果服務端關閉連接,發送 FIN 包(注:在設置的 timeout 時間內服務端如果一直未收到客戶端的請求,服務端會主動發起帶 FIN 標志的請求以斷開連接釋放資源)。

在這個 FIN 包發送但是還未到達客戶端期間,客戶端如果繼續復用這個 TCP 連接發送 Http 請求報文的話,服務端會因為在四次揮手期間不接收報文而發送 RST 報文給客戶端。

客戶端收到 RST 報文就會提示異常(即NoHttpResponseException)。

我們再用流程圖仔細梳理一下上述這種產生 NoHttpResponseException 的原因,這樣能看得更明白一些:

 

費了這么大的功夫,我們終于知道了產生 NoHttpResponseException 的原因,那么該怎么解決呢?

有如下兩種策略:

  • 重試,收到異常后,重試一兩次,由于重試后客戶端會用有效的連接去請求,所以可以避免這種情況,不過一次要注意重試次數,避免引起雪崩!
  • 設置一個定時線程,定時清理上述的閑置連接,可以將這個定時時間設置為 keep alive timeout 時間的一半以保證超時前回收。

evictExpiredConnections 就是用的上述第二種策略,來看下官方用法使用說明:

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

調用這個方法只會產生一個定時線程,那為啥應用中線程會一直增加呢?因為我們對每一個請求都創建了一個 HttpClient!

這樣由于每一個 HttpClient 實例都會調用 evictExpiredConnections,導致有多少請求都會創建多少個定時線程!

還有一個問題,為啥線上四臺機器幾乎同一時間點全掛呢?因為由于負載均衡,這四臺機器的權重是一樣的,硬件配置也一樣,收到的請求其實也可以認為是差不多的。

這樣這四臺機器由于創建 HttpClient 而生成的后臺線程也在同一時間達到最高點,然后同時 OOM。

解決問題

所以針對以上提到的問題,我們首先把 HttpClient 改成了單例,這樣保證服務啟動后只會有一個定時清理線程。

另外我們也讓運維針對應用的線程數做了監控,如果超過某個閾值直接告警,這樣能在應用 OOM 前及時發現處理。

畫外音:再次強調,監控相當重要,能把問題扼殺在搖籃里!

總結

本文通過線上四臺機器同時 OOM 的現象,來詳細剖析定位了產生問題的原因。

可以看到我們在應用某個庫時首先要對這個庫要有充分的了解(上述 HttpClient 的創建不用單例顯然是個問題),其次必要的網絡知識還是需要的。

所以要成為一個合格的程序員,不光對語言本身有所了解,還要對網絡,數據庫等也要有所涉獵,這些對排查問題以及性能調優等會有非常大的幫助。

再次,完善的監控非常重要,通過觸發某個閾值提前告警,可以將問題扼殺在搖籃里!

 

責任編輯:武曉燕 來源: 碼海
相關推薦

2020-08-17 12:47:07

Mozilla裁員瀏覽器

2020-04-21 08:24:09

IO機器代碼

2019-11-12 14:41:41

Redis程序員Linux

2010-02-07 09:00:29

AndroidLinux Kerne

2023-03-10 08:24:27

OOMdump線程

2020-09-01 11:40:01

HTTPJavaTCP

2022-05-26 23:36:36

SQLMySQL數據

2020-10-09 08:59:55

輸入網址解密

2021-02-25 10:02:32

開機鍵Linux內存

2022-09-15 07:54:59

awaitPromise

2017-04-11 13:54:49

HTTPURLHTML

2025-04-27 08:11:26

2019-08-26 09:35:25

命令ping抓包

2020-07-28 23:22:35

制造業工業物聯網IIOT

2021-04-11 10:40:16

Git軟件開發

2021-01-18 08:23:23

內存時底層CPU

2023-08-29 16:26:20

Linux命令行

2015-07-03 09:27:43

網絡閏秒

2019-09-16 17:16:29

Hadoop數據湖數據結構

2022-06-03 08:12:52

InnoDB插入MySQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久高清精品 | 情侣av| 欧美日韩电影免费观看 | 日韩欧美中文字幕在线视频 | 日本a级大片 | 性欧美精品一区二区三区在线播放 | 国产精品久久久久久久粉嫩 | 亚洲视频在线一区 | 日本精品久久久一区二区三区 | 91av在线电影| 国产一二三区免费视频 | 国产欧美精品一区二区三区 | 亚洲一区二区三区免费视频 | 免费在线成人 | 久久久久久国产精品免费免费男同 | 国产91av视频在线观看 | 欧美日韩在线视频观看 | 在线看日韩 | 欧美日韩国产精品一区 | 99精品视频在线观看免费播放 | 97中文视频| 久久久久久国产精品三区 | 欧美日韩国产高清视频 | 久久99精品久久久久蜜桃tv | 四虎永久在线精品免费一区二 | 日韩在线一区二区三区 | 免费观看一级特黄欧美大片 | 99国产精品久久久久老师 | 看片wwwwwwwwwww| 成人黄色电影在线观看 | 亚洲精品久久久一区二区三区 | 超碰在线97国产 | 特级a欧美做爰片毛片 | 久久久久香蕉视频 | 国产精品美女久久久久久久网站 | 国产一区二区精品 | 久久国产欧美一区二区三区精品 | 毛片一区二区 | 国产精品久久久久久久久久 | 香蕉视频黄色 | 中文字幕视频一区二区 |