來這公司一年碰到的問題比我過去10年都多
來源:艾小仙
無意間發現我們 Kafka 管理平臺的服務的 open files 和 CPU 監控異常,如下圖,有一臺機器 CPU 和 opfen files 指標持續在高位,尤其是 open files 達到了4w+。
![null 來這公司一年碰到的問題比我過去10年都多](https://i.iter01.com/images/2ec024599e293e05496fa48140c438d0a5aeb62e7bd28ae61ccc4b191ce4d57a.png)
![null 來這公司一年碰到的問題比我過去10年都多](https://i.iter01.com/images/5d4e761b0b7bb6febd56b6b06774c5164341a7b63746cfff433440c42e9fd74f.png)
原因分析
第一反應是這個服務請求很高?但是這個服務是一個管理服務不應該有很高的請求量才對,開啟監控一看,QPS少的可憐。
![null 來這公司一年碰到的問題比我過去10年都多](https://i.iter01.com/images/d3c3cef93d6a343b4e23af754fb7d082fd0ff642945645ea96d4959d3a2f2d1c.png)
既然機器還在就找 devops 同學幫忙使用 Arthas 簡單看下是什麼執行緒導致的,竟然是 GC 執行緒,瞬時 CPU 幾乎打滿了。
![null 來這公司一年碰到的問題比我過去10年都多](https://i.iter01.com/images/d511debeaa327c2107648eb1c9a53b3ca8a11e047a419fbab3615ca4f9b656c6.jpg)
檢視了 GC 監控,每分鐘 5~6 次相比其他的正常節點要多很多,並且耗時很長。
問題節點GC Count
![null 來這公司一年碰到的問題比我過去10年都多](https://i.iter01.com/images/71b1054fa6151b11f633abbadf918a33171f41362d35a05a0c75282b4e43b5cf.jpg)
正常節點GC Count
![null 來這公司一年碰到的問題比我過去10年都多](https://i.iter01.com/images/369e28ec406b703293a9ea7fab093370575de520c3c3ba8bb8758b7f535b2d46.jpg)
應該是程式碼出問題了,繼續求助 devops 將線上有問題的機器拉了一份 dump,使用 MAT 工具分析了下,開啟 dump 就提示了兩個風險點,兩個都像是指標相關的物件。
![null 來這公司一年碰到的問題比我過去10年都多](https://i.iter01.com/images/9fc9891422ad8415c082bcc1bd2510a37d5afa116e1334c78424af205f01bb65.jpg)
檢視詳情發現兩個可疑物件,一個是 60+M 的 byte[], 一個是 60+M 的 map,都是指標相關的物件,問題應該出在指標上。
![null 來這公司一年碰到的問題比我過去10年都多](https://i.iter01.com/images/09c80cec0d4547591c8641d767eb65f66ca0738e35f2fd60c99c4f48d10a5bc5.jpg)
初步去排查了下程式碼,看是否有自定義指標之類的,發現一個 job 會對指標進行操作,就把 job 停了一段時間,GC 少了很多,但是 open files 只減少了一點點, 很明顯不是根本原因。
![null 來這公司一年碰到的問題比我過去10年都多](https://i.iter01.com/images/c507b08a2a7e283a07db9ac0b11262e7d05da252aeedf41ed14ae86c8503e7bc.png)
![null 來這公司一年碰到的問題比我過去10年都多](https://i.iter01.com/images/0185e104348d23f9f5419a4ea4c337aaa6a93aa4d2ddb9f873bf85b74cf56906.png)
繼續深入,將 byte[] 儲存成字串檢視(確實文字也有60+M),發現全是 JMX 的指標資料,我們的系統使用了兩種指標一種是Micrometer,一種是 prometheus-jmx-exporter,這個 byte[] 陣列就是第二種指標的資料。
![null 來這公司一年碰到的問題比我過去10年都多](https://i.iter01.com/images/8f0083aa80d230c919401a0f047c06641953e230614714b1307f350b09e0a4cc.jpg)
並且這些指標中發現有非常多的 kafka_producer 開頭的指標。
![null 來這公司一年碰到的問題比我過去10年都多](https://i.iter01.com/images/9e5102735063ec89ab89c20d4e1545e4845db77f60ef981f39aa5f5b29b9c6d3.jpg)
為了驗證是否屬於 JMX 的指標資料,再次求助 devops 拉取線上有問題機器的 JMX 指標介面, 看返回的是否是 60M+ 的指標資料,發現根本拉不下來。
![null 來這公司一年碰到的問題比我過去10年都多](https://i.iter01.com/images/1833c6c77ef6443b71df5b7d52d20f162fd64bc72404c2168c7db62da2687211.jpg)
到此基本確認問題出在 JMX 指標上, 那這些指標誰註冊的呢?
透過指標名稱在原始碼裡搜尋,發現是來自org.apache.kafka.common.network.Selector.SelectorMetrics
,是 kafka-client
註冊的指標。
具體的建立順序如下,每建立一個KafkaProducer
,就會以 client id 為唯一標識建立一個SelectorMetrics
, 而建立 KafkaProducer 會建立一個守護執行緒,並開啟一個長連線定時去 Broker 拉取/更新 Metadata 資訊,這個就是open files飆高的根本原因。
KafkaProducer -> Sender -> Selector -> SelectorMetrics
![null 來這公司一年碰到的問題比我過去10年都多](https://i.iter01.com/images/956a25d3f84c814cf1b7e7f5824289858a1c11f405f8eeb8bb51e5ba586819ec.jpg)
難道建立了很多 KafkaProducer???檢視構造方法呼叫的地方,找到了真兇。。。
![null 來這公司一年碰到的問題比我過去10年都多](https://i.iter01.com/images/750071d9ff78d1d17e23427b89c6c648e75a91371890037b2a245aba19e14a4d.png)
這段程式碼是為了支援延遲訊息,業務服務每發一個延遲訊息,就會執行一次這段邏輯, 就會建立一個 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
- 一年就這樣過去了,亦不知來年會如何
- JAVA:Java基礎-敲程式碼碰到的小問題Java
- 記錄一次XTTS遷移碰到的問題TTS
- 初學者學習Rust容易碰到的問題 - timRust
- 00後現在都這麼強的嗎,公司新來的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面試
- 無依賴開發中的碰到的問題——封裝DOM操作封裝
- SEO公司來解決網站上容易發現的問題網站
- 安裝oracle11g碰到“無法訪問臨時位置”的問題Oracle
- RTS的過去,現在和未來
- 所有的PHP面試題,職場問題都整理在這裡了,來年(2021年)面試的時候有用PHP面試題
- Morning Consult報告:向前看—過去一年大流行的影響及未來發展
- 細數這些年被困擾過的 TS 問題
- 90%的微控制器初學者,都會遇到這些問題
- 2022-過去與未來