【k8s pod container内存指标说明】

这篇具有很好参考价值的文章主要介绍了【k8s pod container内存指标说明】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、问题描述

我司平台研发的devops平台底层采用k8s实现,k8s自带cadvisor进行集群指标收集,根据官网,我们选用了container_memory_working_set_bytes(容器的工作集使用量)作为内存使用量的观察项,但随着后续使用过程中发现该指标上升到一定大小后就会维持不变,并不像应用实际内存使用量,没出现波动;

来自kubernetes对该问题的讨论(讨论了5年多了):https://github.com/kubernetes/kubernetes/issues/43916

二、原因分析

⚠️以下是建立在关闭swap交换分区的前提下分析

经过一系列分析发现使用container_memory_working_set_bytes不合理,应该使用container_memory_rss来表示应用实际内存使用量;

我最开始受cadvisor git问题栏中描述的影响,里面描述说:k8s kill pod时是根据该指标使用情况来判断的,所以下意识认为该指标表示pod实际内存使用量;官网说的没有问题,container_memory_working_set_bytes指标就是k8s来控制pod是否被kill的依据参考,但不代表container_memory_working_set_bytes接近pod limit后就一定会被kill,这里涉及到下面要详细分析的pod内存分布情况;

  1. 获取pod内存记录信息
    在cadvisor中,采集应用内存信息具体实现实际是获取docker cgroup中memory.stat中的内容,下面是通过cat /sys/fs/cgroup/memory/memory.stat获取到的pod内存数据:
cache 118784
rss 767553536
rss_huge 0
mapped_file 32768
swap 0
pgpgin 215484
pgpgout 28064
pgfault 388710
pgmajfault 0
inactive_anon 0
active_anon 767496192
inactive_file 32768
active_file 86016
unevictable 0
hierarchical_memory_limit 1073741824
hierarchical_memsw_limit 1073741824
total_cache 118784
total_rss 767553536
total_rss_huge 0
total_mapped_file 32768
total_swap 0
total_pgpgin 215484
total_pgpgout 28064
total_pgfault 388710
total_pgmajfault 0
total_inactive_anon 0
total_active_anon 767496192
total_inactive_file 32768
total_active_file 86016
total_unevictable 0
  1. pod内存记录说明
    上面获取内存记录,主要关心total_cachetotal_rsstotal_inactive_anontotal_active_anontotal_inactive_filetotal_active_file
  • total_cache:表示当前pod缓存内存量
  • total_rss:表示当前应用进程实际使用内存量
  • total_inactive_anon:表示匿名不活跃内存使用量
  • total_active_anon:表示匿名活跃内存使用量,jvm堆内存使用量会被计算在此处
  • total_inactive_file:表示不活跃文件内存使用量
  • total_active_file:表示活跃文件内存使用量
  1. container_memory_working_set_bytes、container_memory_rss指标的详细分析

⚠️ 建议先查看最后附录内容,了解cadvisor中每个指标的意义,有助于帮助下面内容理解。

  • 容器当前使用内存量: container_memory_usage_bytes = total_cache + total_rss
  • 容器当前使用缓存内存: total_cache = total_inactive_file + total_active_file
  • container_memory_working_set_bytes=container_memory_usage_bytes - total_inactive_file为官方源代码提供,带入上面两个公式,容器的工作集的等式可以拆解为:
container_memory_working_set_bytes 
= container_memory_usage_bytes - total_inactive_file
= total_cache + total_rss - total_inactive_file
= total_inactive_file + total_active_file + total_rss - total_inactive_file
= total_active_file + total_rss

即:container_memory_working_set_bytes = total_active_file+ total_rss,其中total_rss为应用真实使用内存量,正常情况下该指标数值稳定,那为何该指标会持续上升而且一直维持很高呢?其实问题就出现在total_active_file上;

Linux系统为了提高文件读取速率,会划分出来一部分缓存内存,即cache内存,这部分内存有个特点,当应用需要进行io操作时,会向Linux申请一部分内存,这部分内存归属于操作系统,当应用io操作完毕后,操作系统不会立即回收;
当操作系统认为系统剩余内存不足时(判断依据未深究),才会主动回收这部分内存。

这部分内存属于操作系统,jvm无任何管理权限,故也不会把这部分内存计算到JVM中。container_memory_working_set_bytes指标升高一部分是应用本身JVM内存使用量增加,另一部分就是进行了io操作total_active_file升高;该指标异常一般都是应用进行了io相关操作。

模拟io操作

你可以在pod中创建一个大一点的日志文件,通过 cat 文件名 > /dev/null 将其加载到缓存内存中,你会发现total_active_file升高并且不会被释放;

删除加载后的日志文件,模拟系统回收内存操作,你会发现total_active_file降低;
或者执行echo 3 > /proc/sys/vm/drop_caches命令,前提是用户有足够权限

三、合理监控

关心应用使用内存大小用container_memory_rss;
排查pod为何被kill,关注container_memory_working_set_bytestotal_active_filetotal_inactive_file文章来源地址https://www.toymoban.com/news/detail-608720.html

附录 k8s pod container内存指标说明

