给定的Mac应用程序使用多少交换空间?


15

有什么方法可以判断在Mac OSX(10.2+)上运行的特定应用程序是否已将其部分内存换出(即,换成其中一个/private/var/vm/swapfile*文件)?多少钱?

赏金(150 rps)

简单的问题。如果我在悬赏期满后不到两天的时间内看到第一个正确答案,则该答案会被接受。如果我还没有,那我将把它奖励给那些告诉我最有趣的新事实的人。如果我从任何答案中都没有学到任何东西,我将把赏金奖励给写得最多的人。


这是一个不好的问题。您正在寻找的数字将会改变,因为您正在尝试测量它(想想海森堡不确定性原理)。此外,它将根据所有其他应用程序及其内存要求,IO模式和进程优先级始终在变化。如果找到该数字,除非您正在编辑OS代码,否则对您没有任何好处,因为从应用程序的角度来看,您几乎不需要做任何更改。
gavaletz 2010年

3
@gavaletz:今天早上起床了吗?我想要Linux使用/ proc / $ pid / smaps可以进行的交换分析。通常,我可以用耳朵识别突然的交换活动爆发,因此我对gavaletz的不确定性原理不太感兴趣。
查尔斯·斯图尔特

Answers:


13

我一直在大量搜索;-)据我了解,给定进程的虚拟内存被分成页面,这些页面由操作系统处理并呈现给应用程序,就好像它是RAM。

在OS X中,基于Mach内核,这由称为的守护程序处理dynamic_pager/private/var/vm正如您提到的,此过程将生成交换文件。这些交换文件不是基于每个应用程序生成的,而是基于“需要的内存”生成的。交换文件分为4096字节的页面,然后将页面分配给需要虚拟内存的进程(操作系统认为)。因此,您不能将交换文件与给定的应用程序相关联,但是可以看到给定进程正在使用多少页。

您可能想vm_stat在Termial中尝试该命令。这为您提供了VM使用情况的统计信息(请注意,“页面大小”乘以活动页面数等于交换文件的大小)。这也解释了为什么使用VM可以有多个进程,但是只有几个交换文件。

其他有趣的命令是vmmap [process id]pagestuff


顺便说一句,如果您想了解更多信息,请查看developer.apple.com/mac/library/documentation/Darwin/Conceptual / ...。
trolle3000

这看起来很有希望。这似乎为问题的第一部分提供了明确的答案,并暗示了对第二部分的具体答案。我需要进一步挖掘...
Charles Stewart 2010年

是不是vmmap [pid]还是vmmap -pages [pid]你的问题的第二部分的答案吗?
trolle3000,2010年

vmmap $ pid确实提供了有关其归类为可写区域的明确信息。它不能区分只读区域的已分配内存(即可交换内存)和已交换内存,但是也许区别并不那么重要。我明天很可能会接受这个答案。
查尔斯·斯图尔特

5

vmmap PID命令应为您提供一些有关给定进程的有用统计信息。


甚至vmmap [A​​ppName]都可以使用
Studer 2010年

4

基于此处发布的想法,我创建了以下几行代码:

sudo vmmap notifyd | grep -A3 'Summary'

显示vmmap输出的Summary部分(3行)。我notifyd在此示例中使用过,但是您可以将其替换为您知道的任何PID。

该行将尝试列出所有正在运行的进程的所有Summary行。显然有些会失败,因为它们的进程ID已经消失(进程结束),但是总的来说,我发现这是滚动浏览内存信息列表并找出顶部交换器的好方法。

ps -o pid= -xa | awk '{print $1}' | xargs -n 1 sudo vmmap | grep -A3 'Summary'

编辑:一些匿名用户看到最后一个命令行需要改进,因为显然原始变体不再起作用。因此,非常感谢您,无论您是谁,都很抱歉,您的编辑被拒绝了。(第一个命令以前读为“ ps xa”,由于ps标题被抛出,导致vmmap失败)

进一步改进:如果您想立即知道程序的名称,请使用此小更改

ps -o pid= -xa | awk '{print $1}' | xargs -n 1 sudo vmmap | egrep 'swapped_out|Path'

在此命令的另一端稍作修改,就可以筛选某些程序名称或命令行路径组件。在这里,我们仅查看“ Library / PrivateFrameworks”中的所有过程。

ps -o pid,command= -xa | grep 'Library/PrivateFrameworks' | awk '{print $1}' | xargs -n 1 sudo vmmap |

我收到很多失败的消息,说vmmap不能作为32个进程启动,但会停止xargs。为了让卡片继续,我做了ps -o pid= -xa | awk '{print $1}' | xargs -n 1 -I{} bash -c ‘sudo vmmap {} || true’ | egrep 'swapped_out|^Path:|^Process:'。它仍然不会在ctrl + c上停止,但也不会在vmmap错误上停止。
ShadSterling

0

在/ Applications / Utilities文件夹中打开“活动监视器”,然后有一个“虚拟内存”列将告诉您这一点。您可以单击“虚拟内存”标题以按应用程序使用最多或最少的顺序进行排序。另外,请确保将“我的进程”更改为“所有进程”,并注意一个应用程序可能具有多个进程。例如,第三方应用程序Little Snitch由“ Little Snitch网络监视器”和“ Little Snitch UIAgent”组成。


4
错了 虚拟内存中的nubmer列是当前RAM中以及交换时mmaped文件中的内存总和,我不知道还有什么。
Tadeusz A.Kadłubowski10年

你确定吗?苹果没有提及它support.apple.com/kb/TA20517
ridogi 2010年

1
VM号衡量已分配但尚未实际使用的数量。交换文件将具有实际使用的文件。
Chealion 2010年

@Chealion:如何定义已分配但未实际使用的内存?
Tadeusz A.Kadłubowski10年

@tkadlubo:在这种情况下,我相信这只是声明的可用于进程的VM大小与分页到磁盘的实际页面之间的差异。除了注意到虚拟机号和磁盘上的交换文件不同之外,我不确定如何定义它。
Chealion 2010年

0

正如ridogi所说,打开“活动监视器”。导航到您要检查的过程,然后单击...检查!然后单击内存;这将告诉您给定进程使用了​​多少交换。

玩得开心!


3
检查页面告诉我各种有趣的事情,这些问题与问题的答案是正相关的,例如#pagefaults,#pageins和mmapped文件列表,但没有找到我要解决的问题的实际答案。
查尔斯·斯图尔特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.