排查K8S的WSS内存一致升高

这篇具有很好参考价值的文章主要介绍了排查K8S的WSS内存一致升高。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 背景

公司后端服务是java体系,运用k8s进行搭建,服务监控是用Prometheus+Grafana进行监控,发现容器监控层面的WSS会持续增长,而RSS保持不变。故有个疑惑:
容器内存rss wss,性能理论,kubernetes,java,运维
容器内存rss wss,性能理论,kubernetes,java,运维

  1. WSS是什么指标
  2. 为什么WSS会持续增长
  3. WSS增长之后到极限值后,怎么处理

2 集群日志架构

3 基本概念

VSS:Virtual Set Size 虚拟耗用的内存(包含与其他进程共享占用的虚拟内存)
RSS:Resident Set Size实际使用的物理内存(包含与其他进程共享占用的内存)
PSS:Proportional Set Size实际使用的物理内存(按比例包含与其他进程共享占用的内存)
USS:Unique Set Size进程独自占用的物理内存(不包含与其他进程共享占用的内存)

对于单个进程,一般来说内存占用大小排序如下:VSS >= RSS >= PSS >= USS

4 分析

4.1 监控数据

监控数据是采集的kubernetes中监控程序cadvisor上报的container_memory_working_set_bytes字段。

指标参考地址:

https://github.com/google/cadvisor/blob/master/docs/storage/prometheus.md
Metric name Type Metric name Type
container_memory_rss Gauge Size of RSS bytes
container_memory_swap Gauge Container swap usage bytes
container_memory_usage_bytes Gauge Current memory usage, including all memory regardless of when it was accessed bytes
container_memory_working_set_bytes Gauge Current working set bytes

查看cadvisor源码中setMemoryStats 可知,container_memory_working_set_bytes字段是cgroup memory.usage_in_bytes(RSS + Cache)与memory.stat total_inactive_file二者的差值

func setMemoryStats(s *cgroups.Stats, ret *info.ContainerStats) {
	// ...

	// ...

	inactiveFileKeyName := "total_inactive_file"
	if cgroups.IsCgroup2UnifiedMode() {
		inactiveFileKeyName = "inactive_file"
	}

	workingSet := ret.Memory.Usage
	if v, ok := s.MemoryStats.Stats[inactiveFileKeyName]; ok {
		if workingSet < v {
			workingSet = 0
		} else {
			workingSet -= v
		}
	}
	ret.Memory.WorkingSet = workingSet
}

注意:

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

所以cadvisor采用memory.usage_in_bytes - total_inactive_file计算出的结果并不是当前Pod中程序所占用的内存,当Pod内存资源紧张时total_active_file也是可回收利用的。

4.2 验证

4.2.1 第一次遍历

找一个比较大的文件:

/app # ls -lah /data/log/xxxx.log
-rw-r--r--    1 root     root   /data/log/xxxx.log

查看内存数据
在容器中进入/sys/fs/cgroup/memory/目录,并查看cat memory.stat内容

/app # cd /sys/fs/cgroup/memory/
/sys/fs/cgroup/memory # cat memory.stat
cache 714813440
rss 4415488
rss_huge 0
shmem 0
mapped_file 11218944
dirty 405504
writeback 135168
pgpgin 289641
pgpgout 113984
pgfault 149424
pgmajfault 66
inactive_anon 2248704
active_anon 2162688
inactive_file 18096128
active_file 696942592
unevictable 0
hierarchical_memory_limit 9223372036854771712
total_cache 20359831552
total_rss 11527815168
total_rss_huge 171966464
total_shmem 18653184
total_mapped_file 769241088
total_dirty 4325376
total_writeback 7163904
total_pgpgin 414322491
total_pgpgout 407001393
total_pgfault 536448693
total_pgmajfault 11979
total_inactive_anon 360513536
total_active_anon 10174644224
total_inactive_file 18857082880
total_active_file 2497884160
total_unevictable 0

记录此时
total_inactive_file 18857082880 Bytes =17,983.515625 M
total_active_file 2497884160 Bytes =2,382.16796875 M

计算方式:
18857082880/1024/1024 =17,983.515625

4.2.2 第二次遍历(待验证)

遍历日志文件,
/sys/fs/cgroup/memory # grep “data” /data/log/xxx.log

第二次查看;

4.2.3 第三次遍历(待验证)

遍历日志文件,第三次查看;

4.2.4 总结

根据上述实验结果可以印证内存持续增长但不会OOM的现象。服务启动并向磁盘中持续追加日志文件,随之file cache持续上涨,直至达到Pod的内存上限之后,会出现GC。

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_active_file

因此cadvisor中container_memory_working_set_bytes字段在计算实际已使用内存时应该改为:文章来源地址https://www.toymoban.com/news/detail-641588.html

real_used = memory.usage_in_bytes – memory.stat.total_active_file

到了这里,关于排查K8S的WSS内存一致升高的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • K8S故障排查

    故障现象:部署pod时,报错没发调度到节点。 排查步骤: 1、查看集群的状态 2、查看k8s组件的状态-kubelet,kube-apiservice 3、查看docker的Cgroup driver和k8s的Cgroup driver类型,发现docker是cgroup,k8s是systemd,问题点找到了。

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

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

    2024年02月09日
    浏览(49)
  • K8s出现问题时,如何排查解决!

    K8s问题的排查 1、POD启动异常、部分节点无法启动pod 容器里管理应用 pod出现异常的原因: 2. 审视集群状态 审视集群状态 K8S的集群状态是排查故障的关键起点。使用kubectl get nodes命令来检查节点状态。如果有节点未能就绪或出现异常状态,可能会对应用程序造成故障。确保基

    2024年02月02日
    浏览(43)
  • K8S集群中PLEG问题排查

    k8s集群排障真的很麻烦 今天集群有同事找我,节点报 PLEG is not healthy 集群中有的节点出现了NotReady,这是什么原因呢? PLEG is not healthy 也是一个经常出现的问题 POD 生命周期事件生成器 先说下PLEG 这部分代码在kubelet 里,我们看一下在kubelet中的注释: 也就是说kubelet 会定时把

    2024年02月02日
    浏览(50)
  • k8s发生故障,可以从哪些方面排查

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

    2024年02月13日
    浏览(36)
  • k8s无法正常启动使用,排查:etcd损坏

    问题: 在跑项目的时候,机器意外断电了,重启后发现kubectl无法使用,报错如下: 排查: 1、 Unable to register node with API server\\\" err=“Post “https://192.168.18.101:6443/api/v1/nodes”: dial tcp 192.168.18.101:6443: connect: connection refused” node=\\\"k8s-master01 发现连接不到apiserver 2、然后我到docker容器

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

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

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

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

    2024年01月22日
    浏览(39)
  • K8S Error getting node问题的排查思路

    在安装K8S集群或者运行过程中,大家可能会遇到 \\\"Error gettting node\\\" 的问题,例如: 排查这类问题的方法是执行如下命令查看具体错误原因: 找到最初的报错,根据不同的错误进行处理。 根据我遇到过的问题,主要有以下可能: 没有禁用swap内存 pause镜像没有下载成功(这里尤

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

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

    2024年01月21日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包