Solaris 可调参数参考手册

bufhwmbufhwm_pct

说明

定义用于高速缓存 I/O 缓冲区的最大内存量。这些缓冲区用于写入文件系统元数据(超级块、inode、间接块和目录)。可以根据需要分配缓冲区,直到要分配的内存量(以 KB 为单位)超过 bufhwm 为止。此时,将从高速缓存存储区中刷新元数据,直到回收的缓冲区足以满足请求为止。

鉴于历史原因,bufhwm 不需要 ufs: 前缀。

数据类型

带符号整数

缺省值

物理内存的 2%

范围

80 KB 到物理内存的 20% 与 2 TB 之间的较小值。因此,bufhwm_pct 可以介于 1 到 20 之间。

单位

bufhwm:KB

bufhwm_pct:物理内存的百分比

是否为动态

否。仅在系统初始化时确定 bufhwmbufhwm_pct 以计算散列桶大小。此后,将根据这些参数计算的限制(以字节为单位)存储到可在分配和解除分配缓冲区时调整此值的数据结构中。

在正在运行的系统上,不遵守封锁协议而直接尝试调整此值可能会导致错误操作。

运行时修改 bufhwmbufhwm_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."

如果同时将 bufhwmbufhwm_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_hitsbuffer_cache_lookups 的比率。同样,系统的缺省设置也比较合理。

承诺级别

不稳定

更改历史记录

有关信息,请参见bufhwm(Solaris 9 发行版)