來這公司一年碰到的問題比我過去10年都多
來源:艾小仙
無意間發現我們 Kafka 管理平臺的服務的 open files 和 CPU 監控異常,如下圖,有一臺機器 CPU 和 opfen files 指標持續在高位,尤其是 open files 達到了4w+。
原因分析
第一反應是這個服務請求很高?但是這個服務是一個管理服務不應該有很高的請求量才對,開啟監控一看,QPS少的可憐。
既然機器還在就找 devops 同學幫忙使用 Arthas 簡單看下是什麼執行緒導致的,竟然是 GC 執行緒,瞬時 CPU 幾乎打滿了。
檢視了 GC 監控,每分鐘 5~6 次相比其他的正常節點要多很多,並且耗時很長。
問題節點GC Count
正常節點GC Count
應該是程式碼出問題了,繼續求助 devops 將線上有問題的機器拉了一份 dump,使用 MAT 工具分析了下,開啟 dump 就提示了兩個風險點,兩個都像是指標相關的物件。
檢視詳情發現兩個可疑物件,一個是 60+M 的 byte[], 一個是 60+M 的 map,都是指標相關的物件,問題應該出在指標上。
初步去排查了下程式碼,看是否有自定義指標之類的,發現一個 job 會對指標進行操作,就把 job 停了一段時間,GC 少了很多,但是 open files 只減少了一點點, 很明顯不是根本原因。
繼續深入,將 byte[] 儲存成字串檢視(確實文字也有60+M),發現全是 JMX 的指標資料,我們的系統使用了兩種指標一種是Micrometer,一種是 prometheus-jmx-exporter,這個 byte[] 陣列就是第二種指標的資料。
並且這些指標中發現有非常多的 kafka_producer 開頭的指標。
為了驗證是否屬於 JMX 的指標資料,再次求助 devops 拉取線上有問題機器的 JMX 指標介面, 看返回的是否是 60M+ 的指標資料,發現根本拉不下來。
到此基本確認問題出在 JMX 指標上, 那這些指標誰註冊的呢?
透過指標名稱在原始碼裡搜尋,發現是來自org.apache.kafka.common.network.Selector.SelectorMetrics
,是 kafka-client
註冊的指標。
具體的建立順序如下,每建立一個KafkaProducer
,就會以 client id 為唯一標識建立一個SelectorMetrics
, 而建立 KafkaProducer 會建立一個守護執行緒,並開啟一個長連線定時去 Broker 拉取/更新 Metadata 資訊,這個就是open files飆高的根本原因。
KafkaProducer -> Sender -> Selector -> SelectorMetrics
難道建立了很多 KafkaProducer???檢視構造方法呼叫的地方,找到了真兇。。。
這段程式碼是為了支援延遲訊息,業務服務每發一個延遲訊息,就會執行一次這段邏輯, 就會建立一個 KafkaProducer,並且會隨著收到的訊息越來越多導致建立的 KafkaProducer 越來越多,直至系統無法承受。。。
慶幸的是我們延遲訊息並不是太多,沒有直接把系統給打掛掉
那為什麼只有一個節點會有問題,其他節點沒有問題呢?這個比較簡單直接說結果了,就是這段消費邏輯消費的 topic 只有一個分割槽....
解決方案:
由於 Kafka 管理平臺會連線多個 Broker,所以此處將建立的 KafkaProducer 根據 Cluster 快取起來進行復用。
問題總結:
1. KafkaProducer 本身是一個很重的物件,並且執行緒安全,建立的時候注意考慮場景
2. 此次問題完全是憑運氣提前發現了,證明監控系統也存在不夠完善的地方, 我們使用 Prometheus 的標準差函式 (stddev() by()) 配置了資源嚴重傾斜的監控告警,防止出現類似的問題。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027827/viewspace-2950387/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 直白點,這些公司問題大,別去!
- webpack碰到的問題Web
- Hodoop碰到的問題628OdooOOP
- 加殼上碰到的問題
- iOS 越獄後碰到的問題iOS
- 邦芒面試:這10個問題都答不上來,你還想透過面試?面試
- PHPer 請下來好好過一看過去 PHP、Java、Go都發生過什麼?這對於未來的發展很重要PHPJavaGo
- 過半數公司過去一年中發生過雲服務資料洩露事件事件
- 使用vue-server-render時碰到的問題VueServer
- BATJ都愛問的多執行緒面試題BAT執行緒面試題
- 有誰比我髮量多的嗎
- 面試 HTTP ,99% 的面試官都愛問這些問題面試HTTP
- 一年就這樣過去了,亦不知來年會如何
- 00後現在都這麼強的嗎,公司新來的Java開發,這操作不服不行Java
- 初學者學習Rust容易碰到的問題 - timRust
- 記錄一次XTTS遷移碰到的問題TTS
- JAVA:Java基礎-敲程式碼碰到的小問題Java
- 公司要給大家更改交社保的公司,這個是啥情況,過來人來說說
- 這家公司何以做到“1款遊戲收入頂過去100款”?遊戲
- 70 個群都來問我的 AI 日報,是這麼做的。AI
- Airbnb招股書:首次披露過去一年的跌宕業績AI
- 為什麼過去的一年多裡,Steam上的國產遊戲爆款變少了?遊戲
- 打Oracle PSU時碰到的一些問題處理Oracle
- React小知識(3) - 國際化中碰到的問題React
- 工作中碰到的Java問題整理及解決方案Java
- 上週我面了個三年 Javaer,這幾個問題都沒答出來Java
- 又是一年雙十一,不同段位的IDC人都怎麼過?
- 如何透過CRM解決公司業績下滑的問題
- 搞iOS的,面試官問Hash幹嘛?原因遠比我下面要介紹的多iOS面試
- SEO公司來解決網站上容易發現的問題網站
- RTS的過去,現在和未來
- 無依賴開發中的碰到的問題——封裝DOM操作封裝
- 安裝oracle11g碰到“無法訪問臨時位置”的問題Oracle
- 所有的PHP面試題,職場問題都整理在這裡了,來年(2021年)面試的時候有用PHP面試題
- Morning Consult報告:向前看—過去一年大流行的影響及未來發展
- 細數這些年被困擾過的 TS 問題
- 90%的微控制器初學者,都會遇到這些問題
- 2022-過去與未來