一次驚險的Java 記憶體洩漏排查日誌
前些日子小組內安排值班,輪流看顧我們的服務,主要做一些報警郵件處理、Bug 排查、運營 issue 處理的事。 工作日還好,無論幹什麼都要上班的,若是輪到週末,那這一天算是毀了。
不知道是公司網路廣了就這程,好幾次值班組的小夥伴們一起吐槽,商量著怎麼避過服務保活機制,偷偷停了探測服務而不讓人發現(雖然也並不敢)。
前些天我就在周末處理了一次探測服務的鍋。
網路問題?
日本藤素官網 日本藤素藥局 日本藤素屈臣氏 日本藤素推薦 日本藤素種類 japan tengsu
日本藤素有哪些 日本藤素多少錢 日本藤素如何選 日本藤素故事 日本藤素是什麼 日本藤素防偽碼 日本藤素實體店
晚上七點多開始,我就開始不停地收到報警郵件,郵件顯示探測的幾個介面有超時情況。 多數執行棧都在:
這個線程棧的報錯我見得多了,我們設置的 HTTP DNS 超時是 1s, connect 超時是 2s, read 超時是 3s,這種報錯都是探測服務正常發送了 HTTP 請求,伺服器也在收到請求正常處理后正常回應了,但數據包在網路層層轉發中丟失了,所以請求線程的執行棧會停留在獲取介面回應的地方。 這種情況的典型特徵就是能在伺服器上查找到對應的日誌記錄。 而且日誌會顯示伺服器回應完全正常。 與它相對的還有線程棧停留在Socket connect 處的,這是在建連時就失敗了,服務端完全無感知。
我注意到其中一個介面報錯更頻繁一些,這個介面需要上傳一個 4M 的檔到伺服器,然後經過一連串的業務邏輯處理,再返回 2M 的文本數據,而其他的介面則是簡單的業務邏輯,我猜測可能是需要上傳下載的數據太多,所以超時導致丟包的概率也更大吧。
根據這個猜想,群登上伺服器,使用請求的 request_id 在近期服務日誌中搜索一下,果不其然,就是網路丟包問題導致的介面超時了。
當然這樣 leader 是不會滿意的,這個結論還得有人接鍋才行。 於是趕緊聯繫運維和網路組,向他們確認一下當時的網路狀態。 網路組同學回復說是我們探測服務所在機房的交換機老舊,存在未知的轉發瓶頸,正在優化,這讓我更放心了,於是在部門群裡簡單交待一下,算是完成任務
本以為這次值班就起這麼一個小波浪,結果在晚上八點多,各種介面的報警郵件蜂擁而至,打得準備收拾東西過周日單休的我措手不及。
日本藤素效果 日本藤素藥效 日本藤素作用 日本藤素吃法 日本藤素療程 日本藤素用法
這次幾乎所有的介面都在超時,而我們那個大量網路 I/O 的介面則是每次探測必超時,難道是整個機房故障了么。
我再次通過伺服器和監控看到各個介面的指標都很正常,自己測試了下介面也完全OK,既然不影響線上服務,我準備先通過探測服務的介面把探測任務停掉再慢慢排查。於是趕快登錄探測伺服器,首先是三連,結果還真發現了些異常。 top free
我們的探測進程 CPU 佔用率特別高,達到了 900%。
我們的 Java 進程,並不做大量 CPU 運算,正常情況下,CPU 應該在 100~200% 之間,出現這種 CPU 飆升的情況,要麼走到了死迴圈,要麼就是在做大量的 GC。
使用命令查看了java進程的 GC 狀態,果然,FULL GC 達到了每秒一次