k8s故障排查个案:当Pod内存持续增长,OOM问题如何解决?

这篇具有很好参考价值的文章主要介绍了k8s故障排查个案:当Pod内存持续增长,OOM问题如何解决?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

pod 运行一段时间后,内存持续增长,甚至 oom 的情况.

动机

容器化过程中,我们经常会发现 kubernetes 集群内 pod 的内存使用率会不停持续增长,加多少内存吃多少内存,如果对 cgroup 内存的构成不是很清楚的情况下,单纯看监控看不出什么问题。

经过一番查阅,目前总结出大致有 2 种导致这种情况的场景。

  1. 内存泄露

  2. io 缓存

案例分析

我们先从内存泄露分析,刚好手头有个 pod 也是这种情况。

内存泄露

进入对应的 pod 内部。我们先看看它用了多少内存,prometheus 也是取这个值做为容器的内存使用率的

# cat /sys/fs/cgroup/memory/memory.usage_in_bytes

4192538624
# bytes转GB,结果是 3.9GB

我们查看 grafana ,内存使用率的采集结果与 cgroup 里面的记录一致。

k8s故障排查个案:当Pod内存持续增长,OOM问题如何解决?,k8s,kubernetes,容器,云原生

pod内存使用率监控

我们拉长一下记录看看。

k8s故障排查个案:当Pod内存持续增长,OOM问题如何解决?,k8s,kubernetes,容器,云原生

pod内存使用率监控拉长

很明显就是发生内存泄露了 ,接下来,我们看看 pod 容器内内存记录。

# cat /sys/fs/cgroup/memory/memory.stat

cache 36900864
rss 4205309952
rss_huge 2837446656
shmem 0
mapped_file 1351680
dirty 1081344
writeback 0
swap 0
workingset_refault_anon 0
workingset_refault_file 20815872
workingset_activate_anon 0
workingset_activate_file 12029952
workingset_restore_anon 0
workingset_restore_file 8785920
workingset_nodereclaim 0
pgpgin 5688606
pgpgout 5778093
pgfault 2878062
pgmajfault 0
inactive_anon 4224827392
active_anon 0
inactive_file 9543680
active_file 25153536
unevictable 0
hierarchical_memory_limit 4294967296
hierarchical_memsw_limit 4294967296
total_cache 36900864
total_rss 4205309952
total_rss_huge 2837446656
total_shmem 0
total_mapped_file 1351680
total_dirty 1081344
total_writeback 0
total_swap 0
total_workingset_refault_anon 0
total_workingset_refault_file 20815872
total_workingset_activate_anon 0
total_workingset_activate_file 12029952
total_workingset_restore_anon 0
total_workingset_restore_file 8785920
total_workingset_nodereclaim 0
total_pgpgin 5688606
total_pgpgout 5778093
total_pgfault 2878062
total_pgmajfault 0
total_inactive_anon 4224827392
total_active_anon 0
total_inactive_file 9543680
total_active_file 25153536
total_unevictable 0

上面获取内存记录,我们主要关心:

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:表示活跃文件内存使用量

rss 确实是使用了 3.9GB 的量,确实是 pod 容器的真实使用,那么基本就验证了要么程序确实内存不够,要么就是内存泄露了。

io 缓存

除了上面那种内存泄露的场景外,还有一种是 io 缓存导致的内存虚高。如下,wss 比 rss 高出不少,这还不算极端的,只是拿出这个举个例子。

k8s故障排查个案:当Pod内存持续增长,OOM问题如何解决?,k8s,kubernetes,容器,云原生

pod内存使用率监控

然后,我们来看下容器内存指标的组成结构。

  • container_memory_working_set_bytes

  • container_memory_rss

容器当前使用内存量: container_memory_usage_bytes = total_cache + total_rss

容器当前使用缓存内存: total_cache = total_inactive_file + total_active_file

container_memory_working_set_bytes: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
  • total_rss 为应用真实使用内存量,正常情况下该指标数值稳定,那为何该指标会持续上升而且一直维持很高呢?其实问题就出现在 total_active_file 上。

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

  • container_memory_working_set_bytes 指标升高一部分是应用本身内存使用量增加,另一部分就是进行了 io 操作,total_active_file 升高,该指标异常一般都是应用进行了io相关操作。

总结

知道这些情况后,然后就是解决方法:

  1. 如果是频繁写日志到磁盘或输出日志到标准输出的场景,可以紧张日志输出到标准输出,日志落盘做轮转,比如 50-100MB 一个文件做切割,保留最近几个日志文件即可。昨晚这些后,container_memory_working_set_bytes 的使用率会肉眼可见的回落。

  2. 如果是内存计算比较频繁的服务,可以现在程序的可用内存,比如 jvm ,10G 的 pod 内存,限制程序使用 8.5GB 的的内存,现在对外内存最大使用值 1.5GB,这样就可以预留足够的内存防止 pod oom 了。只是打个比方,具体还得根据真实场景所需设置。

  3. wss的值:container_memory_working_set_bytes = total_active_file + total_rss文章来源地址https://www.toymoban.com/news/detail-835460.html

