如何诊断不断膨胀的 OS X kernel_task 和有线内存使用情况?

如何诊断不断膨胀的 OS X kernel_task 和有线内存使用情况?

我遇到了一个非常奇怪的问题,我很难诊断其根本原因。

我有一个Mac Pro(2008 年,8 核 2.8 GHz,8800GT),配备 14 GB RAM(最近因为这个问题而升级!)。

当我启动系统并登录时,vm_stat /top/Activity Monitor 将显示 kernel_task 已分配大约 150 MB,并且机器已分配大约 800 MB 的有线内存。

即使是在刚开始时,在没有应用程序运行的情况下,800 MB 似乎也是一个很大的有线内存分配量 - 但情况会变得更糟。(注:有线是锁定,不可交换记忆)

在很短的时间之后,有时通过诸如启动终端这样简单的操作触发,kernel_task 将膨胀到 8-900 MB 的实际内存 (RSIZE),并且有线内存将加速到 1.6 GB(意味着所有额外的内存请求都是针对内核中的有线 RAM)。

如果我退出所有程序(即:不运行任何应用程序,禁止活动监视器或终端查看顶部),kernel_task RSIZE 或 Wired Memory 使用量都不会明显减少。反过来,在系统中加载任务也表明 Wired Memory 不会减少 - 而且重要的是,它不会因为大量交换而减少。

如果我注销并再次登录,它会减少一点(450 MB kernel_task,1.28 GB 有线),但不会回到开始。

我没有做任何疯狂的事情内核扩展s - 此外,kextstat 显示那里没有大量的内存分配;最大的是 com.apple.nvidia.nv50hal,大约有 4 MB 内存。

当这种情况发生时,机器整体感觉更加迟缓 - 这并不奇怪,因为如此大量的 RAM 被标记为不可分页。

我有几个问题:

1) 有没有好的方法来诊断分配了所有这些有线内存的原因?它通常是 kernel_task 大小的 2 倍以上,没有运行任何应用程序。实际内存总量似乎不合算 - 似乎有一大堆 RAM 未被考虑在内。

2)发生了什么,导致内核突然需要6倍的内存?

答案1

要调查为什么内核比平时使用了更多的内存,您可以使用不同的工具。

  1. 跑步活动监视器检查哪些进程使用了​​最多的内存,因此它要么是kernel_task,而不是任何其他比平常使用更多内存的任务(然后考虑终止它)。
  2. 在终端中运行vm_stat 1以查看实时内存统计信息以及您的内存是否真的每秒都在增加。
  3. 运行fs_usage(以 root 身份)工具来实时监控系统调用和页面错误。
  4. 要检查在终端中运行的多个进程的脏/匿名分配的总和:

    sudo footprint -all -categories -swapped -collapseSharing
    

    它将收集内存信息,例如交换了多少内存(每个用户或内核内存)。

  5. 此外,如果您认为内核使用了最多的内存,请尝试zprint以下工具:

    sudo zprint -t -s | head -n20
    

    它将显示有关内核区域的信息

如果您想强制清除磁盘缓存(以释放一些内存),您可以尝试:

sync && sudo purge

也可以看看:如何调查内核任务内​​存使用率过高?在 AD SE

答案2

内核扩展只是操作系统可以在您不知情的情况下执行的众多代码片段之一。我有一个名为 Consultant's Canary 的基于 Python 的小型实用程序,可以帮助您找到其中的很多代码片段:

如果没有发现任何潜在的罪魁祸首,那么我会说从全新安装启动并看看是否可以在那里重现该问题。

相关内容