首页 > 系统相关 >K8s内存溢出问题剖析:排查与解决方案

K8s内存溢出问题剖析:排查与解决方案

时间:2024-11-27 18:05:09浏览次数:7  
标签:查看 排查 内存 cgroup memory nokmem K8s 目录

文章目录

一、背景

做redis压测过程中,发现paas环境的redis被OOMKill老是不断重启
在这里插入图片描述
Pod日志:
在这里插入图片描述

二、排查方案:

1. 可能是数据量超出了限制的大小,检查数据目录大小

2. 查看是否是内存溢出

开始排查

2.1 排查数据量(查看数据目录大小是否超过limit限制)

limit限制为64G 查到数据目录占用很少 忽略此问题
在这里插入图片描述

2.2 查看pod详情发现问题

在这里插入图片描述
为了更准确的定位问题,查看是否是内存泄露问题,查看系统参数(正常是没有输出)
在这里插入图片描述
确定是由于压测导致的Cgroup内存泄露问题
定位原因以后解决问题 :处理内存泄露问题(试了三个方案才得以解决)

三、解决过程

方案一:(修改grub文件)

  1. 修改/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
    追加到最后即可
  2. 生成配置: /usr/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg
  3. 重启机器: reboot
  4. 验证: cat /sys/fs/cgroup/memory/kubepods/burstable/pod*/*/memory.kmem.slabinfo 无输出即可。
  5. x版本cgroup.memory存在bug,docker或其他使用cgroup.memory中kmem功能的应用会造成slab内存泄漏 部分系统可以通过升级到4.x的修复版本来解决,或者通过 cgroup.memory=nokmem 启动项来规避。 部分系统不支持cgroup.memory=nokmem 启动项,可以通过 cgroup_disable=memory 启动项来规避。(此方案解决部分机器,并未全部解决)

方案二:(升级内核、Iaas建议)
由于服务器均为多系统,可以进行此操作
在这里插入图片描述
既然是 3.x 的问题,直接升级内核到 5.x 及以上即可,内核问题解释: https://github.com/torvalds/linux/commit/d6e0b7fa11862433773d986b5f995ffdf47ce672 https://support.mesosphere.com/s/article/Critical-Issue-KMEM-MSPH-2018-0006
这种方式的缺点是: 需要升级所有节点,节点重启的话已有 pod 肯定要漂移,如果节点规模很大,这个升级操作会很繁琐,业务部门也会有意见,要事先沟通。 这个问题归根结底是软件兼容问题,3.x 自己都说了不成熟,不建议你使用该特性,k8s、docker却 还要开启这个属性。(此方案并不奏效)

方案三:(grubby在线修改内核参数)
查看当前内核版本
在这里插入图片描述

--update-kernel 为当前内核版本文件
grubby --args=cgroup.memory=nokmem --update-kernel=/boot/vmlinuz-3.10.0-1160.el7.x86_64

重启主机 查看系统参数 (显示正常)
在这里插入图片描述
查看pod正常运行
在这里插入图片描述
附加知识点:(内存buff占用清理 -hcache)

wget https://silenceshell-1255345740.cos.ap-shanghai.myqcloud.com/hcache
chmod 755 hcache && mv hcache /usr/local/bin/
hcache --top 10

查看内存 free -h
在这里插入图片描述
buffers: 用于块设备数据缓冲,记录文件系统metadata(目录,权限,属性等)
cached: 用于文件内容的缓冲

分别查看
在这里插入图片描述
清理缓存

  1. 仅清除页面缓存(PageCache)
  2. sync; echo 1 > /proc/sys/vm/drop_caches
  3. 清除目录项和inode
  4. # sync; echo 2 > /proc/sys/vm/drop_caches
  5. 清除页面缓存,目录项和inode
  6. # sync; echo 3 > /proc/sys/vm/drop_caches

清理交换空间:swapoff -a && swapon -a

标签:查看,排查,内存,cgroup,memory,nokmem,K8s,目录
From: https://blog.csdn.net/qq_40477248/article/details/144052775

相关文章

  • C语言动态内存管理的讲解
    一、动态内存为何存在在动态内存管理之前,我们已经学过了在栈空间开辟内存的方式:inta=4;(在栈区开辟四个字节的空间)chararr[10];(在栈区开辟10个字节的连续空间)这些开辟空间的方式有两个特点:(1)空间开辟的大小是固定的;(2)数组在申明的时候,必须指定数组的长度,数组空间大小......
  • 编写linux脚本,监控jar包,内存溢出等报错时,重启程序
     #!/bin/bash#定义路径和变量JAR_PROCESS_NAME="java"JAR_FILE_PATH="/root/dfsz/jars/gw-dz-core.jar"#请确认此路径是你的Jar文件的实际路径LOG_FILE="/root/dfsz/jars/restartBash.log"#脚本日志文件FIND_LOG_FILE="/root/dfsz/jars/log.log"#要查......
  • 国标GB28181软件LiteGBS国标GB28181视频平台海康录像机外接报警输入和报警输出设备常
    LiteGBS国标GB28181视频平台在多个方面表现出色,兼容全平台、全终端。无论是在电脑网页端、移动设备的Android和iOS系统,还是其他各类智能终端上,用户都能轻松观看由LiteGBS分发的视频内容。分发格式更是多种多样,包括RTSP、HTTP-FLV、WS-FLV、HLS、WebRTC等,满足不同用户在不同场景下......
  • MySQL占用内存过高怎么办?【转】
    当GreatSQL数据库处于高并发高负载时,可能会发现 mysqld 进程的内存消耗远远超出设置的 innodb_buffer_pool_size 时,有时候甚至会高达甚至超过系统内存的90%,遇到这种问题时,心里经常会发慌,担心下一秒内存就会爆了发生OOM,或者数据库hang死不响应。本文和大家试着使用GreatSQ......
  • python 多进程multiprocessing 内存占用 物理内存 虚拟内存 windows 分析
     只有importtimetime.sleep(10) 前边加上fromtorch.utils.dataimportDataset   importtorch#检查是否支持CUDAiftorch.cuda.is_available():print("CUDAisavailable!")print(f"Devicecount:{torch.cuda.device_count()}")p......
  • GaussDB内存过载分析
    问题现象数据库进程内存占比较高长时间占比较高观察监控平台内存占用的变化曲线,无论当前数据库是否有业务在运行,数据库进程内存占总机器内存的比例长时间处于较高状态,且不下降。执行作业期间占比较高数据库进程在没有业务执行时,内存使用持续处于较低的状态,当有业务执行时,内......
  • 告别内存泄漏!深入掌握C++11智能指针的强大魔法
    文章目录前言......
  • 高性能框架Aeron的BufferPool和Java的内存池有什么区别?
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可......
  • k8s容器中的Java进程经常自动被杀
    故事背景主角:低代码项目时间:2023-08-29背景:项目通过jenkins部署k8s容器到虚拟机,在一次部署之后,服务发生无限重启的现象,springboot项目起来后没多久(甚至有几次还没启动)就会被杀掉进程,服务宕机了一个晚上。排查过程查看日志通过 kubeletlogs 命令查看服务运行日志,未发现任......
  • 在k8s集群中创建新的用户,绑定集群并实现访问集群资源
    ​为了让普通用户能够通过认证并调用API,需要执行几个步骤。首先,该用户必须拥有Kubernetes集群签发的证书,然后将该证书提供给KubernetesAPI。创建私钥下面的脚本展示了如何生成PKI私钥和CSR。设置CSR的CN和O属性很重要。CN是用户名,O是该用户归属的组......