我正在寻找 Linux 内核提供的计数器,用于计算系统上任务执行的内存分配数量。我想使用 Prometheus 观察该计数器的高速变化,以便检测机器上的某些任务何时执行一些愚蠢的操作,例如在循环中分配内存。
我发现了一堆不同的指标,它们似乎是仪表,即代表机器当前状态的数字。示例包括nr_free_pages
和kbhugused
。这些测量当前可用或已使用的东西的数量,但由于一项任务分配例如一页,然后再次释放它,将导致仪表没有变化,这些对我来说没什么用处。
我在 IRC 上遇到的一个想法是是否有一个计数器来记录被调用的次数brk(2)
,但我很快就找到了它不是唯一用于分配内存的系统调用。
现在我正在查看pgalloc_normal
in /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
。