kubernetes上报Pod已用内存不准问题分析

1.问题描述:

经常有业务反馈在使用容器云平台过程中监控展示的业务使用内存不准,分析了下kubernetes采集Pod内存使用的实现原理以及相应的解决思路

2.问题分析:

2.1 问题排查:

监控数据是采集的kubernetes上报的container_memory_working_set_bytes字段:

分析kubernetes代码可以看到container_memory_working_set_bytes是取自cgroup memory.usage_in_bytes 与memory.stat total_inactive_file两者的差值:

分析内核代码发现memory.usage_in_bytes的统计数据是包含了所有的file cache的, total_active_file和total_inactive_file都属于file cache的一部分,并且这两个数据并不是业务真正占用的内存,只是系统为了提高业务的访问IO的效率,将读写过的文件缓存在内存中,file cache并不会随着进程退出而释放,只会当容器销毁或者系统内存不足时才会由系统自动回收。

__add_to_page_cache_locked..->mem_cgroup_cache_charge->mem_cgroup_charge_common->__mem_cgroup_try_charge->mem_cgroup_do_charge

综上分析,kubernetes采用memory.usage_in_bytes – total_inactive_file并不能真正计算出Pod实际已使用的内存空间,当Pod内存资源紧张时total_active_file也是可回收利用的。

2.2 验证分析结论:

通过下面例子可以验证上面的分析:

cgcreate -g memory:test-docker-memory

docker run –cgroup-parent=/test-docker-memory –net=none -v /root/test_mem:/test -idt –name test –privileged csighub.tencentyun.com/admin/tlinux2.2-bridge-tcloud-underlay:latest

memory.stat统计数据total_inactive_file增加580多M:

此时total_inactive_file的统计数据会将message文件占用的内存转为total_active_file

3 解决方法:

3.1 Linux 如何计算free内存

要解决该问题先要了解内核是如何统计free内存的,从下面代码可以知道内核计算空闲内存方法如下(容器平台未使用swap):

NR_FREE_PAGES + NR_FILE_PAGES – NR_SHMEM_PAGES + NR_SLAB_RECLAIMABLE

从下列代码可以知道NR_FILE_PAGES在无swap的情况下包含cache pages和buffer pages:

因此有效内存可以通过转化为cgroup memory.meminfo对应字段计算得出:

available = MemFree+ Cached- Shmem + Buffers+ SReclaimable)

3.2 Cgroup的真实使用内存如何计算?

由于cgroup当前并未提供memory.meminfo的统计信息,所以kubernetes无法通过

该公式获取Pod所在的cgroup已使用内存。

Cgroup当前提供了memory.stat和memory.usage_in_bytes的统计信息,看下如何将memory.meminfo的计算方法转为memory.stat的计算公式:

因为”Shmem”(即IPCS shared memory & tmpfs)包含在Cached中,而不在Active(file)和Inactive(file)中,并且Active(file)和Inactive(file)还包含Buffers。另外mem lock的内存不在LRU链表中,所以如果有mlock的话,得出如下等式(mlock包括file和anon两部分,/proc/meminfo中并未分开统计,下面的mlock_file只是用来表意,实际并没有这个统计值):

【Active(file) + Inactive(file) + Shmem + mlock_file】== 【Cached + Buffers】

memory.usage_in_bytes统计包含了Cached和Buffers,Cached中除了mlock_file和Shmem(IPCS shared memory & tmpfs)外,其他部分File cache是可以回收使用的,Buffers也是可以回收利用的,所以pod容器所在cgroup实际使用的内存计算公式可以转化为(因memory.stat未导出SReclaimable,这里忽略SReclaimable):

real_used = memory.usage_in_bytes – (Cached- Shmem – mlock_file + Buffers )

= memory.usage_in_bytes – memory.stat .( total_inactive_file + total_active_file )

因此kubernetes container_memory_working_set_bytes字段在计算实际已使用内存时应该改为

memory.usage_in_bytes – memory.stat .( total_inactive_file + total_active_file )

附录:

Cache包含ipcs shm和tmpfs内存验证:

1.运行申请tmpfs和ipcs shm共享内存前读取当前memory.stat数据:

  1. 拷贝一个580M左右的文件到tmpfs挂载点/run占用580M的共享内存,运行IPCS 测试程序申请一段300M的ipcs shm:

Tmpfs + ipcs shm = 582349583+314572800 = 896922383

3.再次查看memory.stat的total_cache,增加的值约等于步骤2中tmpfs和ipcs shm增加的内存使用值:

Added total_cache = 1077981184 – 181751808 = 896229376

ipcs shm测试代码:

cat test_shm.c

include

include

include

include

include

include

include

include

define LEN (30010241024)

static char buf[LEN] = {0};

int main(int agrc, char *argv[])

{

key_t key = 888999;

int shmid = shmget(key, LEN, IPC_CREAT | IPC_EXCL);

if(shmid == -1)

{

printf(“shmget err: %d %s\n”, errno, strerror(errno));

return -1;

}

void *p = shmat(shmid, NULL, SHM_R | SHM_W);

if (p == NULL)

{

printf(“shmat failed\n”);

return -1;

}

//shmctl(shmid, IPC_RMID, 0);

printf(“first shmid: %d p: %p\n”, shmid, p);

memset(p, ‘a’, LEN-1);

p = shmat(shmid, NULL, SHM_R | SHM_W);

if (p == NULL)

{

printf(“shmat xx failed\n”);

return -1;

}

memcpy(buf, p, LEN-1);

printf(“second shmid: %d p: %p\n”, shmid, p);

getchar();

shmctl(shmid, IPC_RMID, 0);

}

