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 时,可能要更改此参数。将此变量设置为较大的内存量,会导致继续将页添加到可用列表。
当系统的内存压力急剧增加时,也可能要更改此参数。较大的值有助于显著缓解压力。
不稳定