较新版本的 Solaris 使用资源控制设置来配置共享内存。
配置新系统时,建议使用它们,即使 /etc/system 设置仍然可用。
最好只使用一种方法来配置共享内存。
当系统从旧 Solaris 版本升级时,/etc/system 设置可能仍然存在,因此了解这些设置与新资源控制设置的关系很重要。
为避免混淆,最好在使用资源控制实现后从 /etc/system 中删除这些设置。
我们的测试系统:
# prtdiag -v System Configuration: Sun Microsystems sun4u Sun Ultra 2 UPA/SBus (2 X UltraSPARC-II 296MHz) System clock frequency: 99 MHz Memory size: 256 Megabytes
本节以 root 用户为例说明 /etc/system 设置和新的资源控制设置之间的交互。
共享内存的两个项目设置是 project.max-shm-memory,其默认值为 1/4 physmem,最大值为 UINT64_MAX,以及 project.max-shm-ids,其默认值为 128,最大值为2的24次方.
它们分别控制项目中进程可以分配的共享内存总量,以及项目中可以存在的段数。
在 /etc/system 中没有共享内存设置,也没有任何项目的条目,显示我们登录的用户的设置($$ 给出当前进程的 pid):
# prctl -n project.max-shm-memory -i process $$ process: 1179: sh NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT project.max-shm-memory privileged 61.1MB - deny
# prctl -n project.max-shm-ids -i process $$ process: 1179: sh NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT project.max-shm-ids privileged 128 - deny
如果 /etc/system 中有共享内存设置,但没有为项目设置资源控制,则所有进程的设置都从
/etc/系统设置。
添加到 /etc/system(此值为 3MB):
set shmsys:shminfo_shmmax = 3145728
重新启动系统以使其读取 /etc/system 中的设置。
# prctl -n project.max-shm-memory -i process $$ process: 611: sh NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT project.max-shm-memory privileged 300MB - deny
# prctl -n project.max-shm-ids -i process $$ process: 611: sh NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT project.max-shm-ids privileged 128 - deny
因为 /etc/system 中只设置了 shminfo_shmmax,project.max-shm-memory 的值是通过将 shminfo_shmmax 乘以 shminfo_shmmni 的默认值 100 来计算的。
shminfo_shmmax 是用户可以分配的最大段,但项目。
max-shm-memory 是用户可以分配的所有段的最大总数。
将此添加到 /etc/system 以及:
# vi /etc/system set shmsys:shminfo_shmmni = 50
重新启动系统并验证值。
# prctl -n project.max-shm-memory -i process $$ process: 610: sh NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT project.max-shm-memory privileged 150MB - deny
# prctl -n project.max-shm-ids -i process $$ process: 610: sh NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT project.max-shm-ids privileged 128 - deny
如果用户所属的项目有 project.max-shm-memory 设置,则该值会覆盖 /etc/system 中的任何内容。
为 root 用户设置一个值:
# projmod -K project.max-shm-memory="(priv,100M,deny)" user.root
我们永远不应该自己编辑 /etc/project 文件,但我们可以查看使用 projmod 命令设置的值:
# more /etc/project system:0:::: user.root:1::::project.max-shm-memory=(priv,104857600,deny) ...
# prctl -n project.max-shm-memory -i process $$ process: 610: sh NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT project.max-shm-memory privileged 150MB - deny
退出 root 登录并重新登录以验证参数值。
# prctl -n project.max-shm-memory -i process $$ process: 632: sh NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT project.max-shm-memory privileged 100MB - deny