Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory POD内存利用率和来自节点的RSS不一致';s ps_Memory_Kubernetes_Metrics - Fatal编程技术网

Memory POD内存利用率和来自节点的RSS不一致';s ps

Memory POD内存利用率和来自节点的RSS不一致';s ps,memory,kubernetes,metrics,Memory,Kubernetes,Metrics,我已经在我的K8s集群(1.15版)中部署了metrics服务器 我想这是执行简单mem利用率检查的标准方法 我有一个包含多个进程的POD(为了获取进程,用dumbinit包装) 我想知道我的POD当前的内存使用情况 输出kube容量--util--pods: NODE NAMESPACE POD CPU REQUESTS CPU LIMITS CPU UTIL MEMORY REQUES

我已经在我的K8s集群(1.15版)中部署了
metrics服务器

我想这是执行简单mem利用率检查的标准方法

我有一个包含多个进程的POD(为了获取进程,用
dumbinit
包装)

我想知道我的POD当前的内存使用情况

输出
kube容量--util--pods

NODE      NAMESPACE           POD                               CPU REQUESTS   CPU LIMITS   CPU UTIL      MEMORY REQUESTS   MEMORY LIMITS   MEMORY UTIL
sj-k8s1   kube-system         kube-apiserver-sj-k8s1            250m (6%)      0m (0%)      77m (1%)      0Mi (0%)          0Mi (0%)        207Mi (2%)

...
sj-k8s3   salt-provisioning   salt-master-7dcf7cfb6c-l8tth      0m (0%)        0m (0%)      220m (5%)     1536Mi (19%)      3072Mi (39%)    1580Mi (20%)
显示盐主吊舱目前使用~1.6Gi,kubeapi使用~200Mi

但是,在sj-k8s3上执行命令
ps aux|awk'$12~/salt master/{sum+=$6}END{print sum}
(ps输出的RSS总和):

也就是~2Gi,
/sys/fs/cgroup/memory/memory.stats的输出:

cache 173740032
rss 1523937280
rss_huge 0
shmem 331776
mapped_file 53248
dirty 4096
writeback 0
pgpgin 34692690
pgpgout 34278218
pgfault 212566509
pgmajfault 6
inactive_anon 331776
active_anon 1523916800
inactive_file 155201536
active_file 18206720
unevictable 0
hierarchical_memory_limit 2147483648
total_cache 173740032
total_rss 1523937280
total_rss_huge 0
total_shmem 331776
total_mapped_file 53248
total_dirty 4096
total_writeback 0
total_pgpgin 34692690
total_pgpgout 34278218
total_pgfault 212566509
total_pgmajfault 6
total_inactive_anon 331776
total_active_anon 1523916800
total_inactive_file 155201536
total_active_file 18206720
total_unevictable 0
cache 78499840
rss 391188480
rss_huge 12582912
shmem 0
mapped_file 69423104
dirty 0
writeback 0
pgpgin 111883
pgpgout 1812
pgfault 100603
pgmajfault 624
inactive_anon 0
active_anon 215531520
inactive_file 253870080
active_file 270336
unevictable 0
hierarchical_memory_limit 8361357312
total_cache 78499840
total_rss 391188480
total_rss_huge 12582912
total_shmem 0
total_mapped_file 69423104
total_dirty 0
total_writeback 0
total_pgpgin 111883
total_pgpgout 1812
total_pgfault 100603
total_pgmajfault 624
total_inactive_anon 0
total_active_anon 215531520
total_inactive_file 253870080
total_active_file 270336
total_unevictable 0

该POD实际上包含两个docker容器,因此RSS的实际总和为:

2296688
哪个更大:2.3Gi

在apiserver节点上,仅执行
ps aux
即可显示进程RSS为:
447948
/sys/fs/cgroup/memory/memory.stats的输出:

cache 173740032
rss 1523937280
rss_huge 0
shmem 331776
mapped_file 53248
dirty 4096
writeback 0
pgpgin 34692690
pgpgout 34278218
pgfault 212566509
pgmajfault 6
inactive_anon 331776
active_anon 1523916800
inactive_file 155201536
active_file 18206720
unevictable 0
hierarchical_memory_limit 2147483648
total_cache 173740032
total_rss 1523937280
total_rss_huge 0
total_shmem 331776
total_mapped_file 53248
total_dirty 4096
total_writeback 0
total_pgpgin 34692690
total_pgpgout 34278218
total_pgfault 212566509
total_pgmajfault 6
total_inactive_anon 331776
total_active_anon 1523916800
total_inactive_file 155201536
total_active_file 18206720
total_unevictable 0
cache 78499840
rss 391188480
rss_huge 12582912
shmem 0
mapped_file 69423104
dirty 0
writeback 0
pgpgin 111883
pgpgout 1812
pgfault 100603
pgmajfault 624
inactive_anon 0
active_anon 215531520
inactive_file 253870080
active_file 270336
unevictable 0
hierarchical_memory_limit 8361357312
total_cache 78499840
total_rss 391188480
total_rss_huge 12582912
total_shmem 0
total_mapped_file 69423104
total_dirty 0
total_writeback 0
total_pgpgin 111883
total_pgpgout 1812
total_pgfault 100603
total_pgmajfault 624
total_inactive_anon 0
total_active_anon 215531520
total_inactive_file 253870080
total_active_file 270336
total_unevictable 0

有人能解释为什么报告的POD内存利用率与simple
ps
相差近40%(对于apiserver进程,相差100)

编辑:我已经更新了内存报告值,以包括
/sys/fs/cgroup/memory/memory.stat的输出,它似乎+-对应于kube capacity报告的POD利用率

正如第一条评论中所建议的:这是否意味着差异仅在于共享内存(由PS报告,而不是由POD度量/cgroup报告)?

差别很大

ps
不反映应用程序实际使用的内存量,而只反映为其保留的内存量。如果页面由多个进程共享或使用一些动态链接的库共享,则可能会产生误导

这是一篇非常好的文章,描述了Linux中的内存使用情况以及ps实际报告的内容

为什么
ps
是“错误的”

根据您的看法,
ps
不会报告进程的实际内存使用情况。它真正做的是显示如果它是唯一运行的进程,每个进程将占用多少实际内存。当然,一台典型的Linux机器在任何给定的时间都有几十个进程在运行,这意味着
ps
报告的VSZ和RSS编号几乎肯定是错误的

这就是为什么不应将
ps
用于内存消耗的某些详细数据的原因

ps
的替代方案是
smem
。 它报告物理内存使用情况,并考虑共享内存页。然后在
USS
(唯一设置大小)报告非共享内存。因此,当您想忽略共享内存时,可以使用
USS

非共享内存(
USS
)加上进程的共享内存比例在
PSS
(比例设置大小)中报告。基本上,它添加
USS
,并将其共享内存的比例除以共享该内存的进程数

另一方面,
RSS
(常驻集大小)是每个进程使用的共享内存加上非共享内存的数量。如果任何进程共享内存,这将短报实际使用的内存量


Linux使用编程中使用的资源管理技术来高效地实现
复制
复制
操作。这称为写时复制。因此,当您有父进程和子进程时,它们都将显示相同的RSS。通过
写时复制
linux确保两个进程实际上使用相同的内存

您是否可以执行到您的容器中并
cat/sys/fs/cgroup/memory/memory.stats
?然后比较那里显示的rss?值得一提的是,linux帐户在每个进程的内存中共享内存,这可能会导致一些差异
top
ps
程序都以相同的方式受此影响。