小牛和优胜美地的“记忆压力”坚持什么规模或尺度?


Answers:


51

内存压力并不是衡量可用内存百分比的简单指标,似乎是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_pressureMavericks引入了一个新命令,当我运行它以将内存子系统驱动到警告状态时,您会看到内存压力增加到黄色范围。

sudo memory_pressure -l warn </ code>的活动监视结果

该工具拨款约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被分页到磁盘,我就不想填满我的驱动器并退出该工具。

sudo memory_pressure -lcritical </ code>的活动监视结果

您可以观察到警告结束后系统释放RAM的速度,以及它如何进入“红色”区域以表明虚拟内存系统无法压缩足够的页面以避免交换到磁盘。我的有根据的猜测是,压力是红色的,它表示交换和急剧的过度分配,并且/或者空闲页面的时间低于系统希望的数量,并且它正在主动清除不活动的页面和/或预期用于交换的页面。同样,释放分配并减轻虚拟内存系统的压力后,系统即可快速恢复。


谢谢你的澄清。我想知道上面的屏幕截图中是否有一个命令(或一组命令)来计算虚拟内存,文件缓存和应用程序内存参数。
穆罕默德·哈桑·纳斯

@MuhammadHassan以下答案涵盖了该算法的一个不错的逆向工程摘要,并指出了在xnu开源中寻找内部组件的位置。我已经抽取了涵盖的4个与GUI压力显示最相关的值。
bmike

30

为了更清楚地说明问题,使之更加准确:内存压力是内核(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下载。两者都向您显示了压力“表”以及压力事件。


该网站上还有一篇详细的文章-newosxbook.com/articles/MemoryPressure.html-详细介绍了OS X和iOS中的内存压力和处理
2013年

关于Mavericks和iOS内核之间异同的绝佳细节。感谢您链接到Process Explorer。
bmike

14

内存压力由马赫内部保留的两个计数器定义:

  • 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

如果可用页面数量低于目标数量-我们将面临压力。


http://newosxbook.com/articles/MemoryPressure.html

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.