Linux 的内存分配计数器

Linux 的内存分配计数器

我正在寻找 Linux 内核提供的计数器,用于计算系统上任务执行的内存分配数量。我想使用 Prometheus 观察该计数器的高速变化,以便检测机器上的某些任务何时执行一些愚蠢的操作,例如在循环中分配内存。

我发现了一堆不同的指标,它们似乎是仪表,即代表机器当前状态的数字。示例包括nr_free_pageskbhugused。这些测量当前可用或已使用的东西的数量,但由于一项任务分配例如一页,然后再次释放它,将导致仪表没有变化,这些对我来说没什么用处。

我在 IRC 上遇到的一个想法是是否有一个计数器来记录被调用的次数brk(2),但我很快就找到了它不是唯一用于分配内存的系统调用。

现在我正在查看pgalloc_normalin /proc/vmstat,但尚未弄清楚它到底是衡量什么。

你问为什么我们要寻找巨大的内存分配率?因为内存分配是有代价的。您不仅需要在内核空间之间切换,而且内核还具有许多锁,这些锁可以使系统从具有 2 个 CPU、80 个执行线程并行处理数据,变为只有 1 个线程分配内存。这是我们遇到过并希望关注的现实世界场景。

答案1

据我所知,目前还没有现成的计数器,但有很多方法可以跟踪系统调用。我认为最直接的方法是使用perf

sudo perf stat -e syscalls:sys_enter_mmap -e syscalls:sys_enter_brk -I 1000 -a

这将显示每秒的调用次数mmap和调用次数。brk

您可以使用此变体跟踪所有系统调用:

sudo perf stat -e 'syscalls:sys_enter_*' -I 1000 -a

您还可以使用-p和 相关的 pid 而不是 来监视特定进程-a

相关内容