Solaris 可调参数参考手册

UFS 参数

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 发行版)

ndquot

说明

定义应为 UFS 文件系统分配的配额结构数。仅当在一个或多个 UFS 文件系统上启用配额时才关系到此参数。鉴于历史原因,不需要 ufs: 前缀。

数据类型

带符号整数

缺省值

((maxusers x 40) / 4) + max_nprocs

范围

0 到 MAXINT

单位

配额结构

是否为动态

验证

无。值过大将使系统挂起。

何时更改

缺省配额结构数不足时。在这种情况下,会在控制台上显示或在消息日志中写入以下消息:


dquot table full
承诺级别

不稳定

ufs_ninode

说明

指定要在内存中保存的 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_WRITES 为非零值,则会检查未在文件中写入的字节数。请参见 ufs_HW 以确定在只有 ufs_LW 个字节未完成之前,应该执行写入还是延迟写入。将基于每个文件跟踪未完成的总字节数,这样如果某个文件超过限制,不会影响向其他文件中写入。

数据类型

带符号整数

缺省值

1(启用)

范围

0(禁用)或 1(启用)

单位

切换(开/关)

是否为动态

验证

何时更改

希望 UFS 写入限制完全关闭时。如果 I/O 容量不足,则禁用此参数会导致磁盘具有较长服务队列。

承诺级别

不稳定

ufs_LWufs_HW

说明

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_LWufs_HW 才有意义。应该同时更改 ufs_HWufs_LW,以免在以下情况下进行不必要的调整:进程唤醒并且发现它们无法执行写入(当 ufs_LWufs_HW 太相近时)或者它们等待的时间可能大于所需的时间(当 ufs_LWufs_HW 相差太大时)。

何时更改

当文件系统由条带化卷组成时,请考虑更改这些值。可用的聚集带宽会很容易超过 ufs_HW 的当前值。但是,此参数并非每文件系统设置。

ufs_throttles 为关键数值时,也可能要考虑更改此参数。当前,ufs_throttles 只能使用内核调试程序进行访问。

承诺级别

不稳定

freebehind

说明

启用 freebehind 算法。启用此算法之后,如果在内存使用率过高时检测到顺序 I/O,则系统会跳过新读取的块中的文件系统高速缓存。

数据类型

布尔值

缺省值

1(启用)

范围

0(禁用)或 1(启用)

是否为动态

验证

何时更改

可以非常容易地执行 freebehind 算法。如果不期望执行重要的顺序文件系统活动,则禁用 freebehind 可确保将在文件系统页高速缓存中保留所有文件(不论规模多大)。有关更精细的调优,请参见 smallfile

承诺级别

不稳定

smallfile

说明

确定文件的大小阈值,如果文件大于此值,则在 freebehind 算法下,不进行高速缓存保留。

大内存系统包含的内存足以高速缓存数以千计的 10 MB 文件,而不会引起严重的内存需求问题。但是,这种情况在很大程度上与应用程序相关。

smallfilefreebehind 参数的目标是重复使用高速缓存的信息,而不会因为高速缓存过多而导致内存不足。

数据类型

带符号整数

缺省值

32,768

范围

0 到 2,147,483,647

是否为动态

验证

何时更改

如果应用程序按顺序读取适度大小的文件并很有可能从缓冲中受益,同时系统不存在可用内存不足的压力,则增大 smallfile。适度大小的文件是指大小为 32 KB 到 2 GB 的文件。

承诺级别

不稳定