本章介绍大多数 Solaris 内核可调参数。
可调参数 |
参考 |
---|---|
NFS 可调参数 | |
Internet 协议套件可调参数 | |
网络高速缓存和加速器 (Network Cache and Accelerator, NCA) 可调参数 |
本节介绍与物理内存和栈配置相关的常规内核参数。
无符号长整数
系统上可用物理内存页数(未将存储核心内核和数据的内存计算在内)
1 到系统上的物理内存量
页
否
无
需要测试使用更少的物理内存运行系统的效果时。由于此参数没有考虑核心内核和数据使用的内存,也没有考虑先前在启动过程中分配的各种其他数据结构使用的内存,因此 physmem 的值应该小于表示较小内存量的实际页数。
不稳定
指定所有线程的缺省栈大小。无法创建任何栈大小小于 default_stksize 的线程。如果设置了 default_stksize,则会覆盖 lwp_default_stksize。另请参见lwp_default_stksize。
整数
在 SPARC 系统上,为 PAGESIZE 的 3 倍
在 x86 系统上,为 PAGESIZE 的 2 倍
在 AMD64 系统上,为 PAGESIZE 的 5 倍
最小值为缺省值:
在 SPARC 系统上,为 PAGESIZE 的 3 倍
在 x86 系统上,为 PAGESIZE 的 2 倍
在 AMD64 系统上,为 PAGESIZE 的 5 倍
最大值为缺省值的 32 倍。
字节,大小为 getpagesize 参数返回的值的倍数。有关更多信息,请参见 getpagesize(3C)。
是。影响更改变量之后创建的线程。
必须大于或等于 8192,并且小于或等于 262,144 (256 x 1024)。同时,还必须是系统页面大小的倍数。如果不满足这些条件,则会显示以下消息:
Illegal stack size, Using N |
值 N 为 default_stksize 的缺省值。
系统由于用完栈空间而发出警告音时。此问题的最佳解决方案是确定系统用完空间的原因,然后再进行更正。
增大缺省栈大小意味着几乎每个内核线程都将具有更大的栈,从而导致无故增加内核内存消耗。通常不会使用增加的空间。消耗增加意味着争用同一内存池的其他资源具有的可用空间量将减少,从而可能会降低系统执行操作的能力。其中一个负面影响是内核可创建的线程数减少。在找出根本原因并解决问题之前,只应将此解决方案作为一种临时解决方法。
不稳定
整数
对于 x86 平台,为 PAGESIZE 的 2 倍
对于 SPARC 平台,为 PAGESIZE 的 5 倍
对于 AMD64 平台,为 PAGESIZE 的 3 倍
最小值为缺省值:
在 SPARC 系统上,为 PAGESIZE 的 3 倍
在 x86 系统上,为 PAGESIZE 的 2 倍
在 AMD64 系统上,为 PAGESIZE 的 5 倍
最大值为缺省值的 32 倍。
字节,大小为 getpagesize 参数返回的值的倍数。有关更多信息,请参见 getpagesize(3C)。
是。影响更改变量之后创建的线程。
必须大于或等于 8192,并且小于或等于 262,144 (256 x 1024)。同时,还必须是系统页面大小的倍数。如果不满足这些条件,则会显示以下消息:
Illegal stack size, Using N |
值 N 为 lwp_default_stksize 的缺省值。
系统由于用完栈空间而发出警告音时。此问题的最佳解决方案是确定系统用完空间的原因,然后再进行更正。
增大缺省栈大小意味着几乎每个内核线程都将具有更大的栈,从而导致无故增加内核内存消耗。通常不会使用增加的空间。消耗增加意味着争用同一内存池的其他资源具有的可用空间量将减少,从而可能会降低系统执行操作的能力。其中一个负面影响是内核可创建的线程数减少。在找出根本原因并解决问题之前,只应将此解决方案作为一种临时解决方法。
不稳定
有关信息,请参见lwp_default_stksize(Solaris 9 发行版)。
允许排队等待传送到 syseventd 守护进程的最大系统事件数。一旦系统事件队列的大小达到此限制,便不再允许向队列中添加任何其他系统事件。
整数
5000
0 到 MAXINT
系统事件
是
每当 ddi_log_sysevent 和 sysevent_post_event 生成系统事件时,系统事件框架都会检查此值。
有关更多信息,请参见 ddi_log_sysevent(9F) 和 sysevent_post_event(3SYSEVENT)。
错误日志消息指示无法记录、生成或发布系统事件时。
不稳定
有关信息,请参见logevent_max_q_sz(Solaris 9 发行版)。
指定可用的内核可分页内存量。此内存主要用于内核线程栈。增大此数值可允许相同数量的线程使用更大的栈或允许存在更多的线程。只能在运行 64 位内核的系统上设置此参数。运行 64 位内核的系统使用的缺省栈大小为 24 KB。
无符号长整数
对于 64 位内核,为 2 GB
对于 32 位内核,为 512 MB
对于 64 位内核,为 512 MB 到 24 GB
8 KB 页
否
将此值与最小值和最大值(对于 64 位系统,分别为 512 MB 和 24 GB)进行比较。如果此值小于最小值或大于最大值,则将其重置为 2 GB,同时显示相关消息。
创建高速缓存时使用的实际大小是验证检查之后在 segkpsize 中指定的值和物理内存的 50% 之间的较小值。
需要支持系统上的大量进程时。缺省大小为 2 GB(假设至少存在 1 GB 的物理内存)。此缺省大小允许为多于 87,000 个的内核线程创建 24 KB 的栈。在 64 位内核中,无论进程是 32 位进程还是 64 位进程,栈的大小都相同。如果所需大小超过此值,则可以增大 segkpsize(假设存在足够的物理内存)。
不稳定
有关信息,请参见segkpsize(Solaris 9 12/02 发行版)。
用于将栈标记为不可执行,这样可阻止缓冲区溢出攻击。
缺省情况下,运行 64 位内核的 Solaris 系统将所有 64 位应用程序的栈都标记为不可执行。要使 32 位应用程序不能在运行 64 位或 32 位内核的系统上执行,则有必要设置此参数。
此参数存在于所有运行 Solaris 2.6、7、8、9 或 10 发行版的系统上,但它仅对 64 位 SPARC 和 AMD64 体系结构有效。
带符号整数
0(禁用)
0(禁用)或 1(启用)
切换(开/关)
是。不会影响当前正在运行的进程,只影响在设置此值之后创建的进程。
无
应始终处于启用状态,除非应用程序要故意在不使用 mprotect 的情况下在栈中放置可执行代码以使栈可执行。有关更多信息,请参见 mprotect(2)。
不稳定
有关信息,请参见noexec_user_stack(Solaris 9 发行版)。
本节介绍 fsflush 及相关可调参数。
定期运行系统守护进程 fsflush 以执行以下三项主要任务:
每次调用时,fsflush 都会将一段时间内的脏文件系统页刷新到磁盘。
每次调用时,fsflush 都会检查部分内存并将已修改的页写入其后备存储。如果页已经过修改,并且不满足以下任一条件,则会写入页:
页为内核页
页为可用页
页为锁定页
页与交换设备关联
页当前参与 I/O 操作
实际结果是刷新文件中使用具有写入权限的 mmap 进行映射的页以及实际已更改的页。
页会被刷新到后备存储,但是仍与使用它们的进程保持连接。当系统在低内存的情况下运行时,如果自刷新以来页未被修改过,则这种方式可以避免因先将页写入后备存储而后再声明页所造成的延迟,从而简化页的回收过程。
fsflush 将文件系统元数据写入磁盘。每进行 n 次调用便执行一次此写入操作,其中 n 根据各种配置变量计算得出。有关详细信息,请参见tune_t_fsflushr和autoup。
可以配置以下功能:
调用的频率 (tune_t_fsflushr)
是否执行内存扫描 (dopageflush)
是否进行文件系统数据刷新 (doiflush)
文件系统数据的刷新频率 (autoup)
对于大多数系统,内存扫描和文件系统元数据同步是 fsflush 的主要活动。根据系统的使用情况,内存扫描可能很少使用,否则会占用过多的 CPU 时间。
带符号整数
1
1 到 MAXINT
秒
否
如果此值小于或等于零,则会将其重置为 1 并显示警告消息。仅在引导时执行此检查。
请参见 autoup 参数。
不稳定
autoup 与 tune_t_flushr 一起控制每次调用时检查其中脏页的内存量以及文件系统同步操作的频率。
autoup 的值还可用于控制是否将缓冲区从可用列表写出。每当带有 B_DELWRI 标志(标识已更改的文件内容页)的缓冲区在列表中的存在时间超过 autoup 秒时,便会将其写出。增大 autoup 的值可延长缓冲区在内存中的保留时间。
带符号整数
30
1 到 MAXINT
秒
否
如果 autoup 小于或等于零,则会将其重置为 30 并显示警告消息。仅在引导时执行此检查。
autoup 应该是 tune_t_fsflushr 的整数倍。autoup 至少应该是 tune_t_fsflushr 值的 6 倍。 否则,每次调用 fsflush 时,都会扫描过多的内存量。
系统总页数与 tune_t_fsflushr 的乘积应大于或等于 autoup,以便在 dopageflush 不为零时检查内存。
在下列情况下,可能要更改 autoup 和/或 tune_t_fsflushr 参数:
内存较大的系统-在这种情况下,增大 autoup 会减小每次调用 fsflush 时扫描的内存量。
内存需求最低的系统-同时增大 autoup 和 tune_t_fsflushr 会减少扫描次数。同时增大 autoup 是为了维护当前的 autoup / tune_t_fsflushr 比率。
具有大量瞬态文件的系统(例如,邮件服务器或软件生成计算机)-如果创建了大量文件然后将其删除,则 fsflush 可能不必将这些文件的数据页写入磁盘。
不稳定
控制是否在调用 fsflush 期间检查内存中已修改的页。每次调用 fsflush 时,都会确定系统中的内存页数。此数值可能会因动态重新配置操作而发生了更改。每次调用都使用以下算法进行扫描:总页数 x tune_t_fsflushr / autoup 页数
带符号整数
1(启用)
0(禁用)或 1(启用)
切换(开/关)
是
无
如果系统页面扫描程序很少运行(由 vmstat 输出的 sr 列中的 0 值指示)。
不稳定
控制是否在调用 fsflush 期间执行文件系统元数据同步。每进行 N 次 fsflush 调用便会执行一次此同步操作,其中 N= (autoup / tune_t_fsflushr)。由于此算法是整数除法,因此,如果 tune_t_fsflushr 大于 autoup,则每次调用 fsflush 时都会执行同步,因为代码会检查其重复计数器,看是大于还是等于 N。请注意,每次调用 fsflush 时都会计算 N 一次。随后对 tune_t_fsflushr 或 autoup 所做的更改不会影响同步操作的频率。
带符号整数
1(启用)
0(禁用)或 1(启用)
切换(开/关)
是
无
一段时间内频繁修改文件并且刷新操作引起的负载扰乱了系统行为。
如果文件的存在性以及状态的一致性在重新引导系统时都无关紧要,则最好将这些文件保留在 TMPFS 文件系统(如 /tmp)中。从 Solaris 7 发行版开始,可以使用 mount -noatime 选项减少系统上的 inode 通信流量。此选项可避免在访问文件时进行 inode 更新。
对于参与实时处理的系统,可能需要禁用此选项并使用显式应用程序文件同步来实现一致性。
不稳定
可使用几个参数(或变量)来控制系统上的可用进程数以及单个用户可以创建的进程数。基础参数为 maxusers。此参数确定指定给 max_nprocs 和 maxuprc 的值。
最初,maxusers 定义系统可以支持的登录用户数。生成内核时,将基于该设置调整各种表的大小。当前 Solaris 发行版会基于系统上的内存量执行大量大小调整操作。因此,maxusers 过去的许多用法都已发生更改。仍由 maxusers 派生的许多子参数包括:
系统上的最大进程数
系统中保留的配额结构数
目录名称查找高速缓存 (directory name look-up cache, DNLC) 的大小
带符号整数
内存量(以 MB 为单位)与 2048 之间的较小值
1 到 2048(如果未在 /etc/system 文件中设置,则基于物理内存设置)
1 到 4096(如果在 /etc/system 文件中设置)
用户
否。计算完相关参数之后,便不再引用 maxusers。
无
由系统派生的缺省用户进程数太少时。在这种情况下,系统控制台将显示以下消息:
out of processes |
当缺省进程数太多时,也可能要更改此参数,例如以下情况:
减小 maxusers 的缺省值时,具有大量内存但运行的进程相对较少的数据库服务器可以节省系统内存。
如果文件服务器具有大量内存但运行的进程较少,则可能要减小此值。不过,应显式设置 DNLC 的大小。请参见ncsize。
如果计算服务器具有大量内存但运行的进程较少,则可能要减小此值。
不稳定
指定要在进程表中为具有超级用户 UID (0) 的进程保留的系统进程槽数。例如,fsflush 具有超级用户 UID (0)。
带符号整数
5
5 到 MAXINT
进程
否。计算完初始参数之后便不再使用。
从 Solaris 8 发行版开始,不会忽略任何 /etc/system 设置。
不稳定
考虑增加到 10 + 系统上正常 UID 0(超级用户)进程数。当需要获取根 shell,否则系统便无法创建用户级进程时,该设置可提供一定程度的缓解。
指定可能的最大进程 ID 值。对 Solaris 8 以及更高发行版有效。
pidmax 设置 maxpid 变量的值。设置 maxpid 之后,便会忽略 pidmax。maxpid 在内核中的其他位置使用,用于确定最大进程 ID 和进行验证检查。
任何通过向 /etc/system 文件中添加项以设置 maxpid 的尝试都将无效。
带符号整数
30,000
266 到 999,999
进程
否。仅在引导时用于设置 pidmax 的值。
是。会将此值与 reserved_procs 的值和 999,999 进行比较。如果此值小于 reserved_procs 或大于 999,999,则将其设置为 999,999。
检查 max_nprocs 范围可确保 max_nprocs 始终小于或等于此值。
需要在系统上启用对多于 30,000 个进程的支持时。
不稳定
指定可在系统上创建的最大进程数。包括系统进程和用户进程。使用 /etc/system 中指定的任一值来计算 maxuprc。
此值还可用来确定几个其他系统数据结构的大小。此参数还将在以下其他数据结构中起作用:
确定目录名称查找高速缓存的大小(如果未指定 ncsize)
为 UFS 分配磁盘配额结构(如果未指定 ndquot)
检验已配置的 System V 信号所使用的内存量是否未超过系统限制
为 x86 平台配置硬件地址转换资源。
带符号整数
10 + (16 x maxusers)
266 到 maxpid 的值
否
是。将此值与 maxpid 进行比较,如果此值较大,则将其设置为 maxpid。在 x86 平台上,还会根据特定于平台的值进行其他检查。将 max_nprocs 设置为三个值(max_nprocs、maxpid、平台值)中的最小者。SPARC 和 x86 平台都使用 65,534 作为平台值。
更改此参数是在系统上启用对多于 30,000 个进程的支持所必需的一步。
不稳定
有关信息,请参见max_nprocs(Solaris 9 发行版)。
带符号整数
max_nprocs - reserved_procs
1 到 max_nprocs - reserved_procs
进程
否
是。会将此值与 max_nprocs - reserved_procs 进行比较,并将其设置为这两个值中的较小者。
需要对用户可创建的进程数指定硬限制,使其小于系统可创建进程数的缺省值时。尝试超过此限制时,会在控制台上或消息文件中生成以下警告消息:
out of per-user processes for uid N |
不稳定
Solaris OS 使用按需分页的虚拟内存系统。系统运行时,会根据需要将页放入内存。当占用的内存超过特定阈值并且内存需求不断增加时,便会开始分页。可以通过几个级别进行分页,这些级别由特定参数控制。
常规分页算法如下:
发现内存不足。页面扫描程序线程将运行并开始扫描内存。将采用两步算法:
将页标记为未使用。
如果在一段时间间隔之后仍未使用,则将此页视为回收对象。
如果该页已经过修改,则会向页出线程发出调度该页以执行 I/O 的请求。此外,页面扫描程序会继续查看内存。页出会导致将该页写入其后备存储并放入可用列表中。页面扫描程序扫描内存时,不会对页的来源进行区分。页可能来自数据文件,也可能来自可执行文件的文本、数据或栈。
随着系统内存压力的增大,此算法会越来越主动地调整将被它视为回收候选对象的页的数目以及分页算法运行的频率。(有关更多信息,请参见fastscan和slowscan。)随着可用内存从 lotsfree 降到 minfree,系统会将每次调用页出线程时扫描的内存量从 slowscan 指定的值线性增大到 fastscan 指定的值。系统使用 desfree 参数来控制许多有关资源使用和行为的决策。
最初,系统限定自身针对 pageout 操作所使用的 CPU 百分比不超过 4%。随着内存压力的增大,为支持 pageout 操作而占用的 CPU 时间会线性增大,直到最多占用 CPU 的 80% 为止。此算法将扫描 slowscan 和 fastscan 之间的某一内存量,然后在出现下列任一情况时停止扫描:
已找到足以解决内存不足问题的页。
已查看了计划的页数。
使用了过多的时间。
如果页出线程完成其扫描时仍存在内存不足问题,则在接下来的 1/4 秒时间内将安排其他扫描。
从 Solaris 9 发行版开始,更改了分页子系统的配置机制。系统将在引导时确定 fastscan、slowscan 和 handspreadpages 参数的相应设置,而不是依赖于这些参数的一组预定义值。在 /etc/system 文件中设置这些参数中的任何一个都会导致系统使用非最优值。
请从 /etc/system 文件中删除所有的 VM 系统调优。请使用缺省设置运行,并确定是否有必要调整这些参数。请勿设置 cachefree 或 priority_paging。从 Solaris 9 发行版开始,已经删除了这两个参数。
从 Solaris 7 5/99 发行版开始,支持 CPU 和内存的动态重新配置 (dynamic reconfiguration, DR)。执行涉及添加或删除内存的 DR 操作的系统将重新计算相关参数的值,除非已在 /etc/system 中显式设置参数。如果已显式设置,将使用 /etc/system 中指定的值,除非违反了有关变量值的约束。如果违反了有关约束,将重置值。
无符号长整数
物理内存的 1/64 与 512 KB 之间的较大值
最小值为 512 KB 与物理内存的 1/64 之间的较大值,以页表示,其页大小为 getpagesize 的返回值。有关更多信息,请参见 getpagesize(3C)。
最大值为物理内存页数。最大值不应大于物理内存的 30%。系统不会强制执行此范围,“验证”部分介绍的内容除外。
页
是,但是如果执行基于内存的 DR 操作,则动态更改会丢失。
如果 lotsfree 大于物理内存量,则会将值重置为缺省值。
应始终维护以下关系:lotsfree 大于 desfree,而后者大于 minfree。
页需求急剧增加,而内存算法可能无法跟上需求时。一种解决方法是提前一段时间开始回收内存。此解决方案为分页系统提供了额外的时间。
一种单凭经验的方法是将此参数设置为系统需要在几秒时间内分配的内存页数的 2 倍。此参数与工作负荷相关。DBMS 服务器使用缺省设置可以很好地运行。但是,对于执行超负荷文件系统 I/O 的系统,可能需要调整此参数。
对于工作负荷相对稳定以及内存量较大的系统,可以降低此值。可接受的最小值为 512 KB,以页表示,其页大小为 getpagesize 的返回值。
不稳定
无符号整数
lotsfree / 2
最小值为 256 KB 与物理内存的 1/128 之间的较大值,以页表示,其页大小为 getpagesize 的返回值。
最大值为物理内存页数。最大值不应大于物理内存的 15%。系统不会强制执行此范围,“验证”部分介绍的内容除外。
页
是,除非执行添加或删除内存的动态重新配置操作。此时,将值重置为 /etc/system 文件中提供的值或者根据新物理内存值计算得出的值。
如果 desfree 大于 lotsfree,则将 desfree 设置为 lotsfree / 2。不显示任何消息。
应始终维护以下关系:lotsfree 大于 desfree,而后者大于 minfree。
增大此参数的值会产生多种负面影响。当新值接近或超过系统上的可用内存量时,将出现以下情况:
无法处理异步 I/O 请求,除非可用内存超过 desfree。增大 desfree 的值可能会导致拒绝原本可以成功执行的请求。
将 NFS 异步写入作为同步写入执行。
较早地唤醒交换程序,并且交换程序的行为偏向于更加主动的操作。
系统可能无法预先测出许多可执行页进入系统时出现的故障。这种负面影响会导致应用程序的运行速度可能慢于原本可以达到的速度。
对于工作负荷相对稳定以及内存量较大的系统,可以降低此值。可接受的最小值为 256 KB,以页表示,其页大小为 getpagesize 的返回值。
不稳定
指定可接受的最低内存级别。当内存低于此数值时,系统会偏向于执行以下两种分配:成功完成页出操作所需的分配或将进程完全交换出内存所需的分配。这两种分配都会拒绝或阻止其他分配请求。
无符号整数
desfree / 2
最小值为 128 KB 与物理内存的 1/256 之间的较大值,以页表示,其页大小为 getpagesize 的返回值。
最大值为物理内存页数。最大值不应大于物理内存的 7.5%。系统不会强制执行此范围,“验证”部分介绍的内容除外。
页
是,除非执行添加或删除内存的动态重新配置操作。此时,将值重置为 /etc/system 文件中提供的值或者根据新物理内存值计算得出的值。
如果 minfree 大于 desfree,则将 minfree 设置为 desfree / 2。不显示任何消息。
应始终维护以下关系:lotsfree 大于 desfree,而后者大于 minfree。
缺省值通常已经足够。对于工作负荷相对稳定以及内存量较大的系统,可以降低此值。可接受的最小值为 128 KB,以页表示,其页大小为 getpagesize 的返回值。
不稳定
无符号整数
minfree
最小值为 128 KB 与物理内存的 1/256 之间的较大值,以页表示,其页大小为 getpagesize 的返回值。
最大值为物理内存页数。最大值不应大于物理内存的 4%。系统不会强制执行此范围,“验证”部分介绍的内容除外。
页
是,除非执行添加或删除内存的动态重新配置操作。此时,将值重置为 /etc/system 文件中提供的值或者根据新物理内存值计算得出的值。
如果 throttlefree 大于 desfree,则将 throttlefree 设置为 minfree。不显示任何消息。
应始终维护以下关系:lotsfree 大于 desfree,而后者大于 minfree。
缺省值通常已经足够。对于工作负荷相对稳定以及内存量较大的系统,可以降低此值。可接受的最小值为 128 KB,以页表示,其页大小为 getpagesize 的返回值。有关更多信息,请参见 getpagesize(3C)。
不稳定
指定为专门使用页出线程或调度程序线程保留的页数。当可用内存小于此值时,便会针对除页出或调度程序之外的所有进程拒绝非阻止分配。页出需要具有较小的内存池供自身使用,以便可以分配执行 I/O 所需的数据结构,从而将页写入其后备存储。在 Solaris 2.6 发行版中引入了此变量,用于确保系统在内存严重不足的情况下能够执行页出操作。
无符号整数
throttlefree / 2
最小值为 64 KB 与物理内存的 1/512 之间的较大值,以页表示,其页大小为 getpagesize(3C) 的返回值。
最大值为物理内存页数。最大值不应大于物理内存的 2%。系统不会强制执行此范围,“验证”部分介绍的内容除外。
页
是,除非执行添加或删除内存的动态重新配置操作。此时,将值重置为 /etc/system 文件中提供的值或者根据新物理内存值计算得出的值。
如果 pageout_reserve 大于 throttlefree / 2,则将 pageout_reserve 设置为 throttlefree / 2。不显示任何消息。
应始终维护以下关系:lotsfree 大于 desfree,而后者大于 minfree。
缺省值通常已经足够。对于工作负荷相对稳定以及内存量较大的系统,可以降低此值。可接受的最小值为 64 KB,以页表示,其页大小为 getpagesize 的返回值。
不稳定
无符号长整数
以下两者中的较大值:tune_t_minarmem + 100、引导时可用内存的 4% + 4 MB
系统强制的最小值为 tune_t_minarmem + 100,但不强制最大值。
页
是,除非执行添加或删除内存的动态重新配置操作。此时,将值重置为 /etc/system 文件中提供的值或者根据新物理内存值计算得出的值。
如果 /etc/system 文件中指定的值或计算得出的缺省值小于 tune_t_minarmem + 100,则将其重置为 tune_t_minarmem + 100。
如果 /etc/system 文件中的值增大,则不会显示任何消息。仅在引导时以及执行涉及添加或删除内存的动态重新配置操作期间进行验证。
当内存锁定请求失败或者附加到带有 SHARE_MMU 标志的共享内存段失败,但仍然看似具有足够的可用内存时。
如果值过大,则可能会导致内存锁定请求(mlock、mlockall 和 memcntl)不必要地失败。有关更多信息,请参见mlock(3C)、mlockall(3C) 和memcntl(2)。
不稳定
定义为避免死锁而需要保留的最小可用驻留(而非可交换)内存。用于保留一部分内存以供 OS 的核心使用。当 OS 确定最大可用内存量时,采用此方法限制的内存将不可见。
带符号整数
25
1 到物理内存
页
否
无。较大的值会导致浪费物理内存。
缺省值通常已经足够。如果系统锁定并且调试信息指示没有可用的内存,可以考虑增大缺省值。
不稳定
带符号整数
64 MB 与物理内存的 1/2 之间的较小值。
1 到物理内存的一半
页
是,除非执行添加或删除内存的动态重新配置操作。此时,将值重置为由 /etc/system 提供的值或者根据新物理内存值计算得出的值。
最大值为 64 MB 与物理内存的 1/2 之间的较小值。
内存不足期间(尤其是在系统处于需要大量内存的阶段或执行超负荷文件 I/O 时)首选更加主动的内存扫描时。
不稳定
带符号整数
以页为单位的物理内存的1/20 与 100 之间的较小值。
1 到 fastscan / 2
页
是,除非执行添加或删除内存的动态重新配置操作。此时,将值重置为 /etc/system 文件中提供的值或者根据新物理内存值计算得出的值。
如果 slowscan 大于 fastscan / 2,则将 slowscan 重置为 fastscan / 2。不显示任何消息。
内存不足期间(尤其是在系统处于需要大量内存的阶段)首选更加主动的内存扫描时。
不稳定
带符号整数
4
1 到 80
百分比
是
无
在具有多个 CPU 以及较大内存的系统上(这些系统处于需要大量内存的阶段)增大此值,可以使页面调度程序花更多时间来尝试查找内存。
不稳定
内存较低时,Solaris OS 使用双指针时钟算法查找候选回收页。时钟的第一个指针会扫描内存,将页标记为未使用。第二个指针距离第一个指针一段距离之后再扫描内存,检查页是否仍标记为未使用。如果是,则回收页。第一个和第二个指针之间的距离为 handspreadpages。
无符号长整数
fastscan
1 到系统上的最大物理内存页数
页
是。此参数要求将内核 reset_hands 参数也设置为非零值。一旦识别出 handspreadpages 的新值,便会将 reset_hands 设置为零。
将值设置为物理内存量与 handspreadpages 值之间的较小值。
需要延长页在回收之前可能驻留的时间时。增大此值会增加两个指针之间的距离,从而会延长回收页之前的时间。
不稳定
定义在 I/O 完成之后立即释放页(而不是存储页以备将来可能重新使用)的系统阈值部分。阈值为 lotsfree + pages_before_pager。NFS 环境也使用此阈值,以便在内存压力增加时减小其异步活动。
带符号整数
200
1 到物理内存量
页
否
无
针对页(这些页已实际读取或写入一次,并且未再次引用)执行完大多数 I/O 时,可能要更改此参数。将此变量设置为较大的内存量,会导致继续将页添加到可用列表。
当系统的内存压力急剧增加时,也可能要更改此参数。较大的值有助于显著缓解压力。
不稳定
定义分页系统可对其进行排队的最大页 I/O 请求数。将此数值除以 4 即可得到分页系统使用的实际最大数值。此参数用于限制请求数和控制进程交换。
带符号整数
40
1 到 1024
I/0
否
无
页面调度程序发出的最大 I/O 请求数受请求缓冲区列表大小的限制,此列表大小当前为 256。
系统的内存压力急剧增加时。如果配置了多个交换设备或者交换设备为条带化设备,则较大的值有助于更快地从压力中恢复过来。
不稳定
Solaris OS 中的交换由 swapfs 伪文件系统实现。交换设备和物理内存上的空间组合被视为可用空间池,用于支持系统维护异步内存的后备存储。系统首先尝试分配磁盘设备中的空间,然后将物理内存用作后备存储。强制 swapfs 将系统内存用于后备存储时,会强制执行相应的限制以确保系统不会因为 swapfs 占用过多空间而出现死锁。
无符号长整数
4 MB 与物理内存的 1/16 之间的较小值
最小值为 4 MB 与物理内存的 1/16 之间的较小值,以页表示,其页大小为 getpagesize 的返回值。
最大值为物理内存页数。最大值不应大于物理内存的 10%。系统不会强制执行此范围,“验证”部分介绍的内容除外。
页
否
无
通常没有必要进行更改。仅当软件提供商建议时,或者当系统进程由于无法获取交换空间而终止时进行更改。较好的解决方案是向系统中添加物理内存或其他交换设备。
不稳定
定义要为系统其余部分保留的可用物理内存量。当任何进程尝试保留内存将其用作交换空间,从而导致系统发现可用内存小于此容量值时,该尝试将被拒绝。采用此方法保留的页只能由内核或用户级别进程用于进行锁定分配。
无符号长整数
2 MB 与物理内存的 1/8 之间的较大值
1 到物理内存量
页
否
无
进程由于无法获取交换空间而失败,但系统仍具有可用内存时。
不稳定
Solaris 内核内存分配器可在内核内部分配内存块以供客户机使用。此分配器可创建许多大小不同的高速缓存以供其客户机使用。客户机也可以请求分配器创建专供该客户机使用的高速缓存(例如,用于分配特定大小的结构)。可以使用 kstat -c kmem_cache 命令来查看有关由此分配器管理的每个高速缓存的统计信息。
有时,系统可能会因内存损坏而发生混乱。内核内存分配器支持调试接口(一组标志,可对缓冲区执行各种完整性检查)。它还可收集有关分配器的信息。通过完整性检查可以比较精确地检测实际出现错误的位置。收集的信息可以为您确定系统混乱的原因提供更多的数据支持。
在系统运行期间使用标志会引起额外的系统开销并占用更多的内存。仅当怀疑出现内存损坏问题时,才应使用这些标志。
Solaris 内核内存分配器具有各种调试和测试选项,这些选项可在 Solaris OS 内部开发周期内广泛使用。从 Solaris 2.5 发行版开始,便可使用这些选项中的部分选项。这些选项受 kmem_flags 变量控制。可使用内核调试程序设置该变量,然后重新引导系统使其生效。Solaris 8 发行版之前的版本,由于在内核内存分配器实例化的计时以及 /etc/system 文件解析方面存在问题,因此无法在 /etc/system 文件中设置这些标志。
以下介绍了五种受支持的标志设置。
标志 |
设置 |
说明 |
---|---|---|
AUDIT |
0x1 |
分配器维护包含其最近活动历史记录的日志。记录的项数取决于是否还设置了 CONTENTS。此日志大小固定。当用完空间时,便会回收较早的记录。 |
TEST |
0x2 |
分配器向释放的内存中写入模式,并在下一次分配缓冲区时检查此模式是否未更改。如果缓冲区的某部分发生更改,则内存可能由先前已分配和释放此缓冲区的客户机使用。如果确定出现覆写,则系统会发生混乱。 |
REDZONE |
0x4 |
分配器在请求的缓冲区的结尾提供额外内存,并将特定模式插入此内存。释放缓冲区时,将检查此模式以查看是否在缓冲区结尾后面写入数据。如果确定出现覆写,则内核会发生混乱。 |
CONTENTS |
0x8 |
释放缓冲区时,分配器最多记录 256 个字节的缓冲区内容。此标志要求还应设置 AUDIT。 从 Solaris 8 发行版开始或者在早期发行版中,通过在启动内核之前引导 kadb 并设置这些标志,/etc/system 文件可以对这些标志的数值进行逻辑相加和设置。 |
LITE |
0x100 |
分配和释放缓冲区后,执行最小完整性检查。启用时,分配器将检查是否尚未写入 redzone,是否再次释放已释放的缓冲区,以及要释放的缓冲区的大小是否为已分配的大小。从 Solaris 7 3/99 发行版开始,便提供了此标志。请不要将此标志与任何其他标志一起使用。 |
带符号整数
0(禁用)
0(禁用)或 1 - 15 或 256 (0x100)
是。运行时进行的更改仅影响新的内核内存高速缓存。初始化系统之后,很少创建新的高速缓存。
无
怀疑发生内存损坏时
不稳定
带符号整数
0(关闭消息)
以下是最有用的值:
0x80000000-列显 [un] loading... 消息。对于每个已装入的模块,将在控制台上和 /var/adm/messages 文件中显示以下消息:
Nov 5 16:12:28 sys genunix: [ID 943528 kern.notice] load 'sched/TS_DPTBL' id 9 loaded @ 0x10126438/ 0x10438dd8 size 132/2064 Nov 5 16:12:28 sys genunix: [ID 131579 kern.notice] installing TS_DPTBL, module id 9. |
0x40000000-列显详细的错误消息。对于每个已装入的模块,将在控制台上和 /var/adm/messages 文件中显示以下消息:
Nov 5 16:16:50 sys krtld: [ID 284770 kern.notice] kobj_open: can't open /platform/SUNW,Ultra-80/kernel/ sched/TS_DPTBL Nov 5 16:16:50 sys krtld: [ID 284770 kern.notice] kobj_open: can't open /platform/sun4u/kernel/sched/ TS_DPTBL Nov 5 16:16:50 sys krtld: [ID 797908 kern.notice] kobj_open: '/kernel/sch... Nov 5 16:16:50 sys krtld: [ID 605504 kern.notice] descr = 0x2a Nov 5 16:16:50 sys krtld: [ID 642728 kern.notice] kobj_read_file: size=34, Nov 5 16:16:50 sys krtld: [ID 217760 kern.notice] offset=0 Nov 5 16:16:50 sys krtld: [ID 136382 kern.notice] kobj_read: req 8192 bytes, Nov 5 16:16:50 sys krtld: [ID 295989 kern.notice] got 4224 Nov 5 16:16:50 sys krtld: [ID 426732 kern.notice] read 1080 bytes Nov 5 16:16:50 sys krtld: [ID 720464 kern.notice] copying 34 bytes Nov 5 16:16:50 sys krtld: [ID 234587 kern.notice] count = 34 [33 lines elided] Nov 5 16:16:50 sys genunix: [ID 943528 kern.notice] load 'sched/TS_DPTBL' id 9 loaded @ 0x10126438/ 0x10438dd8 size 132/2064 Nov 5 16:16:50 sys genunix: [ID 131579 kern.notice] installing TS_DPTBL, module id 9. Nov 5 16:16:50 sys genunix: [ID 324367 kern.notice] init 'sched/TS_DPTBL' id 9 loaded @ 0x10126438/ 0x10438dd8 size 132/2064 |
0x20000000-列显更多的详细消息。此值不会列显 0x40000000 标志在系统引导期间所列显信息之外的任何其他信息。但是,此值会列显有关卸载模块时释放模块的其他信息。
可以将这些值相加来设置最终值。
是
无
未按预期方式装入模块或在装入模块期间系统似乎挂起时。请注意,设置 0x40000000 之后,系统引导速度会随写入控制台的消息数的增加而大大降低。
不稳定
定义最大物理 I/O 请求大小。如果驱动程序遇到大于此大小的请求,则会将此请求分为几个大小为 maxphys 的块。文件系统可以并且确实会强加其自己的限制。
带符号整数
131,072 (Sun-4u) 或 57,344 (x86)。 如果 sd 驱动程序支持广泛传输,则使用值 1,048,576。ssd 驱动程序缺省情况下使用 1,048,576。
特定于计算机的页大小到 MAXINT
字节
是,但是挂载文件系统时,很多文件系统都将此值装入每挂载点数据结构。许多驱动程序都在将设备连接到特定于驱动程序的数据结构时装入此值。
无
在原始设备上执行大量 I/O 操作时(包括输入和输出)。请注意,执行 OLTP 操作的 DBMS 会导致大量的较小 I/O 操作。在这种情况下,更改 maxphys 不会提高性能。
在随时要读取或写入大量数据(大于 64 KB)的 UFS 文件系统上执行进出 I/O 操作时,也要考虑更改此参数。应优化此文件系统以改善邻接性。例如,增加柱面组的大小并减小每柱面组的 inode 数。UFS 对其传输的最大 I/O 大小强加 1 MB 的内部限制。
不稳定
带符号整数
65,536
1 到 MAXINT
文件描述符
否
无
某个进程的最大已打开文件数不足时。系统功能中的其他限制表示更多的文件描述符并不会起到可能具有的作用。例如:
使用标准 I/O 的 32 位程序最多可以使用 256 个文件描述符。使用标准 I/O 的 64 位程序最多可以使用 20 亿个描述符。具体而言,标准 I/O 是指 libc(3LIB) 中的 stdio(3C) 函数。
缺省情况下,会将 select 限制为每 fd_set 使用 1024 个描述符。有关更多信息,请参见 select(3C)。从 Solaris 7 发行版开始,可以使用较大的 fd_set 大小(小于或等于 65,536)来重新编译 32 位应用程序代码。64 位应用程序使用的 fd_set 大小为 65,536(无法更改)。
在系统范围内更改此参数的一种备用方法是使用 plimit(1) 命令。如果父进程使用 plimit 更改了其限制,则所有子进程都会继承增大的限制。此备用方法对于 inetd 之类的守护进程非常有用。
不稳定
有关信息,请参见rlim_fd_max(Solaris 8 发行版)。
定义对单个进程可以打开的文件描述符设置的“软”限制。进程可能会在运行任何 shell 期间通过使用 setrlimit() 调用或发出 limit 命令,将其文件描述符限制调整到最多为 rlim_fd_max 定义的“硬”限制的任何值。无需超级用户权限即可将此限制调整到小于或等于硬限制的任何值。
带符号整数
256
1 到 MAXINT
文件描述符
否
与 rlim_fd_max 进行比较。如果 rlim_fd_cur 大于 rlim_fd_max,则将 rlim_fd_cur 重置为 rlim_fd_max。
某个进程的缺省已打开文件数不足时。增大此值只表示程序可能没有必要使用 setrlimit 来增加其可用的最大文件描述符数。
不稳定
定义目录名称查找高速缓存 (directory name look-up cache, DNLC) 中的项数。UFS 和 NFS 使用此参数来高速缓存已解析的路径名元素。
从 Solaris 8 6/00 发行版开始,DNLC 还可高速缓存非查询信息,这意味着它可高速缓存无法在高速缓存中找到的名称。
带符号整数
4 x (v.v_proc + maxusers) + 320
0 到 MAXINT
DNLC 项
否
无。较大的值会导致取消挂载文件系统所花费的时间增加,因为取消挂载过程中必须刷新高速缓存中此文件系统的项。
在 Solaris 8 6/00 发行版之前,很难确定高速缓存是否过小。可以通过记下 kstat -n ncstats 返回的项数来进行此推断。已知系统工作负荷和文件访问模式的情况下,如果此项数似乎过高,则可能是由于 DNLC 过小造成的。
从 Solaris 8 6/00 发行版开始,可以使用 kstat -n dnlcstats 命令来确定因为 DNLC 过小而从其中删除项的时间。pick_heuristic 和 pick_last 参数的总和表示因为高速缓存过小而回收的其他有效项数。
如果 ncsize 的值过大,则会直接影响系统,因为系统会基于 ncsize 的值为 DNLC 分配一组数据结构。运行 32 位内核的系统将针对 ncsize 分配 36 字节的结构,而运行 64 位内核的系统将针对 ncsize 分配 64 字节的结构。此值会进一步影响 UFS 和 NFS,除非显式设置了 ufs_ninode 和 nfs:nrnode。
不稳定
指示 chown 系统调用的 POSIX 语义是否有效。POSIX 语义如下:
进程无法更改文件的属主,除非此进程使用 UID 0 运行。
进程无法将文件的组拥有权更改为当前不包含此文件的组,除非此进程以 UID 0 运行。
有关更多信息,请参见 chown(2)。
带符号整数
1,指示使用 POSIX 语义
0 = 未强制使用 POSIX 语义,或 1 = 使用 POSIX 语义
切换(开/关)
是
无
不需要 POSIX 语义时。请注意,关闭 POSIX 语义可能会出现各种安全漏洞。此外,还会使用户可以将文件的拥有权更改为其他用户,并且在该用户或系统管理员不介入的情况下无法检索文件。
过时
此参数对 NFS 文件系统没有影响。
无符号整数
1(启用)
0(禁用)或 1(启用)
是,但是请勿动态更改此可调参数。如果此参数最初为禁用状态,则可以将其启用。或者,如果此参数最初为启用状态,则可以将其禁用。但是,启用,禁用,然后再启用此参数可能会导致目录高速缓存过时。
否
目录高速缓存未出现已知问题时。但是,如果出现问题,应将 dnlc_dir_enable 设置为 0 以禁用高速缓存。
不稳定
此参数对 NFS 文件系统没有影响。
无符号整数
40
0 到 MAXUINT(无最大值)
项
是,可以随时更改此参数。
无
如果高速缓存小型目录时出现性能问题,则应增大 dnlc_dir_min_size。请注意,个别文件系统对高速缓存目录可能有其自己的范围限制。例如,UFS 将目录限制为最少包含 ufs_min_dir_cache 字节(大约 1024 个项,假设每个项包含 16 字节)。
不稳定
此参数对 NFS 文件系统没有影响。
无符号整数
MAXUINT(无最大值)
0 到 MAXUINT
是,可以随时更改此参数。
无
如果高速缓存大型目录时出现性能问题,则应增大 dnlc_dir_max_size。
不稳定
无符号整数
系统启动时可用内存的 12%
2 MB 到 physmem 的 100%
物理内存的百分比
否
无
如果预期要执行超负荷文件系统活动,并且具有足够的可用内存,则应增大此参数的值。
不稳定
定义用于高速缓存 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 的文件。
不稳定
无符号长整数
一页与物理内存的 4% 之间的较大值。
一页中的字节数(对于 sun4u 系统为 8192,对于所有其他系统为 4096)到首次使用 TMPFS 时可用内核内存的 25%。
字节
是
无
如果控制台上显示了或消息文件中写入了以下消息,则应增大此值:
tmp_memalloc: tmpfs over memory limit |
TMPFS 用于其数据结构的当前内存量存储在 tmp_kmemspace 字段中。可以使用内核调试程序检查此字段。
不稳定
带符号长整数
256
0 到最大交换空间大小
页
是
无
要在大量使用 TMPFS 的系统上保留合理的交换空间量,可以增大此数值。当控制台或消息文件显示以下消息时,表示已达到限制:
fs-name: File system full, swap space limit exceeded |
不稳定
有关信息,请参见tmpfs:tmpfs_minfree(Solaris 8 发行版)。
在 Solaris 软件中,伪终端 pty 具有以下两种用途:
使用 telnet、rlogin 或 rsh 命令支持远程登录
提供 X 窗口系统用以创建命令解释程序窗口的界面
对于桌面工作站,缺省伪终端数便已足够。因此,将主要针对可用于远程登录的 pty 数进行调优。
Solaris 的早期版本需要执行这些调优步骤,以便显式配置系统使其具有首选的 pty 数。从 Solaris 8 发行版开始,采用了新机制,从而在大多数情况下不必进行调优。现在,缺省 pty 数基于系统上的内存量。仅当限制或增加可登录到系统的用户数时,才应该更改此缺省值。
在配置过程中,将使用以下三个相关变量:
pt_cnt-最大缺省 pty 数。
pt_pctofmem-专用于 pty 支持结构的内核内存的百分比。如果值为零,则表示任何远程用户都无法登录到系统。
pt_max_pty-硬性最大 pty 数。
pt_cnt 的缺省值为零,此值指示系统基于 pct_pctofmem 中指定的内存量限制登录,除非设置了 pt_max_pty。如果 pt_cnt 为非零值,则会分配 pty,直到达到此限制为止。超过此阈值时,系统便会查看 pt_max_pty。如果 pt_max_pty 具有非零值,则将其与 pt_cnt 进行比较。如果 pt_cnt 小于 pt_max_pty,则允许分配 pty。如果 pt_max_pty 为零,则将 pt_cnt 与基于 pt_pctofmem 支持的 pty 数进行比较。如果 pt_cnt 小于此值,则允许分配 pty。请注意,仅当 pt_cnt 和 ptms_ptymax 的缺省值都为零时,基于 pt_pctofmem 的限制才起作用。
要对 pty 设置不同于源自 pt_pctofmem 的最大值的硬限制,请在 /etc/system 中将 pt_cnt 和 ptms_ptymax 设置为首选 pty 数。在这种情况下,与 ptms_pctofmem 的设置无关。
要针对 pty 支持使用不同的系统内存百分比,并使操作系统可管理显式限制,请执行以下操作:
请勿在 /etc/system 中设置 pt_cnt 或 ptms_ptymax。
在 /etc/system 中将 pt_pctofmem 设置为首选百分比。例如,对于 10% 设置,设置 pt_pctofmem=10。
请注意,在内存用于 pty 支持之前,实际上并不分配内存。分配内存之后,便会保持已分配状态。
可用 /dev/pts 项数是动态的,其上限由系统上可用物理内存量确定。pt_cnt 是用于确定系统可容纳的最小登录数的三个变量之一。系统可支持的最大缺省 /dev/pts 设备数是在引导时通过计算适合系统内存某百分比的 pty 结构数来确定的(请参见 pt_pctofmem)。如果 pt_cnt 为零,则系统分配的最大内存为此最大值。如果 pt_cnt 为非零值,则系统分配的最大内存为 pt_cnt 与缺省最大值之间的较大值。
无符号整数
0
0 到 maxpid
登录/窗口
否
无
需要显式控制可远程登录到系统的用户数时。
不稳定
指定为支持 /dev/pts 项数据结构可占用的最大物理内存百分比。运行 64 位内核的系统将针对每个 /dev/pts 项占用 176 字节。运行 32 位内核的系统将针对每个 /dev/pts 项占用 112 字节。
无符号整数
5
0 到 100
百分比
否
无
需要限制或增加可登录到系统的用户数时。如果值为零,则表示任何远程用户都无法登录到系统。
不稳定
无符号整数
0(使用系统定义的最大值)
0 到 MAXUINT
登录/窗口
是
无
应该大于或等于 pt_cnt。当分配的 pty 数超过 pt_cnt 的值时,才检查此值。
需要对支持的登录数设置上限(即使系统基于其当前配置值可以处理更多登录)时。
不稳定
带符号整数
9
9 到 16
模块
是
无
在软件供应商的指导下更改。当 STREAM 超过其允许的推入计数时,不显示任何消息。但是会将值 EINVAL 返回到尝试执行该推入操作的程序。
不稳定
指定单个系统调用可以传递给 STREAM 的消息数据部分的最大字节数。任何超过该大小的 write 都会被分为多条消息。有关更多信息,请参见write(2)。
带符号整数
65,536
0 到 262,144
字节
是
无
当 putmsg 调用返回 ERANGE 时。有关更多信息,请参见 putmsg(2)。
不稳定
带符号整数
1024
0 到 MAXINT
字节
是
无
在软件供应商的指导下更改。如果 putmsg(2) 调用尝试超过此限制,便会返回 ERANGE。
不稳定
System V 消息队列提供了一个消息传递接口,允许内核中创建的队列进行消息交换。Solaris 环境提供了多个接口,允许消息加入和离开队列。消息可以具有与其相关联的类型。通过加入队列操作,可以将消息列在队列的末尾,而通过离开列队操作,可以从队列删除第一条特定类型的消息,如果未指定类型,则删除第一条消息。
有关 Solaris 10 发行版中 System V 消息队列的信息,请参见System V IPC 配置。
有关调节这些系统资源的详细信息,请参见《系统管理指南:Solaris Containers-资源管理和 Solaris Zones》中的第 6 章 “资源控制(概述)”。
有关过时的 System V 消息队列的旧有信息,请参见过时或已删除的参数。
在 Solaris OS 中,System V 信号提供计数信号。信号是一个计数器,用于针对多个进程提供对共享数据对象的访问。除了标准的信号固定和释放操作,System V 信号还可以具有按需(例如,表示可用资源量)增加或减小的值。System V 信号还提供了同时对一组信号执行操作的功能,并可以使系统撤消上一个由某个已中止进程执行的操作。
有关 Solaris 10 发行版中对信号资源所做的更改的信息,请参见System V IPC 配置。
有关使用 Solaris 10 发行版中新增资源控制的详细信息,请参见《系统管理指南:Solaris Containers-资源管理和 Solaris Zones》中的第 6 章 “资源控制(概述)”。
有关过时的 System V 信号参数的旧有信息,请参见过时或已删除的参数。
使用 System V 共享内存,进程可以创建段。协作进程可以连接到内存段(受段访问权限的限制)并访问段中包含的数据。此功能通过可装入模块来实现。/etc/system 文件中的项必须包含 shmsys: 前缀。从 Solaris 7 发行版开始,keyserv 守护进程使用 System V 共享内存。
DBMS 供应商使用一种称为锁定共享内存 (intimate shared memory, ISM) 的特殊类型的共享内存来实现最佳性能。当共享内存段成为 ISM 段时,便会锁定该段的内存。借助此功能,可以使用更快的 I/O 路径,并提高了内存使用率。然后在所有以 ISM 模式连接到段的进程间共享大量描述该段的内核资源。
有关 Solaris 10 发行版中对共享内存资源所做的更改的信息,请参见System V IPC 配置。
有关使用 Solaris 10 发行版中新增资源控制的详细信息,请参见《系统管理指南:Solaris Containers-资源管理和 Solaris Zones》中的第 6 章 “资源控制(概述)”。
有关过时的 System V 共享内存参数的旧有信息,请参见过时或已删除的参数。
无符号长整数
创建首个 ISM 段时可用系统内存的 5%
0 到物理内存的 50%
页
是
无。当 ISM 段占用内存时,太小的值可能导致系统挂起或性能严重下降。
在使用 ISM 且具有大量物理内存的数据库服务器上,可以减小此参数的值。如果未使用 ISM 段,则此参数无效。在大型内存计算机上,最大值 128 MB (0x4000) 几乎肯定足够。
不稳定
指定在确定进程与其最后在上面运行的 CPU 失去所有关联之前的时钟周期数。此时间间隔过期之后,便会将任意 CPU 视为调度线程的候选 CPU。此参数只与分时类的线程相关。实时线程在第一个可用 CPU 上进行调度。
带符号整数
3
0 到 MAXINT
是
无
当高速缓存很大,或者系统正在运行一个关键进程或运行一组看上去受并非由数据访问模式导致的过量高速缓存未命中的影响时。
更改此参数之前,请考虑使用从 Solaris 2.6 发行版开始提供的处理器集功能或处理器绑定。有关更多信息,请参见 psrset(1M) 或 pbind(1M)。
不稳定
带符号整数
0
0(禁用)或 1(启用)
否。导致在引导时设置新的系统计时变量。引导之后不再引用此变量。
无
希望超时的分辨率小于 10 毫秒且大于或等于 1 毫秒时。
不稳定
带符号整数
32
0 到 MAXINT
否。增大此值可能导致系统崩溃。
无
当系统提供的缺省计时器数不足时。执行 timer_create 系统调用时,应用程序将收到 EAGAIN 错误。
不稳定
从 Solaris 2.6 发行版开始,便引入了在 UltraSPARC® (sun4u) 平台上使用不同的页放置策略的功能。页放置策略尝试通过分配物理页地址来最大程度地利用 L2 高速缓存。无论选择何种算法作为缺省算法,此算法可能生成的结果都会比其他用于特定应用程序集的算法要差。此参数可更改系统上为所有进程选定的放置算法。
根据 L2 高速缓存的大小,将内存分为多个容器。在未映射的页上第一次发生页面错误时,页放置代码便会从容器中分配一个页面。所选页取决于要使用以下三种可能的算法中的哪一种:
页面染色 (Page coloring)-将使用各种虚拟地址位确定从中选择页的容器。此算法为 Solaris 8 发行版中的缺省算法。需要将 consistent_coloring 设置为零才能使用此算法。对于此算法,不存在任何按进程历史记录。
虚拟地址=物理地址-程序中连续的页将从连续的容器中选择页。需要将 consistent_coloring 设置为 1 才能使用此算法。对于此算法,不存在任何按进程历史记录。
容器跳跃 (Bin-hopping)-程序中连续的页通常是每隔一个容器分配一个页面,但是此算法偶尔会跳过多个容器。需要将 consistent_coloring 设置为 2 才能使用此算法。每个进程都从随机选择的容器启动,并且保留最后所分配容器的每进程内存。
是
无。值大于 2 会导致控制台上显示多条 WARNING: AS_2_BIN:bad consistent coloring value 消息。此后系统立即挂起。需要重新启动电源才能恢复系统。
当系统的主工作负荷是一组长期运行的高性能计算 (high-performance computing, HPC) 应用程序时。更改此值可以优化性能。具有多个活动进程的文件服务器,数据库服务器和系统(例如,编译和分时服务器)则不会因更改而受益。
不稳定
按以下方式初始化 tsb_alloc_hiwater,以便设置可分配给转换存储缓冲区 (translation storage buffer, TSB) 的物理内存量的上限:
tsb_alloc_hiwater= 物理内存(以字节为单位)/tsb_alloc_hiwater_factor
当分配给 TSB 的内存与 tsb_alloc_hiwater 的值相等时,由于页面未映射,因此 TSB 内存分配算法将尝试回收 TSB 内存。
使用此因子增大 tsb_alloc_hiwater 值时务必谨慎。要防止系统挂起,生成的上限值必须远低于 swapfs_minfree 和 segspt_minfree 的值。
整数
32
1 到 MAXINT
请注意,如果因子为 1,则所有物理内存均可分配给 TSB,这可能导致系统挂起。如果因子太大,则没有可分配给 TSB 的内存,从而降低了系统性能。
是
无
如果系统具有许多关联到非常大的共享内存段的进程,则更改此参数的值。在大多数情况下,无需调节此变量。
不稳定
整数
缺省值为 0 (8 KB)
可能的值为:
值 |
说明 |
---|---|
0 |
8 KB |
1 |
16 KB |
3 |
32 KB |
4 |
128 KB |
5 |
256 KB |
6 |
512 KB |
7 |
1 MB |
是
无
该值通常不需要更改。但是,如果系统上多数进程的工作集都大于平均工作集,或者禁用了驻留集大小 (resident set size, RSS) 大小调整功能,则更改此值会很有益。
不稳定
布尔值
1(可以调整 TSB 的大小)
0(可以调整 TSB 的大小)或 1(TSB 保留为 tsb_default_size)
是
是
请勿修改此可调参数。
不稳定
控制 RSS 大小调整试探性算法的 RSS 到 TSB 的跨度比。此因子除以 512 便可得出 TSB 跨度的百分比,在将 TSB 视为备选的大小调整对象之前,此跨度比必须驻留在内存中。
整数
384,由于预期某些虚拟地址会映射到 TSB 中的同一个槽,因此只能得出值 75%。
0 到 512
是
无
如果具有较小地址空间的应用程序发现由于 TSB 中的虚拟地址冲突而导致的 TSB 未命中,则可能需要考虑将此值减小至 0。
例如,在某些情况下,将 tsb_rss_factor 更改为 50% 而不是 75% 可能有助于消除 TSB 中的虚拟地址冲突,但是会使用更多的内核内存,特别是在高负荷的系统上。
不稳定
在缓冲区中将用于重新同步 RAID 1 卷(镜像)的缓冲区大小设置为以 512 字节为单位的块数。设置更大的值可以加快重新同步的速度。
整数
缺省值为 128,对于小型系统尚可接受。较大的系统可能使用更大的值来加快镜像重新同步的速度。
128 到 2048
块(以 512 字节为单位)
否
无
使用 Solaris Volume Manager RAID 1 卷(镜像),并且希望加快镜像重新同步的速度时。假设您所具有的内存足以满足总体系统性能,则可以增大此值而不会导致其他性能问题。
如果需要加快镜像重新同步的速度,请以增量方式增大此参数的值(使用增量 128 块),直到获得满意的性能。在相当大的系统或新系统上,值 2048 可能为最佳值。在较旧的系统上设置较高的值可能会导致系统挂起。
不稳定
如果有任何有效状态数据库副本可用,则将覆盖 Solaris Volume Manager 要求的副本定额并强制启动 Solaris Volume Manager。
缺省值为禁用,即要求启动 Solaris Volume Manager 之前大多数副本可用且已同步。
布尔值
0(禁用)
0(禁用)或 1(启用)
否
无
不支持此参数的用法。
如果符合以下所有三个条件,则使用 Solaris Volume Manager 的用户可接受启用此参数的风险:
已镜像根 (/) 文件系统或其他对系统非常关键的文件系统
只有两个磁盘或控制器可用
需要执行无人参与型系统重新引导
如果启用此参数,则系统可能会使用不能正确表示系统状态(包括哪些镜像端完好,或哪些镜像端处于维护状态)的过时副本进行引导。这种情况可能会导致数据损坏或系统崩溃。
仅当系统可用性比数据一致性和完整性更重要时,才应更改此参数。密切监视系统中的任何故障。可以通过尽可能减少故障卷的个数、维护卷的个数或热交换卷的个数来减小风险。
有关状态数据库副本的更多信息,请参见《Solaris Volume Manager 管理指南》中的第 6 章 “状态数据库(概述)”。
不稳定
在 SPARC 系统上,这些参数影响板上网络吞吐量和等待时间。
如果禁用了中断抑制 (interrupt blanking) 功能,则包会在到达目的地时立即由驱动程序进行处理,这样会提高网络吞吐量并缩短等待时间,但是需要占用更多的 CPU。在禁用中断抑制 (interrupt blanking) 功能的情况下,在某些高负荷的 Web 服务器环境中,处理器使用率可以高达 80%–90%。
如果启用中断抑制 (interrupt blanking) 功能,则包会在发出中断命令时进行处理。启用中断抑制 (interrupt blanking) 功能会降低处理器使用率和网络吞吐量,并延长网络等待时间。
应该同时设置这两个参数。可使用 ndd 命令按如下方式设置这些参数:
# ndd -set /dev/eri intr_blank_time 0 # ndd -set /dev/eri intr_blank_packets 0 |
可按如下方式将它们添加到 /etc/system 文件中:
set eri:intr_blank_time 0 set eri:intr_blank_packets 0 |
在具有 eri 驱动程序的 SPARC 系统上,这两个参数为启用状态。
在具有 hme 驱动程序的 SPARC 系统上,这两个参数为禁用状态。
0(禁用)或 1(启用)
是
无
中断抑制 (interrupt blanking) 参数值综合考虑了网络吞吐量和处理器使用率。如果为了获取较高的网络吞吐量而可以接受较高的处理器使用率,则可禁用中断抑制 (interrupt blanking) 功能。如果首选较低的处理器使用率并且可以接受网络等待时间延长,则可启用中断抑制 (interrupt blanking) 功能。
不稳定