进程的 RSS 内存远低于 cgroup memory.stat 中的 RSS

rss memory for process is much lower than the rss in cgroup memory.stat

提问人:jim 提问时间:11/16/2023 最后编辑:Adrianjim 更新时间:11/16/2023 访问量:56

问:

我们有一个 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 引起的,它影响内存记帐的机制是什么?

Linux Docker 内核 cgroups

评论


答: 暂无答案