分析 kmalloc 使用情况

分析 kmalloc 使用情况

我似乎在内核空间中存在内存泄漏,slab 显示 kmalloc-4096 不断增长均匀剪辑,直到它垄断系统上的所有 ram 资源并强制交换。

Free 将大部分内存使用情况显示为缓存,但它拒绝在需要时释放,甚至在标记为手动清除时也拒绝释放。我们所看到的一个例子:

$ sudo su -c "free -h && sync && echo 3 > /proc/sys/vm/drop_caches && free -h"
              total        used        free      shared  buff/cache   available
Mem:            15G        4.4G        166M        280M         10G        104M
Swap:           15G        7.8G        8.1G
              total        used        free      shared  buff/cache   available
Mem:            15G        4.4G        186M        280M         10G        115M
Swap:           15G        7.8G        8.1G

我应该分析 kmalloc 以确定泄漏在哪里吗?如果是这样,我该怎么做呢?

这是在 Intel i5 Skylake 上安装的 Ubuntu 16.04 原生版本。

$ uname -a
Linux fire 4.4.0-78-generic #99-Ubuntu SMP Thu Apr 27 15:29:09 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

答案1

“同步”不会减少缓冲区/缓存,它只是请求数据进入块设备。缓存的要点是数据保留在 RAM 缓存中。发送 3 到 drop_caches 也不会等待缓存被删除。你能在“免费”之前加上“睡60分钟”吗?这可能会在报告空闲之前留出一些时间来清除内存。

留下“watch -n60 cat /proc/meminfo”可能有助于显示正在增长的内存区域,但缓存和缓冲并不是单独的泄漏,通过消耗内存,它们正在实现其目的并充分利用系统的可用空间资源。

如果一个进程被交换到磁盘,这并不自动意味着发生了不好的事情。如果该进程没有使用其所有页面并且处于空闲状态,则内核正在做正确的事情,那么在 Web 服务器上,在 mutt 的副本继续运行之前,很有可能需要 www 根目录中的内容例如,用户注销时的 GNU 屏幕。

如果您仍然认为内核通过模块消耗 RAM,您可以使用以下命令进一步检查:

awk '{ print $2" "$1 }' /proc/modules  | sort -n

你用的是ZFS吗?这对 RAM 来说非常饥饿,但与缓存一样,它会尝试将磁盘 IO 保留在 RAM 中,以备不时之需。

相关内容