SysV 共享内存上限
System V 共享内存由三个参数共同限制:kernel.shmmax 限制单个共享内存段的字节数上限,kernel.shmall 限制系统内共享内存的总页数,kernel.shmmni 限制段的数量(常见 4096)。数据库等应用在安装前常要求核对这组值,因为单个实例的共享内存段通常很大。特别要注意单位差异:shmmax 以字节计,shmall 以页计,单位混用是典型的配置事故。
基本信息
| shmmax | 单个共享内存段的字节上限 |
|---|---|
| shmall | 系统内共享内存的总页数上限 |
| shmmni | 共享内存段数量上限,常见 4096 |
| 查看 | sysctl 与 ipcs -m、ipcs -lm |
| 相关项 | vm.hugetlb_shm_group 控制哪个组可用大页共享内存 |
典型使用场景
- 数据库实例启动失败并报共享内存不足
- 按官方安装文档核对共享内存参数
- 排查 ipcs -m 中残留段占用的资源
- 大内存机器上规划共享内存总量
- 对比 SysV 与 POSIX 共享内存两种方案
查看与调整
查看与调整
sysctl kernel.shmmax kernel.shmall kernel.shmmni
ipcs -m # 现有共享内存段与大小
ipcs -lm # 打印当前各类限制值
ipcs -m | awk '$5==0 {print}' # 挂接数为 0 的残留段
sysctl -w kernel.shmmax=68719476736
sysctl -w kernel.shmall=16777216
cat /proc/sys/kernel/shmmax
ipcrm -m <shmid> # 清理确认无用的残留段参数单位对照
| 参数 | 单位 | 含义 |
|---|---|---|
| kernel.shmmax | 字节 | 单个共享内存段的字节上限 |
| kernel.shmall | 页 | 系统内共享内存总页数上限 |
| kernel.shmmni | 个数 | 共享内存段数量上限 |
| vm.hugetlb_shm_group | GID | 允许使用大页共享内存的用户组 |
shmall 的单位是页而 shmmax 的单位是字节,单位混用是经典事故;修改前把单位与换算写进注释,避免下一次自己看错。
PostgreSQL 等现代应用常用 mmap 与大页共享内存,与 SysV 参数没有直接关系,先确认应用实际依赖哪套机制再动手。
按应用类型核对
- 数据库实例:按官方文档给出的共享内存段大小核对 shmmax 与 shmall
- 缓存与消息中间件:先确认使用的是 SysV 共享内存还是文件映射
- 大页共享内存:需要同时配置大页预留与 hugetlb_shm_group 用户组
- 排查阶段先用 ipcs -m 列出实际存在的段,再回头核对参数限值