生產環境,我們使用rancher k8s部署我們的服務,有個服務(具體我這裡就不說了),在晚上8點左右,因為這個服務的記憶體溢位導致了其他服務出現了異常,在8點的時候,客戶頻繁投訴,後面排查發現是有個服務記憶體洩露。通過grafana圖形觀察,可以明顯看到其實這個服務在早市11點左右其實已經記憶體洩露,只是當時客戶並沒有發現。
因為生產已經掛了,當時我們進入服務的pod中簡單執行如下命令。不要問為什麼這麼做,其實這個記憶體洩露問題已經出現過幾次了,但是不知道問題點在哪,剛好這次復現,就趕緊找到罪魁禍首
jps -lm
jmap -histo 6|
head -20
先找到占用記憶體最大的實體類
有
還好,當時這個服務用到的finebiequipmentfeign比較集中,這個是提供資料給報表服務用的。
找到**如下
/***
* type:1.裝置歷史引數查詢報表 2.裝置歷史引數查詢趨勢圖
* @return
*/(value =
"/selectitem"
public responseentity selectitem
(@requestbody finebiequipmentquery finebiquery)
"+ finebiquery.
getendtime()
);log.
info
("getbegintime*****===={}"
+ finebiquery.
getbegintime()
);long period =
(long.
parselong
(finebiquery.
getendtime()
)- long.
parselong
(finebiquery.
getbegintime()
))/1000
; log.
info
("period*****===={}"
+ period)
; map
maps =
newhashmap
<
>(16
);******dateformat sf =
new******dateformat
("yyyy-mm-dd hh:mm:ss");
log.
info
("finebiquery*****===={}"
+ jsonutil.
tojsonstr
(finebiquery));
list
list = finebiservice.
selectalltype
(finebiquery)
; log.
info
("list**********={}"
+ list.
tostring()
);list
maplist =
newarraylist
<
>(16
);list
synchronizedlist = collections.
synchronizedlist
(maplist)
;long starttime = system.
nanotime()
; list.
parallelstream()
.foreach
(infolist -
>
; map.
put(
"paramids"
, deviceparmaids)
; map.
put(
"deviceid"
, infolist.
getdevice_id()
);map.
put(
"period"
, period)
; map.
put(
"endts"
, long.
parselong
(finebiquery.
getendtime()
)); jsonarray.
add(map)
;//第三方api介面(本場景為外調介面,根據公司框架和業務自行修改)
("查詢耗時:"
+(endtime - starttime)
/1000
/1000);
log.
info
("總共:"
+ result.
size()
+"條資料*************************==>");
log.
info
("result:{}"
, jsonutil.
tojsonstr
(result));
maps.
put(
"records"
, result)
;return
successresult
(maps);}
catch
(exception e)
", e)
;return
errorresult();}}
最開始肉眼看**,沒有看出什麼問題
後面實在沒有辦法,最開始在sit環境測試想復現這個問題,後面發現還是不行。因為sit沒有資料上報的資料,資料量不夠,所以在直接在uat環境上測試。經過測試只要報表查詢資料量足夠大,就會導致堆疊溢位。
在記憶體溢位後,在檢視堆疊中物件大小排名,明細看到物件已經被釋放掉,所以說明**是沒有問題的。真正的問題,是資料量大,導致一直往synchronizedlist集合存放資料,導致的記憶體溢位
Redis 生產事件排查
日誌告警 oom command not allowed when used memory 大綱 設定maxmemory和相對應的 策略演算法,設定最好為物理記憶體的3 4,或者比例更小,因為redis複製資料等其他服務時,也是需要快取的。以防快取資料過大致使redis崩潰,造成系統出錯不可用。通過...
記一次Pytorch記憶體洩露的排查與處理
模型訓練過程中記憶體占用不斷增加,訓練到30000輪左右已經占用到200g記憶體.查詢了網上的一些記憶體洩漏排查方法,使用了memory profiler objgraph pympler這三個工具進行排查 參考鏈結如下 pytorch超出記憶體 pytorch記憶體洩漏分析案例 list轉tens...
記憶體洩露檢測
c 中檢測記憶體洩漏可以引入系統定義的巨集來檢視,內存在哪個位置洩漏 檔案開始處加入下列定義 define crtdbg map alloc include include 程式退出時加入以下函式 crtdumpmemoryleaks 如果有洩漏會顯示 記憶體洩漏是程式設計中常常見到的乙個問題,我所...