提问人:jim 提问时间:11/16/2023 最后编辑:Adrianjim 更新时间:11/16/2023 访问量:56
进程的 RSS 内存远低于 cgroup memory.stat 中的 RSS
rss memory for process is much lower than the rss in cgroup memory.stat
问:
我们有一个 Go 程序(Go 版本 1.19 在 k8s pod 中运行,进程在节点上显示的 RSS (ps / top) 远低于 cgroup memory.stat 中显示的值。
这是 cgroup 中的 memory.stat,RSS 是 7860129792,rss_huge 是5066719232。
$ cat memory.stat
cache 547885056
rss 7860129792 <-- the rss in cgroup is much higher than the value in "ps -aux"
rss_huge 5066719232 <-- notice that there is also high rss_huge
shmem 0
mapped_file 0
dirty 20480
writeback 0
swap 0
pgpgin 450943252
pgpgout 450125090
pgfault 1097413913
pgmajfault 0
inactive_anon 0
active_anon 7859318784
inactive_file 546922496
active_file 962560
unevictable 0
hierarchical_memory_limit 12884901888
hierarchical_memsw_limit 12884901888
total_cache 547885056
total_rss 7860129792
total_rss_huge 5066719232
total_shmem 0
total_mapped_file 0
total_dirty 20480
total_writeback 0
total_swap 0
total_pgpgin 450943252
total_pgpgout 450125090
total_pgfault 1097413913
total_pgmajfault 0
total_inactive_anon 0
total_active_anon 7859318784
total_inactive_file 546922496
total_active_file 962560
total_unevictable 0
docker stats 显示的内容与 cgroup 几乎相同。
$docker stats c39bc01d525e
CONTAINER ID CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
c39bc01d525e 49.27% 7.88GiB / 12GiB 65.67% 0B / 0B 0B / 24.6kB 106
但是,此 cgroup 管理着 3 个相应的进程。主要进程是 pid 496687,它的 RSS 只有 5205340,远低于 cgroup 和 docker stats 中的 RSS。
$ cat cgroup.procs
496644
496687
496688
$ ps -aux | grep -E "496644|496687|496688"
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 496644 0.0 0.0 1604 1464 ? Ss Oct28 0:00 sh ./bin/start.sh
root 496687 26.5 0.4 6466348 5205340 ? Sl Oct28 7271:55 /go/release/bin/golang-app
root 496688 0.0 0.0 1588 608 ? S Oct28 0:31 tail -f /dev/null
我还检查了 smaps 以获取更多详细信息,Rss / AnonHugePages / Size 的总和值如下所示,该值接近于 ps 中的一个显示,并且仍然远低于 cgoup memeory.stat 中的值
Rss 的总和:
$ cat /proc/496687/smaps | grep Rss | awk -F':' '{print $2 }' | awk 'BEGIN {sum=0} {sum+=$1} END {print sum}'
4645704
AnonHugePages 的总和:
$ cat /proc/496687/smaps | grep AnonHugePages | awk -F':' '{print $2 }' | awk 'BEGIN {sum=0} {sum+=$1} END {print sum}'
524288
尺寸总和:
$ cat /proc/496687/smaps | grep -E "^Size:" | awk -F':' '{print $2 }' | awk 'BEGIN {sum=0} {sum+=$1} END {print sum}'
6466352
以下是 THP 的设置:
$ cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
$ cat /sys/kernel/mm/transparent_hugepage/defrag
always defer defer+madvise [madvise] never
$ cat /sys/kernel/mm/transparent_hugepage/shmem_enabled
always within_size advise [never] deny force
系统信息如下,我们还关闭了交换,因此没有交换缓存:
$uname -a
Linux 4.14.15-1.el7.elrepo.x86_64 #1 SMP Tue Jan 23 20:28:26 EST 2018 x86_64 x86_64 x86_64 GNU/Linux
$cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.9 (Maipo)
那么是什么原因导致 ps / top 中的 RSS 远低于 cgroup memory.stat 中的 RSS?
根据 https://kernel.org/doc/Documentation/cgroup-v1/memory.txt 中的文档,cgroup memroy.stat 中的 rss 包括“透明的 hugepages”,THP 是否也计入 ps / top 的 RSS 显示?
如果它是由 THP 引起的,它影响内存记帐的机制是什么?
答: 暂无答案
评论