FreeBSD如何分配内存?


9

我知道,这是简化/广义的解释,但top(1)效用共分FreeBSD的内存分为六个pools- ActiveInactiveWiredCacheBuffersFreetop(1)输出示例:

Mem: 130M Active, 42M Inact, 51M Wired, 14M Cache, 34M Buf, 648K Free
Swap: 512M Total, 512M Free

Active由运行中的进程Wired使用,主要用于内核。Inactive是关闭的进程中的内存,如果需要重用,它仍会缓存,Cache是缓存的数据,Buffers是磁盘缓冲区(我想它与cachedLinux free(1)输出(?)类似),并且Free是完全未使用的内存。我是正确的是FreeBSD内核自动分配的空间InactiveCacheBuffersActive或者Wired如果需要的话?

Answers:


13

简而言之,活动有线使用的内存不应或不能交换为可用内存。虽然可以将非活动状态适当地换出,但仍由进程或内核拥有(不释放),因此这不是占用大量内存的内存,但仍在使用。

新的是洗衣程序,它是脏内存页面的列表,可能需要将其写入交换设备。不管是否需要交换脏内存,都将它们重新添加到非活动队列中。

为了安全(在内核的情况下)或在用户级进程优化(如ZFS)方面,不应交换有线内存。有线内存用于文件系统的高速缓存,内核可能会释放它们。至少对于ZFS来说,这可以看作是大部分的空闲内存。

空闲内存绝对是免费的。

缓存(我想现在已弃用)已准备就绪,可以释放,因为它已经换出,并且只有在那里可以重新分配。

缓冲区被大多数文件系统(UFS,FAT,...)用作缓存,并且是文件系统使用的内存量。它可以是actice,非活动状态或有线状态。

ARC(自适应替换缓存)是ZFS使用的缓存,它是可以在需要时释放的内存。

内存上FreeBSD Wiki

记忆类别

活性

  • 包含用户区“最近”(主动)引用的页面
  • 包含干净页面和脏页面
  • 页面由后台驻留程序定期扫描(每个页面每vm.pageout_update_period秒访问一次)
  • 扫描检查自上次扫描以来是否已引用该页面
  • 如果完成了足够的扫描而没有看到参考,则页面将移至非活动队列
  • 实现伪LRU

不活跃

  • 包含活动队列中已过期的页面
  • 包含从缓冲区缓存中逐出的页面
  • 包含干净页面和脏页面
  • 当内存不足时,页面守护程序将扫描页面(从队列的开头开始):
    • 被引用的页面移回到活动队列或非活动队列的尾部
    • 脏的页面被移到洗衣队列的尾部
    • 未引用的干净页面可以立即释放并重新使用
  • 实施第二次LRU

洗衣房

  • 用于管理脏的不活动页面的队列,必须对其进行清理(“清洗”)后才能重新使用它们
  • 由单独的线程(洗衣线程)而不是页面守护程序管理
  • 洗衣线程洗少量页面以平衡非活动队列和洗衣队列
  • 洗钱频率取决于:
    • 页面守护程序正在释放多少个干净页面;更多的自由有助于提高洗钱频率
    • 洗衣队列相对于非活动队列的大小;如果洗衣队列增加,我们将更频繁地洗涤
  • 页面由洗衣线程扫描(从队列的开头开始):
    • 被引用的页面被移回到活动队列或洗衣队列的尾部
    • 清洗脏页面,然后将其移到不活动队列的开头附近

自由

  • 可供系统其余部分使用的内存。

有线

  • 不可分页的内存:只有所有者明确释放后才能释放
  • 可以通过mlock(2)连接Userland内存(受系统和每个用户的限制)
  • 内核内存分配器返回有线内存
  • ARC和缓冲区缓存的内容已连接
  • 一些内存是永久连接的,永远不会释放(例如,内核文件本身)

FreeBSD操作系统的设计和实现章节6.12页面替换(不再完全准确,但是这里是对旧问题的参考):

内核将主内存分为五个列表:

  1. 有线:有线页面已锁定在内存中,无法分页。通常,这些页面被内核或物理内存页面程序使用,或者它们已被mlock锁定。此外,用于容纳已加载(即未换出)进程的线程堆栈的所有页面也都已连接。
  2. 活动的:活动页面被虚拟内存的一个或多个区域使用。尽管内核可以将它们分页出去,但是这样做很可能会导致活动进程再次将其故障恢复。
  3. 不活动:不活动的页面可能很脏,内容仍然是已知的,但是它们通常不是任何活动区域的一部分。如果页面的内容脏了,必须先将内容写入后备存储,然后才能重新使用页面。页面清理完毕后,将其移至缓存列表。如果系统内存不足,那么分页守护程序可能会尝试将活动页面移至非活动列表,以期找到未真正使用的页面。Pageout守护程序用来选择要从活动列表移动到非活动列表的页面的选择标准将在本节后面介绍。当空闲内存和缓存列表降低到较低时,分页守护程序会遍历非活动列表以创建更多缓存和空闲页面。
  4. 缓存:缓存页面的内容仍然是已知的,但它们不是映射的一部分。如果它们故障进入活动区域,则它们不属于任何映射。如果它们在活动区域​​内发生故障,则将它们从缓存列表移至活动列表。如果将它们用于读取或写入,则将它们从缓存列表首先移至缓冲区缓存,最后释放到非活动列表。一个m锁系统调用可以回收从缓存列表的页面,并将其连接。高速缓存列表中的页面与不活动页面相似,除了它们不脏之外,这是因为自页面进入页面以来未对其进行修改,或者因为页面已被写入其后备存储。需要页面时,可以要求它们有新用途。
  5. 免费:免费页面没有有用的内容,将用于满足新的页面错误请求。

回答您的原始问题

如果需要,我是否正确认为FreeBSD内核会自动将空间从“非活动”,“高速缓存”和“缓冲”池分配到“活动”或“有线”?

如果活动页面一段时间未使用,它们可能会变得不活动。如果内核换出了非活动页面,则该页面将移至缓存列表。页面在缓存列表不是任何进程的虚拟映射的一部分,但可以很容易地被回收,作为活性有线。或在需要I / O作为缓冲区高速缓存时使用。

不能将有线内存换出主内存。如果通过进程进行了连接,则需要将其与munlock调用断开连接,以再次成为活动内存。

活动非活动有线内存可以由进程或内核释放,并添加到空闲列表中。


我刚在最初的问题中发现一个错误。我问:“我是正确的是FreeBSD内核自动分配空间InactiveWiredCacheBuffersActive或者Wired如果需要的话?” 而我的意思是问“我是否纠正FreeBSD内核自动分配空间InactiveCacheBuffers到游泳池ActiveWired如果需要的话?”。我更新了最初的问题。所以,简单地说,在FreeBSD中使用的内存Wired+ Active,如果这两个池需要额外存储器金额,然后这是取自InacativeCachedBuffersFree池?
马丁

@马丁是的,听起来不错。我更新了对您问题的回答。
拉斐尔·阿伦斯
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.