当前位置: 首页 > news >正文

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

文章目录

  • 一、背景
  • 二、排查方案:
    • 1. 可能是数据量超出了限制的大小,检查数据目录大小
    • 2. 查看是否是内存溢出
      • 2.1 排查数据量(查看数据目录大小是否超过limit限制)
      • 2.2 查看pod详情发现问题
  • 三、解决过程

一、背景

做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

http://www.lryc.cn/news/492612.html

相关文章:

  • 乌班图单机(不访问外网)部署docker和服务的方法
  • 使用 pycharm 新建使用 conda 虚拟 python 环境的工程
  • Docker的save和export命令的区别,load和import的区别 笔记241124
  • 通俗理解人工智能、机器学习和深度学习的关系
  • 使用 pycharm 新建不使用 python 虚拟环境( venv、conda )的工程
  • 【大数据学习 | Spark-SQL】SparkSQL读写数据
  • AI赋能公共服务转型升级 | 第十届中国行业互联网大会暨腾讯云TVP行业大使三周年庆典公共服务专场圆满举办!
  • 关于按天切割Tomcat的catalina.out日志文件的配置
  • 【人工智能】深入解析GPT、BERT与Transformer模型|从原理到应用的完整教程
  • 彻底理解如何保证ElasticSearch和数据库数据一致性问题
  • 2024-2025热门留学趋势
  • 寻找视频特效素材的优质网站推荐 轻松提升作品魅力
  • 【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-36
  • 信息安全实验--密码学实验工具:CrypTool
  • python的class 类创建、方法调用以及属性赋值
  • Angular v19 (二):响应式当红实现signal的详细介绍:它擅长做什么、不能做什么?以及与vue、svelte、react等框架的响应式实现对比
  • IMX 平台UART驱动情景分析:write篇--从 TTY 层到硬件驱动的写操作流程解析
  • 网络安全拟态防御技术
  • 灵活开源低代码平台——Microi吾码(一)
  • frida_hook_libart(简单解释)
  • 计算机网络八股整理(二)
  • 强化学习off-policy进化之路(PPO->DPO->KTO->ODPO->ORPO->simPO)
  • Linux 如何创建逻辑卷并使用
  • java实现将图片插入word文档
  • 初识java(3)
  • coqui-ai TTS 初步使用
  • matlab代码--卷积神经网络的手写数字识别
  • Scala—Map用法详解
  • 极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【六】
  • ES6 、ESNext 规范、编译工具babel