小牛的(以及优胜美地的)活动监视器显示了一个新的图表,即内存压力。可悲的是,它的帮助文本仅模糊地解释了它的精确度量。记忆压力如何计算?
图片信誉来自于有关Mavericks最佳新功能的民意调查问题的答案。
小牛的(以及优胜美地的)活动监视器显示了一个新的图表,即内存压力。可悲的是,它的帮助文本仅模糊地解释了它的精确度量。记忆压力如何计算?
图片信誉来自于有关Mavericks最佳新功能的民意调查问题的答案。
Answers:
内存压力并不是衡量可用内存百分比的简单指标,似乎是0到100%的图表。相对于计算的目标来计算的sysctl
值,vm.memory_pressure
该目标跟踪空闲和非活动内存页面与有线和活动页面之间的比率。使用vm_stat
命令行工具可以查看绝对计数器,以检查虚拟内存的详细分配。Jonathan Levin在http://newosxbook.com/articles/MemoryPressure.html上有出色的文档,涵盖了macOS和iOS虚拟内存,以及它们如何计算内存压力以及压力指数高时所采取的措施。
提供计算的相关虚拟内存(vm)vm.memory_pressure
是:
vm.page_free_count
-空闲页面的绝对数量vm.vm_page_free_target
-针对“无压力”情况的计算目标或目标vm.page_free_wanted
-vm系统希望如何减轻当前计算出的压力指数因此,如果您正在使用“活动”监视器跟踪内存压力(或以编程方式或在命令行shell中检查sysctl值),则最好查看以下四个值:
sysctl -a vm | egrep "page_free|pressure"
memory_pressure
Mavericks引入了一个新命令,当我运行它以将内存子系统驱动到警告状态时,您会看到内存压力增加到黄色范围。
该工具拨款约4 GB的内存工具作为压迫图表稳步上升到这种状态显然是“警告”级别图表:sudo memory_pressure -l warn
。如您所见,该系统在压力之前使用了5.9 GB,在压力之后使用了7.99 GB,由于交换和压缩,甚至不需要累加。
观看vm_stat 15
警告结果显示在无可分页的分页后,我退出了该工具(Control-C),然后重新运行该工具以使内存压力变得至关重要:sudo memory_pressure -l critical
分页开始时,我没有让它运行超过几分钟,一旦该工具说我有5 GB的RAM被分页到磁盘,我就不想填满我的驱动器并退出该工具。
您可以观察到警告结束后系统释放RAM的速度,以及它如何进入“红色”区域以表明虚拟内存系统无法压缩足够的页面以避免交换到磁盘。我的有根据的猜测是,压力是红色的,它表示交换和急剧的过度分配,并且/或者空闲页面的时间低于系统希望的数量,并且它正在主动清除不活动的页面和/或预期用于交换的页面。同样,释放分配并减轻虚拟内存系统的压力后,系统即可快速恢复。
xnu
开源中寻找内部组件的位置。我已经抽取了涵盖的4个与GUI压力显示最相关的值。
为了更清楚地说明问题,使之更加准确:内存压力是内核(xnu)使用一个名为memory_status(以前称为Jetsam)的专用线程使用的度量。此线程负责检测可用RAM何时不足-在OS X中这可以强制进行交换,而在iOS中则杀死消耗最大内存的应用程序(因为没有交换)。在Mavericks中,两个OS靠得更近。Memorystatus发出内核注释,Obj-C运行时最终将该注释转换为appDidReceiveLowMemoryWarning。应用应该清除未使用或多余的内存(例如,缓存)。达尔文的libC还会自动清除内存。
有一个特定的(尽管未记录)系统调用vm_pressure_monitor(如果我没记错的话,是#296),它可以使客户端侦听压力事件,并查看可以回收多少物理页。
您可以使用适用于OS X的Process Explorer查看Mavericks上的压力事件-可从http://newosxbook.com/index.php?page=downloads下载。两者都向您显示了压力“表”以及压力事件。
内存压力由马赫内部保留的两个计数器定义:
vm_page_free_count
:目前有多少页RAM可用 vm_page_free_target
:最佳情况下,最少应释放多少页RAM。 您可以使用sysctl轻松看到这些:
morpheus@Zephyr (~/Documents) % sysctl -a vm | grep page_free
vm.vm_page_free_target: 2000
vm.page_free_wanted: 0
vm.page_free_count: 73243
如果可用页面数量低于目标数量-我们将面临压力。