我遇到了一个非常奇怪的问题,我很难诊断其根本原因。
我有一个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
要调查为什么内核比平时使用了更多的内存,您可以使用不同的工具。
- 跑步活动监视器检查哪些进程使用了最多的内存,因此它要么是
kernel_task
,而不是任何其他比平常使用更多内存的任务(然后考虑终止它)。 - 在终端中运行
vm_stat 1
以查看实时内存统计信息以及您的内存是否真的每秒都在增加。 - 运行
fs_usage
(以 root 身份)工具来实时监控系统调用和页面错误。 要检查在终端中运行的多个进程的脏/匿名分配的总和:
sudo footprint -all -categories -swapped -collapseSharing
它将收集内存信息,例如交换了多少内存(每个用户或内核内存)。
此外,如果您认为内核使用了最多的内存,请尝试
zprint
以下工具:sudo zprint -t -s | head -n20
它将显示有关内核区域的信息
如果您想强制清除磁盘缓存(以释放一些内存),您可以尝试:
sync && sudo purge
也可以看看:如何调查内核任务内存使用率过高?在 AD SE