定义用于高速缓存 I/O 缓冲区的最大内存量。这些缓冲区用于写入文件系统元数据(超级块、inode、间接块和目录)。可以根据需要分配缓冲区,直到要分配的内存量(以 KB 为单位)超过 bufhwm 为止。此时,将从高速缓存存储区中刷新元数据,直到回收的缓冲区足以满足请求为止。
鉴于历史原因,bufhwm 不需要 ufs: 前缀。
带符号整数
物理内存的 2%
80 KB 到物理内存的 20% 与 2 TB 之间的较小值。因此,bufhwm_pct 可以介于 1 到 20 之间。
bufhwm:KB
bufhwm_pct:物理内存的百分比
否。仅在系统初始化时确定 bufhwm 和 bufhwm_pct 以计算散列桶大小。此后,将根据这些参数计算的限制(以字节为单位)存储到可在分配和解除分配缓冲区时调整此值的数据结构中。
在正在运行的系统上,不遵守封锁协议而直接尝试调整此值可能会导致错误操作。
运行时修改 bufhwm 或 bufhwm_pct 没有任何效果。
如果 bufhwm 小于其下限 80 KB 或大于其上限(物理内存的 20%、2 TB 以及最大内核堆大小的 1/4 之中的最小者),则将其重置为上限。如果尝试使用无效值,则会在系统控制台上和 /var/adm/messages 文件中显示以下消息:
"binit: bufhwm (value attempted) out of range (range start..range end). Using N as default." |
"value attempted" 是指 _nolinebreak>/etc/system 文件中指定的值或者使用内核调试程序指定的值。N 是系统基于可用系统内存计算所得的值。
同样,如果 bufhwm_pct 的设置值不在 1% 到 20% 的允许范围内,则将其重置为缺省值 2%。并且,将在系统控制台上和 /var/adm/messages 文件中显示以下消息:
"binit: bufhwm_pct(value attempted) out of range(0..20). Using 2 as default." |
如果同时将 bufhwm 和 bufhwm_pct 设置为非零值,则 bufhwm 优先。
由于只在需要时分配缓冲区,因此,缺省设置的开销必须满足缓冲区散列头控制结构的内存分配需求。在 32 位内核上,这些结构在每个潜在缓冲区占用 52 个字节;在 64 位内核上,在每个潜在缓冲区占用 96 个字节。
在 512 MB 的 64 位内核上,散列链数计算为 10316 / 32 == 322,最多可扩展到 2 的下一个整数幂,即 512。因此,散列头将占用 512 x 96 字节,或 48 KB。散列头分配假设缓冲区大小为 32 KB。
通过使用内核调试程序查看内核中的 bfreelist 结构,可以找出缓冲池中尚未分配的内存量。结构中的关键字段为 b_bufsize,此字段是指可能的剩余内存(以字节为单位)。可以使用 mdb 命令通过 buf 宏查看此字段:
# mdb -kLoading modules: [ unix krtld genunix ip nfs ipc ] > bfreelist::print "struct buf" b_bufsize b_bufsize = 0x225800 |
在此内存为 6 GB 的系统上,bufhwm 的缺省值为 122277。不能确定使用的头结构数,因为请求的实际缓冲区大小通常大于 1 KB。但是,可以从此系统的控制结构分配中有利地回收一些空间。
512 MB 系统上的相同结构显示了 10144 KB 中只有 4 KB 尚未分配。使用 kstat -n biostats 检查 biostats kstat 时,还会发现系统具有合理的 buffer_cache_hits 与 buffer_cache_lookups 的比率。同样,系统的缺省设置也比较合理。
不稳定
有关信息,请参见bufhwm(Solaris 9 发行版)。