定义用于高速缓存 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 发行版)。
定义应为 UFS 文件系统分配的配额结构数。仅当在一个或多个 UFS 文件系统上启用配额时才关系到此参数。鉴于历史原因,不需要 ufs: 前缀。
带符号整数
((maxusers x 40) / 4) + max_nprocs
0 到 MAXINT
配额结构
否
无。值过大将使系统挂起。
缺省配额结构数不足时。在这种情况下,会在控制台上显示或在消息日志中写入以下消息:
dquot table full |
不稳定
指定要在内存中保存的 inode 数。Inode 将针对 UFS 进行全局高速缓存,并非以每个文件系统为基础进行高速缓存。
在这种情况下,关键参数为 ufs_ninode。此参数用于计算两个可影响 inode 高速缓存处理的关键限制。将计算高水位标记 ufs_ninode / 2 以及低水位标记 ufs_ninode / 4。
当系统使用一个 inode 运行时,可能会出现以下两种情况之一:
inode 引用的文件不再存在于系统上,因此将删除 inode。删除 inode 之后,空间又可进行 inode 高速缓存,以供其他 inode(将从磁盘读取或针对新文件创建)使用。
文件仍然存在,但是不再由运行的进程引用。随后将 inode 放到空闲队列中。任何引用的页仍在内存中。
当 inode 处于空闲状态时,内核便会将空闲进程向后延迟一段时间。如果文件系统为日志文件系统,则内核还会延迟删除 inode。将有两个内核线程处理这种延迟处理,每个线程负责一个队列。
执行推迟处理时,系统会将 inode 放入删除队列或空闲队列。这两个队列由单独的线程进行处理。将 inode 放到队列时,会根据低水位标记检查队列占用率。如果队列占用率超过低水位标记,则会唤醒与队列关联的线程。唤醒队列之后,线程便会在队列中运行,并将与 inode 关联的所有页强制迁出到磁盘从而释放 inode。当线程删除了唤醒队列时队列中 50% 的 inode 时,便会停止。
如果空闲线程无法跟上负载变化,则使用第二种机制。当系统需要查找 vnode 时,便会执行 ufs_vget 例程。vget 执行的第一项操作是检查空闲队列的长度。如果长度大于高水位标记,则会从空闲队列中去除两个 inode 并将它们“置于空闲状态”(刷新页并释放 inode)。vget 将在获取供自身使用的 inode 之前执行此操作。
系统尝试通过以下操作进行优化:将不包含主存页的 inode 放在空闲列表的开头,将包含页的 inode 放在空闲列表的结尾。但是,系统不对列表中的其他项进行排序。将始终从空闲队列的前部删除 inode。
仅当执行同步、取消挂载或重新挂载时,才从队列中全部删除 inode。
鉴于历史原因,此参数不需要 ufs: 前缀。
带符号整数
ncsize
0 到 MAXINT
Inode
是
如果 ufs_ninode 小于或等于零,则将值设置为 ncsize。
当缺省 inode 数不足时。如果 kstat -n inode_cache 报告的 maxsize reached 字段的值大于 kstat 中的 maxsize 字段的值,则 ufs_ninode 的值可能过小。如果 inode 过于空闲,也可能会出现问题。
可以通过使用 kstat -n inode_cache 查看 inode_cache kstat 来标识过于空闲的 inode。Thread idles 是由后台线程置于空闲状态的 inode,而 vget idles 是指请求进程在使用 inode 之前就将其置于空闲状态的 inode。
不稳定
如果 ufs_WRITES 为非零值,则会检查未在文件中写入的字节数。请参见 ufs_HW 以确定在只有 ufs_LW 个字节未完成之前,应该执行写入还是延迟写入。将基于每个文件跟踪未完成的总字节数,这样如果某个文件超过限制,不会影响向其他文件中写入。
带符号整数
1(启用)
0(禁用)或 1(启用)
切换(开/关)
是
无
希望 UFS 写入限制完全关闭时。如果 I/O 容量不足,则禁用此参数会导致磁盘具有较长服务队列。
不稳定
ufs_HW 指定单个文件中的未完成字节数限制值。如果未完成的字节数大于此值并且设置了 ufs_WRITES,则会延迟写入。通过根据条件变量将执行写入的线程置于休眠状态来延迟写入。
ufs_LW 是单个文件中未完成字节数的限制,如果低于此限制,则会切换其他休眠进程所依赖的条件变量。当写入完成且字节数小于 ufs_LW 时,便会切换条件变量,从而导致所有线程都在等待此变量被唤醒并尝试执行其写入。
带符号整数
对于 ufs_LW,为 8 x 1024 x 1024;对于 ufs_HW,为 16 x 1024 x 1024
0 到 MAXINT
字节
是
无
仅当 ufs_WRITES 不等于零时,ufs_LW 和 ufs_HW 才有意义。应该同时更改 ufs_HW 和 ufs_LW,以免在以下情况下进行不必要的调整:进程唤醒并且发现它们无法执行写入(当 ufs_LW 和 ufs_HW 太相近时)或者它们等待的时间可能大于所需的时间(当 ufs_LW 和 ufs_HW 相差太大时)。
当文件系统由条带化卷组成时,请考虑更改这些值。可用的聚集带宽会很容易超过 ufs_HW 的当前值。但是,此参数并非每文件系统设置。
当 ufs_throttles 为关键数值时,也可能要考虑更改此参数。当前,ufs_throttles 只能使用内核调试程序进行访问。
不稳定
启用 freebehind 算法。启用此算法之后,如果在内存使用率过高时检测到顺序 I/O,则系统会跳过新读取的块中的文件系统高速缓存。
布尔值
1(启用)
0(禁用)或 1(启用)
是
无
可以非常容易地执行 freebehind 算法。如果不期望执行重要的顺序文件系统活动,则禁用 freebehind 可确保将在文件系统页高速缓存中保留所有文件(不论规模多大)。有关更精细的调优,请参见 smallfile。
不稳定
确定文件的大小阈值,如果文件大于此值,则在 freebehind 算法下,不进行高速缓存保留。
大内存系统包含的内存足以高速缓存数以千计的 10 MB 文件,而不会引起严重的内存需求问题。但是,这种情况在很大程度上与应用程序相关。
smallfile 和 freebehind 参数的目标是重复使用高速缓存的信息,而不会因为高速缓存过多而导致内存不足。
带符号整数
32,768
0 到 2,147,483,647
是
无
如果应用程序按顺序读取适度大小的文件并很有可能从缓冲中受益,同时系统不存在可用内存不足的压力,则增大 smallfile。适度大小的文件是指大小为 32 KB 到 2 GB 的文件。
不稳定