container_memory_cache表示容器使用的缓存内存。
container_memory_mapped_file表示容器使用的映射文件内存。
container_memory_rss表示容器的常驻内存集(Resident Set Size),即实际使用的物理内存量。
container_memory_swap表示容器使用的交换内存量。
container_memory_usage_bytes表示容器当前使用的内存量,包括常驻内存和缓存,**缓存部分往往会有很多处于空闲**。
container_memory_working_set_bytes表示容器的工作集,即容器当前活跃使用的内存量,不包括缓存。
container_memory_max_usage_bytes表示容器历史上使用过的最大内存量。
container_memory_failcnt表示容器内存失败计数,即无法分配所需内存的次数。
container_memory_failures_total表示容器内存分配失败的总次数。

到了这里,关于【k8s pod container内存指标说明】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • k8s pod “cpu和内存“ 资源限制

    转载用于收藏学习:原文 为了保证充分利用集群资源,且确保重要容器在运行周期内能够分配到足够的资源稳定运行,因此平台需要具备 Pod的资源限制的能力。 对于一个pod来说,资源最基础的2个的指标就是:CPU和内存。 Kubernetes提供了个采用requests和limits 两种类型参数对资

    2024年02月13日
    浏览(67)
  • 持续集成部署-k8s-资源调度:HPA - Pod 基于负载指标自动水平扩容缩容

    首先我们找一个 Deployment 配置文件: nginx-deploy.yaml

    2024年02月07日
    浏览(53)
  • kubernetes(k8s)为容器和 Pod 分配内存资源

    展示如何将内存请求(request)和内存限制(limit)分配给一个容器。 我们保障容器拥有它请求数量的内存,但不允许使用超过限制数量的内存。 创建新的命名空间 编辑yaml文件 配置文件的 args 部分提供了容器启动时的参数。 “–vm-bytes”, “150M” 参数告知容器尝试分配 15

    2024年02月15日
    浏览(58)
  • K8S 1.27 新特性 Pod 无需重启调整CPU内存资源

    如果您已经部署了指定 CPU 或 Memory 资源的 Kubernetes pod,可能已经注意到更改资源值涉及重新启动 pod。直到现在,这一直是运行工作负载的破坏性操作。 在 Kubernetes v1.27 中,添加了一个新的 alpha 功能,允许用户在不重启容器的情况下调整分配给 Pod 的 CPU 或 memory 资源的大小。

    2024年02月11日
    浏览(36)
  • k8s故障排查个案:当Pod内存持续增长,OOM问题如何解决?

    pod 运行一段时间后,内存持续增长,甚至 oom 的情况. 容器化过程中,我们经常会发现 kubernetes 集群内 pod 的内存使用率会不停持续增长,加多少内存吃多少内存,如果对 cgroup 内存的构成不是很清楚的情况下,单纯看监控看不出什么问题。 经过一番查阅,目前总结出大致有

    2024年02月22日
    浏览(59)
  • 记一次go应用在k8s pod已用内存告警不准确分析

    起因: 自监控应用凌晨告警:Pod 内存使用率大于80%(规格为1c1G)。内存缓慢增长,持续到早上内存使用率停止在81%左右。 疑点: 此模块是一个轻任务模块(基于go开发),请求量很低并且数据量非常少,平常内存占用一直以来都在100MB左右,出现内存不足的概率极小,而且

    2024年01月18日
    浏览(48)
  • k8s搭建集群报错failed to set up sandbox container “xxx“ network for pod “coredns-xxx“:networkPlugin cni fa

    今天在搭建k8s集群时发现coredns一直处于containerCreating状态,如下图所示: 到相应的node节点上查看日志去排查问题: kubectl describe pods -n kube-system coredns-66bff467f8-n7q8f 发现报错的日志如下图: 我的是因为之前部署的时候选择了calico网络插件,这次启动选的是flannel,导致node节点上

    2024年02月16日
    浏览(39)
  • k8s、pod

    k8s中的port【端口:30000-32767】 port :为Service 在 cluster IP 上暴露的端口 targetPort:对应容器映射在 pod 端口上 nodePort:可以通过k8s 集群外部使用 node IP + node port 访问Service containerPort:容器内部使用的端口 k8s 集群内部流程: 客户端→clusterIP:port→通过 tagerport→pod IP:container

    2024年02月06日
    浏览(34)
  • k8s关于pod

      目录 1、POD 的创建流程 kubectl 发起创建 Pod 请求: API Server 接收请求并处理: 写入 Etcd 数据库: Kubelet 监听并创建 Pod: Pod 状态更新和汇报: 2、POD 的状态解析 1. Pending Pod 2. Running Pod 3. Succeeded Pod 4. Failed Pod 5. Unknown 6. CrashLoopBackOff 7. ImagePullBackOff Pod 8. Terminating 9. Evicted 10.

    2024年03月18日
    浏览(49)
  • K8s Pod详解

    每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类: 用户程序所在的容器,数量可多可少 Pause容器,这是每个Pod都会有的一个 根容器 ,它的作用有两个: 可以以它为依据,评估整个Pod的健康状态 可以在根容器上设置Ip地址,其它容器都此Ip(Pod IP),以实现

    2024年02月01日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包