到了这里,关于k8s故障排查个案:当Pod内存持续增长,OOM问题如何解决?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • k8s发生故障,可以从哪些方面排查

    目录 第一方面:审视集群状态 第二方面:追踪事件日志 第三方面:聚焦Pod状态 第四方面:检查网络连通性 第五方面:审视存储配置 第六方面:研究容器日志 K8S的集群状态是排查故障的关键起点。使用kubectl get nodes命令来检查节点状态。如果有节点未能就绪或出现异常状态

    2024年02月13日
    浏览(42)
  • K8S - 架构、常用K8S命令、yaml资源清单部署、Ingress、故障排查、存储卷

    K8S官网文档:https://kubernetes.io/zh/docs/home/ 学习东西还是要从官方文档入手; 用于管理、扩展、自动部署容器; 其实就是 对多个跨机器的Docker集群; 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。 如果进入容器的流量很大, Kubernetes 可以负载均

    2024年02月09日
    浏览(56)
  • 持续集成部署-k8s-深入了解 Pod:探针

    Kubernetes 中的探针是指容器内的进程用于告知 Kubernetes 组件其自身状态的机制; Readiness Probe :就绪探针用于告诉 Kubernetes 该容器是否已准备好处理请求。就绪探针会定期执行一个 HTTP 请求、TCP 套接字连接或命令,如果返回成功,则认为容器已准备好,可以接收流量。如果在

    2024年02月07日
    浏览(54)
  • K8S(KubeSphere)边做边学(一)——基础故障排查

    公司系统近1年开始转变为基于微服务的k8s部署结构,使用的是kubesphere。 由于公司系统迭代更新频率较高,且不时有新的私有化客户部署搭建,更新和部署过程中经常会遇到各类问题。对于研发出生,非运维专业又是半路出家学习了解K8S的我来说,一路磕磕碰碰,边学习边积

    2024年02月08日
    浏览(32)
  • K8S集群中Pod资源处于CrashLoopBackOff状态排查思路

    CrashLoopBackOff状态一般都是Pod资源中的容器出现了问题,可以有以下几点原因: 容器中部署的程序存在Bug,无法正常启动,就会出现此状态,可以查询容器的启动日志,从日志中获取重要线索,逐个进行排查。 定义Pod资源时,对于Pod中的容器进行了资源限额,可能限额的资源

    2024年01月21日
    浏览(40)
  • K8S集群中Pod资源处于ImagePullBackOff状态排查思路

    ImagePullBackOff状态表示容器的镜像拉取失败,可能存在以下几点原因: 拉取镜像时间较长导致超时,从而导致镜像拉取失败,部署完Docker后,一定要添加上阿里云的镜像加速器,否则拉取镜像是非常慢的,很容易就会导致镜像拉取失败。 镜像配置有误,指定的镜像在公有仓库

    2024年02月14日
    浏览(41)
  • K8S集群Node节点NotReay状态故障排查思路

    在K8S集群中,经常会出现Node节点处于NotReady的状态,当Node节点处于NotReady状态时,会导致该Node节点上的所有Pod资源停止服务,对整体应用程序会产生一定的影响。 在一个Node节点中可以运行多个Pod资源,每一个Pod资源中可以运行一个容器或者多个容器,同时共享一个网络存储

    2024年01月22日
    浏览(48)
  • k8s pod一直处于pending状态一般有哪些情况,怎么排查?

    一个pod一开始创建的时候,它本身就是会处于pending状态,这时可能是正在拉取镜像,正在创建容器的过程。 如果等了一会发现pod一直处于pending状态, 那么我们可以使用kubectl describe命令查看一下pod的Events详细信息。一般可能会有这么几种情况导致pod一直处于pending状态: 1、

    2024年01月17日
    浏览(50)
  • 现场问题排查-k8s(docker)上某服务pod频繁自动重启

    根因:应用内存占用不合理(个人认为)+现场配置内存不够导致频繁触发OOM引发该现象。 为啥要写这个文章? 之前没有k8s下pod频繁重启的问题处理经验,这次实战沉淀思路及过程,供后续自己处理相同问题提供参考资料 为其他遇到类似问题的人提供一些排查思路 现场反馈

    2024年02月03日
    浏览(37)
  • 【k8s pod container内存指标说明】

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

    2024年02月15日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包