zer*_*uit 12 memory monitoring containers kubernetes
我需要监控在 kubernetes 集群上运行的容器内存使用情况。阅读一些文章后,有两个建议:“container_memory_rss”、“container_memory_working_set_bytes”
两个指标的定义都说了(来自 cAdvisor 代码)
我认为这两个指标都代表进程使用的物理内存上的字节大小。但是我的 grafana 仪表板中的两个值之间存在一些差异。
我的问题是:
OhH*_*ark 14
你是对的。我将尝试更详细地解决您的问题。
两个指标有什么区别?
container_memory_rss
等于total_rss
来自/sys/fs/cgroups/memory/memory.status
文件的值:
// The amount of anonymous and swap cache memory (includes transparent
// hugepages).
// Units: Bytes.
RSS uint64 `json:"rss"`
Run Code Online (Sandbox Code Playgroud)
匿名和交换缓存内存的总量(包括透明大页面),它等于total_rss
来自memory.status
文件的值。这不应与resident set size
cgroup 使用的真实或物理内存量混淆。rss + file_mapped
会给你 cgroup 的常驻集大小。它不包括换出的内存。它确实包括来自共享库的内存,只要这些库中的页面实际上在内存中。它确实包括所有堆栈和堆内存。
container_memory_working_set_bytes
(正如 Olesya 已经提到的)是total usage
- inactive file
。它是估计有多少内存不能被驱逐:
// The amount of working set memory, this includes recently accessed memory,
// dirty memory, and kernel memory. Working set is <= "usage".
// Units: Bytes.
WorkingSet uint64 `json:"working_set"`
Run Code Online (Sandbox Code Playgroud)
工作集是此进程的工作集的当前大小(以字节为单位)。工作集是进程中线程最近触及的内存页集。
哪些指标更适合监控内存使用情况?一些帖子说两者都是因为这些指标之一达到了限制,然后该容器被 oom 杀死了。
如果您限制了pod的资源使用,那么您应该同时监控两者,因为如果它们达到特定的资源限制,它们将导致 oom-kill。
我还推荐这篇文章,其中显示了解释以下断言的示例:
您可能认为使用 可以轻松跟踪内存利用率
container_memory_usage_bytes
,但是,该指标还包括可以在内存压力下逐出的缓存(想想文件系统缓存)项目。更好的指标是container_memory_working_set_bytes
因为这是 OOM 杀手正在关注的。
编辑:
添加一些额外的来源作为补充:
实际上这不是一个答案,而是作为对已接受答案的增强。以下注释适用于 cgroup v1,可能不适用于 cgroup v2。
container_memory_working_set_bytes
(正如 Olesya 已经提到的)是total usage
-inactive file
。这是对无法驱逐的内存量的估计:
第一句话是正确的,但是不能被驱逐的注释是不正确的:至少,container_memory_working_set_bytes
包括 所呈现的值total_active_file
,可以通过以下方式驱逐:
echo 1/2/3 > drop_caches
本期提到的,请参阅此链接了解值 1/2/3 的含义echo 0 > memory.force_empty
cgroup 文档第 5.1 节提到因此,以下结论也可能不正确:
如果您限制 pod 的资源使用,那么您应该监控这两个容器,因为如果它们达到特定的资源限制,它们将导致 oom-kill。
container_memory_working_set_bytes
达到限制实际上可能不会导致 oom-kill,至少在我们的环境中没有发生 oom-kill。在我们的环境中,我们监控到total_active_file
不断增加,因此不断container_memory_working_set_bytes
增加container_memory_working_set_bytes
,达到极限后,total_active_file
由于内存回收而下降到较低值,因此container_memory_working_set_bytes
也下降到较低值,pod一直在运行,没有被杀死。
实际上,关于该指标已经存在两个问题(this和thiscontainer_memory_working_set_bytes
) ,但是没有一个得到解决。在我们的环境中,我们现在正在监视container_memory_rss
而不是container_memory_working_set_bytes
由于上述错误警报。
归档时间: |
|
查看次数: |
6521 次 |
最近记录: |