Original: https://www.cnblogs.com/exmyth/p/16409584.html
Author: 牧之丨
Title: kubernetes上报Pod已用内存不准问题分析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/546266/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SQL语句之if,case

    其他函数 、 case 语句 聚合函数max() , min() , avg() , sum() , count () if( bool表达式 , expr1 , expr2 )如…

    技术杂谈 2023年7月25日
    086
  • Python人员信息管理系统(简直期末人福音)

    ​ 1. 涉及模块 datetime os random sys PyQt5 运行效果 支持功能: 添加信息 修改信息 删除信息 查询信息 文件存储数据,每次运行都会加载显示之前的…

    技术杂谈 2023年6月21日
    085
  • Ruby系列文章

    骏马金龙 (博客已搬家:www.junmajinlong.com) 网名骏马金龙,钟情于IT世界里的各种原理和实现机制,强迫症重症患者。爱研究、爱翻译、爱分享。特借此一亩三分田记录…

    技术杂谈 2023年5月31日
    0104
  • shell find 根据时间获取文件列表

    shell find 以时间为条件查找获取文件列表 根据时间得到文件,可以使用 find进行查找,支持查找: find以时间为条件查找可用选项: -amin n:查找n分钟以前被访…

    技术杂谈 2023年7月25日
    058
  • Servlet Interface

    Servlet Interface Servlet接口是Java Servlet API 核心抽象接口。大多数Servlet实现直接实现Servlet接口,或者是继承已经实现Ser…

    技术杂谈 2023年7月25日
    074
  • windows 与ipad同步剪切板

    windows 下载:https://github.com/YanxinTang/clipboard-online/releases ,默认启动8060端口 ios快捷指令: 获取…

    技术杂谈 2023年5月31日
    071
  • OO第四单元&课程总总结

    OO第四单元&课程总总结 时刻提醒自己不能跑题完结撒花 OO第四单元&课程总总结 架构介绍 + 类图 顺序图 状态图 关于算法 设计思维 与 OO理解演进 封装与解…

    技术杂谈 2023年7月25日
    069
  • HashMap原理及源码分析

    HashMap 原理及源码分析 1. 存储结构 HashMap 内部是由 Node 类型的数组实现的。 Node 包含着键值对,内部有四个字段,从 next 字段我们可以看出, N…

    技术杂谈 2023年7月24日
    073
  • 背包问题(上)

    2. 01背包问题 有 (N) 件物品和一个容量是 (V) 的背包。每件物品只能使用一次。第 (i) 件物品的体积是 (v_i),价值是 (w_i)。求解将哪些物品装入背包,可使这…

    技术杂谈 2023年6月21日
    0108
  • python PDF转图片,World转PDF

    个人博客地址 http://www.darkghost.life 软件不用续费了。。。 PDF转World暂时没需求,有需求了再搞 Python3.9 1 import tkint…

    技术杂谈 2023年7月25日
    069
  • 「猪齿鱼」助力汉得信息智能制造集中交付高效协同

    导语 IT咨询行业面临着人天单价难以提高,而员工待遇和营运成本持续提升的压力,这大大压缩了咨询公司的利润空间,逼迫着咨询公司要想办法提高项目的交付效率,进行业务模式的变革。采用远程…

    技术杂谈 2023年7月24日
    0109
  • C#实现无物理边距 可打印区域的绘图打印 z

    经常在开发实际的应用程序中,需要用到图形绘制和打印程序。如何实现完整的精确打印和绘图是需要注意许多细节地方的。最近在遇到打印问题的时候,仔细研究一阵,总结这篇博文,写得有点杂乱,看…

    技术杂谈 2023年6月1日
    079
  • HTTP长连接和短链接代理与网关

    长连接和短链接 代理与网关 HTTP/)服务器端网关:网关与客户端使用HTTP协议通信,使用其他协议与服务端通信 (/HTTP)客户端网关:网关与客户端使用其他协议通信,使用HTT…

    技术杂谈 2023年7月24日
    067
  • 鸟类飞行状态下穿戴式神经信号与行为数据检测记录系统的技术难点总结

    前记 近来受国内一些科研院所的委托,帮忙开发了一款鸟类可穿戴神经信号和行为数据分析设备。项目虽然成功了。可中间也遇到不少值得记录和反思的问题。 作为一家智能可穿戴方案提供商,对这方…

    技术杂谈 2023年5月31日
    098
  • Mysql基础篇-查询、函数、多表、事务

    基础篇 1.1 mysql用户和权限管理 查询用户 USER mysql; SELECT * FROM user; 创建用户 CREATE USER ‘用&a…

    技术杂谈 2023年7月24日
    073
  • 关闭显示器API及命令

    window下命令powercfg /change “Home/Office Desk” /moniter-timeout-ac 1C#中实现[DllImp…

    技术杂谈 2023年6月1日
    074
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球