我正在寻找了解的关系
container_memory_working_set_bytes vs process_resident_memory_bytes vs total_rss (container_memory_rss) + file_mapped以便更好地配备系统以提醒 OOM 可能性。
如果容器/pod 正在运行单个进程执行用 Go 编写的编译程序,这似乎违背了我的理解(这让我现在感到困惑) 。
为什么两者之间的差异container_memory_working_set_bytes
如此之大(近 10 倍)process_resident_memory_bytes
和之间的关系在这里container_memory_working_set_bytes
也container_memory_rss + file_mapped
很奇怪,我没想到,读完这里
匿名和交换缓存内存的总量(包括透明的大页),它等于 memory.status 文件中的 total_rss 的值。这不应与真正的驻留集大小或 cgroup 使用的物理内存量相混淆。rss + file_mapped 将为您提供 cgroup 的常驻集大小。它不包括被换出的内存。只要这些库中的页面实际上在内存中,它就包含来自共享库的内存。它确实包括所有堆栈和堆内存。
所以cgroup
总驻留集大小是rss + file_mapped
这个值如何小于container_working_set_bytes
在给定 cgroup 中运行的容器
这让我对这些统计数据感到有些不对劲。
以下是用于构建上述图表的 PROMQL
- process_resident_memory_bytes{container="sftp-downloader"}
- container_memory_working_set_bytes{container="sftp-downloader"}
- go_memstats_heap_alloc_bytes{container="sftp-downloader"}
- container_memory_mapped_file{container="sftp-downloader"} + container_memory_rss{container="sftp-downloader"}