K8s內(nèi)存溢出問題剖析之排查與解決過程
一、背景
做redis壓測過程中,發(fā)現(xiàn)paas環(huán)境的redis被OOMKill老是不斷重啟

Pod日志:

二、排查方案
1. 可能是數(shù)據(jù)量超出了限制的大小
檢查數(shù)據(jù)目錄大小
2. 查看是否是內(nèi)存溢出
開始排查
2.1 排查數(shù)據(jù)量(查看數(shù)據(jù)目錄大小是否超過limit限制)
limit限制為64G 查到數(shù)據(jù)目錄占用很少 忽略此問題

2.2 查看pod詳情發(fā)現(xiàn)問題

為了更準(zhǔn)確的定位問題,查看是否是內(nèi)存泄露問題,查看系統(tǒng)參數(shù)(正常是沒有輸出)

確定是由于壓測導(dǎo)致的Cgroup內(nèi)存泄露問題
定位原因以后解決問題 :處理內(nèi)存泄露問題(試了三個方案才得以解決)
三、解決過程
方案一:(修改grub文件)
- 修改/etc/default/grub 為:
GRUB_CMDLINE_LINUX=“crashkernel=auto net.ifnames=0 biosdevname=0 intel_pstate=disable cgroup.memory=nokmem”
是追加
GRUB_CMDLINE_LINUX=“console=tty0 console=ttyS0 crashkernel=512M-2G:128M,2G:512M rd.lvm.lv=bel/root rhgb quiet cgroup.memory=nokmem” 把 cgroup.memory=nokmem
追加到最后即可
- 生成配置:
/usr/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg
- 重啟機(jī)器:
reboot
- 驗(yàn)證:
cat /sys/fs/cgroup/memory/kubepods/burstable/pod*/*/memory.kmem.slabinfo 無輸出即可。
x版本cgroup.memory存在bug,docker或其他使用cgroup.memory中kmem功能的應(yīng)用會造成slab內(nèi)存泄漏 部分系統(tǒng)可以通過升級到4.x的修復(fù)版本來解決,或者通過 cgroup.memory=nokmem 啟動項(xiàng)來規(guī)避。 部分系統(tǒng)不支持cgroup.memory=nokmem 啟動項(xiàng),可以通過 cgroup_disable=memory 啟動項(xiàng)來規(guī)避。(此方案解決部分機(jī)器,并未全部解決)
方案二:(升級內(nèi)核、Iaas建議)
由于服務(wù)器均為多系統(tǒng),可以進(jìn)行此操作

既然是 3.x 的問題,直接升級內(nèi)核到 5.x 及以上即可,內(nèi)核問題解釋:
https://github.com/torvalds/linux/commit/d6e0b7fa11862433773d986b5f995ffdf47ce672
https://support.mesosphere.com/s/article/Critical-Issue-KMEM-MSPH-2018-0006
這種方式的缺點(diǎn)是: 需要升級所有節(jié)點(diǎn),節(jié)點(diǎn)重啟的話已有 pod 肯定要漂移,如果節(jié)點(diǎn)規(guī)模很大,這個升級操作會很繁瑣,業(yè)務(wù)部門也會有意見,要事先溝通。
這個問題歸根結(jié)底是軟件兼容問題,3.x 自己都說了不成熟,不建議你使用該特性,k8s、docker卻 還要開啟這個屬性。(此方案并不奏效)
方案三:(grubby在線修改內(nèi)核參數(shù))
查看當(dāng)前內(nèi)核版本

--update-kernel 為當(dāng)前內(nèi)核版本文件 grubby --args=cgroup.memory=nokmem --update-kernel=/boot/vmlinuz-3.10.0-1160.el7.x86_64
重啟主機(jī) 查看系統(tǒng)參數(shù) (顯示正常)

查看pod正常運(yùn)行

附加知識點(diǎn):(內(nèi)存buff占用清理 -hcache)
wget https://silenceshell-1255345740.cos.ap-shanghai.myqcloud.com/hcache chmod 755 hcache && mv hcache /usr/local/bin/ hcache --top 10
查看內(nèi)存 free -h

- buffers: 用于塊設(shè)備數(shù)據(jù)緩沖,記錄文件系統(tǒng)metadata(目錄,權(quán)限,屬性等)
- cached: 用于文件內(nèi)容的緩沖
分別查看

清理緩存
僅清除頁面緩存(PageCache)
sync; echo 1 > /proc/sys/vm/drop_caches
清除目錄項(xiàng)和inode
# sync; echo 2 > /proc/sys/vm/drop_caches
清除頁面緩存,目錄項(xiàng)和inode
# sync; echo 3 > /proc/sys/vm/drop_caches
清理交換空間:
swapoff -a && swapon -a
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Kubernetes?權(quán)限管理認(rèn)證鑒權(quán)詳解
這篇文章主要為大家介紹了Kubernetes?權(quán)限管理認(rèn)證鑒權(quán)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
阿里云kubernetes查找鏡像中jar包的方法(docker查看鏡像中的jar)
這篇文章主要給大家介紹了關(guān)于阿里云kubernetes查找鏡像中jar包的方法,也就是在docker查看鏡像中的jar,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
ES業(yè)務(wù)數(shù)據(jù)遷移遇到的精度問題BUG
這篇文章主要為大家介紹了ES業(yè)務(wù)數(shù)據(jù)遷移遇到的BUG精度問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Rainbond使用Dockerfile構(gòu)建便捷應(yīng)用運(yùn)行流程
這篇文章主要為大家介紹了Rainbond使用Dockerfile構(gòu)建便捷應(yīng)用運(yùn)行流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
K8s集群中的DNS服務(wù)CoreDNS實(shí)戰(zhàn)案例詳解
在 Kubernetes(K8s)中,DNS 服務(wù)是實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和 Pod 通信的核心組件之一,用于解決集群內(nèi)資源通過域名而非 IP 地址進(jìn)行訪問的需求,本文將詳細(xì)解析 K8s DNS 服務(wù)的原理、組件、配置及應(yīng)用場景,感興趣的朋友一起看看吧2025-06-06
K8s部署Nginx集群,通過Ingress實(shí)現(xiàn)HTTPS域名訪問過程
文章主要介紹了如何使用Ingress控制器和Nginx服務(wù)來實(shí)現(xiàn)HTTP到HTTPS的強(qiáng)制重定向,并解釋了Ingress控制器如何處理TLS終止和流量路由,通過配置Ingress和Nginx服務(wù),可以確保所有流量都通過HTTPS訪問,從而提高安全性2026-01-01

