" Kubernetes" (v1.10.2)说我的pod(包含一个容器)使用大约5GB的内存。在容器内部,RSS更像是681MiB。可以解释如何使用以下数据从681MiB到5GB(或描述如何从容器或在kubernetes中运行此容器的docker主机中省略的另一个命令来弥补差异) ?
kubectl top pods说5GB:
% kubectl top pods -l app=myapp
NAME CPU(cores) MEMORY(bytes)
myapp-56b947bf6d-2lcr7 39m 5039Mi
Cadvisor报告的数字相似(可能来自略有不同的时间,所以请忽略小差异):
container_memory_usage_bytes{pod_name=~".*myapp.*"} 5309456384
5309456384 / 1024.0 / 1024 ~= 5063 ~= 5039
在容器内部,此文件似乎是cadvisor获取其数据的位置:
% kubectl exec -it myapp-56b947bf6d-2lcr7 bash
meme@myapp-56b947bf6d-2lcr7:/app# cat /sys/fs/cgroup/memory/memory.usage_in_bytes
5309456384
容器内的驻留集大小(RSS)不匹配(小于1GB):
meme@myapp-56b947bf6d-2lcr7:/app# kb=$(ps aux | grep -v grep | grep -v 'ps aux' | grep -v bash | grep -v awk | grep -v RSS | awk '{print $6}' | awk '{s+=$1} END {printf "%.0f", s}'); mb=$(expr $kb / 1024); printf "Kb: $kb\nMb: $mb\n"
Kb: 698076
Mb: 681
如果有帮助,请填写完整的ps:
meme@myapp-56b947bf6d-2lcr7:/app# ps aux | grep -v grep | grep -v 'ps aux' | grep -v bash | grep -v awk
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
meme 1 0.0 0.0 151840 10984 ? Ss Jun04 0:29 /usr/sbin/apache2 -D FOREGROUND
www-data 10 0.0 0.0 147340 4652 ? S Jun04 0:00 /usr/sbin/apache2 -D FOREGROUND
www-data 11 0.0 0.0 148556 4392 ? S Jun04 0:16 /usr/sbin/apache2 -D FOREGROUND
www-data 12 0.2 0.0 2080632 11348 ? Sl Jun04 31:58 /usr/sbin/apache2 -D FOREGROUND
www-data 13 0.1 0.0 2080384 10980 ? Sl Jun04 18:12 /usr/sbin/apache2 -D FOREGROUND
www-data 68 0.3 0.0 349048 94272 ? Sl Jun04 47:09 hotapp
www-data 176 0.2 0.0 349624 92888 ? Sl Jun04 43:11 hotapp
www-data 179 0.2 0.0 349196 94456 ? Sl Jun04 42:20 hotapp
www-data 180 0.3 0.0 349828 95112 ? Sl Jun04 44:14 hotapp
www-data 185 0.3 0.0 346644 91948 ? Sl Jun04 43:49 hotapp
www-data 186 0.3 0.0 346208 91568 ? Sl Jun04 44:27 hotapp
www-data 189 0.2 0.0 350208 95476 ? Sl Jun04 41:47 hotapp
来自docker的容器统计API的内存部分:
curl --unix-socket /var/run/docker.sock 'http:/v1.24/containers/a45fc651e7b12f527b677e6a46e2902786bee6620484922016a135e317a42b4e/stats?stream=false' | jq . # yields:
"memory_stats": {
"usage": 5327712256,
"max_usage": 5368344576,
"stats": {
"active_anon": 609095680,
"active_file": 74457088,
"cache": 109944832,
"dirty": 28672,
"hierarchical_memory_limit": 5368709120,
"inactive_anon": 1687552,
"inactive_file": 29974528,
"mapped_file": 1675264,
"pgfault": 295316278,
"pgmajfault": 77,
"pgpgin": 85138921,
"pgpgout": 84964308,
"rss": 605270016,
"rss_huge": 0,
"shmem": 5513216,
"total_active_anon": 609095680,
"total_active_file": 74457088,
"total_cache": 109944832,
"total_dirty": 28672,
"total_inactive_anon": 1687552,
"total_inactive_file": 29974528,
"total_mapped_file": 1675264,
"total_pgfault": 295316278,
"total_pgmajfault": 77,
"total_pgpgin": 85138921,
"total_pgpgout": 84964308,
"total_rss": 605270016,
"total_rss_huge": 0,
"total_shmem": 5513216,
"total_unevictable": 0,
"total_writeback": 0,
"unevictable": 0,
"writeback": 0
},
"limit": 5368709120
},
对https://github.com/google/cadvisor/issues/638的评论断言:
总计(memory.usage_in_bytes)= rss +缓存
https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt说:
usage_in_bytes:为了提高效率,作为其他内核组件,内存cgroup使用了一些优化 避免不必要的cacheline错误共享。 usage_in_bytes受到影响 方法,并没有显示'确切'内存(和交换)使用的价值,它是一个模糊 有效访问的价值。 (当然,必要时,它会同步。) 如果你想知道更精确的内存使用情况,你应该使用RSS + CACHE(+ SWAP) memory.stat中的值(见5.2)。
https://docs.docker.com/engine/reference/commandline/stats/#parent-command说:
注意:在Linux上,Docker CLI通过从总内存使用量中减去页面缓存使用情况来报告内存使用情况。 API不执行此类计算,而是提供总内存使用量和页面缓存中的金额,以便客户端可以根据需要使用数据。
事实上,容器中/sys/fs/cgroup/memory/memory.stat中的大部分内容都显示在上面的docker stats api响应中(略有差异来自于在不同时间采样,抱歉) :
meme@myapp-56b947bf6d-2lcr7:/app# cat /sys/fs/cgroup/memory/memory.stat
cache 119492608
rss 607436800
rss_huge 0
shmem 5525504
mapped_file 1675264
dirty 69632
writeback 0
pgpgin 85573974
pgpgout 85396501
pgfault 296366011
pgmajfault 80
inactive_anon 1687552
active_anon 611213312
inactive_file 32800768
active_file 81166336
unevictable 0
hierarchical_memory_limit 5368709120
total_cache 119492608
total_rss 607436800
total_rss_huge 0
total_shmem 5525504
total_mapped_file 1675264
total_dirty 69632
total_writeback 0
total_pgpgin 85573974
total_pgpgout 85396501
total_pgfault 296366011
total_pgmajfault 80
total_inactive_anon 1687552
total_active_anon 611213312
total_inactive_file 32800768
total_active_file 81166336
total_unevictable 0
来自kubectl describe pod <pod>
的内存信息:
Limits:
memory: 5Gi
Requests:
memory: 4Gi
这是pmap
在容器内所说的内容。在这个单行程序中,我获取所有进程ID,在它们上运行pmap -x,并从pmap结果中提取Kbytes列。总结果是256兆字节(远远小于ps的RSS,部分,我认为,因为许多进程没有返回pmap -x的输出):
ps aux | awk '{print $2}' | grep -v PID | xargs sudo pmap -x | grep total | grep -v grep | awk '{print $3}' | awk '{s+=$1} END {printf "%.0f", s}'; echo
256820
ps_mem.py提到了 https://stackoverflow.com/a/133444/6090676。它会检查/proc/$pid/statm
和/proc/$pid/smaps
。这里没有照明(再次,似乎忽略了一些过程):
# python ps_mem.py
Private + Shared = RAM used Program
1.7 MiB + 1.0 MiB = 2.7 MiB apache2
2.0 MiB + 1.0 MiB = 3.0 MiB bash (3)
---------------------------------
5.7 MiB
=================================
Incorrect reporting of container memory usage by cadvisor还有另一个类似的问题(但信息较少)。谢谢!
答案 0 :(得分:3)
我在这里没有看到的一件事是内核内存。 memory.usage_in_bytes
图中也对此进行了说明,但没有出现在memory.stat
中。您可以通过查看/sys/fs/cgroup/memory/memory.kmem.usage_in_bytes
来找到它。
我曾经看到一个类似的事情发生在我们的一个.NET核心应用程序中,而且我无法弄清楚到底发生了什么(也许是.NET核心中的内存泄漏,因为它是我们应用无法控制的非托管内存) )。
也许这是您的另一个面包屑。是否正常使用将取决于您的应用程序,但是就cgroups而言,我认为默认情况下内核内存使用不受限制。
答案 1 :(得分:2)
我不知道您是否已经找到答案,但让我给您一些可能有用的信息。
cAdvisor提取许多与内存相关的指标。我们将专注于:
container_memory_usage_bytes
->获取内存使用情况。来自memory.usage_in_bytes文件。
container_memory_working_set_bytes
->在cAdvisor中计算。它是<= usage
。换句话说,usage
= working_set_bytes
+ total_inactive_file
container_memory_rss
->等于memory.state文件中的total_rss
。
现在您知道如何收集这些指标,您需要知道,当您使用kubectl top pods
命令时,将获得container_memory_working_set_bytes
而不是usage
指标的值。 / p>
所以从您的价值观来看:
5039Mi“来自kubectl命令的工作集”〜= 5064“来自memory.usage文件”-28“来自Docker容器统计API的“内存”部分中的total_inactive_file”
还值得一提的是,当container_memory_usage_bytes
的值达到极限时,您的广告连播不会被杀死。但是如果container_memory_working_set_bytes
或container_memory_rss
达到限制,则吊舱将被杀死。
答案 2 :(得分:1)
看起来它正在使用VSZ,虚拟内存大小,而不是RSS。 Kubernetes看到了这一点:
% kubectl top pods -l app=myapp
NAME CPU(cores) MEMORY(bytes)
myapp-7b4b4f84f8-fxbns 39m 7136Mi
在对容器内的ps求和第5列(VSZ)时,说:
meme@myapp-7b4b4f84f8-fxbns:/app# kb=$(ps aux | grep -v grep | grep -v 'ps aux' | grep -v bash | grep -v awk | grep -v RSS | awk '{print $5}' | awk '{s+=$1} END {printf "%.0f", s}'); mb=$(expr $kb / 1024); printf "Kb: $kb\nMb: $mb\n"
Kb: 7032172
Mb: 6867
VSZ大约为7GB(不完全匹配,但是很接近),而RSS表示为665MB,因此,我相信Kubernetes和/sys/fs/cgroup/memory/memory.usage_in_bytes
至少在使用VSZ方面的东西在这种情况下。