如何在 Solaris 10,11 中配置共享内存参数

较新版本的 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
日期:2020-09-17 00:15:06 来源:oir作者:oir