首页/系统/Linux 内核与性能调优速查/kernel.shmmax SysV 共享内存上限
sysctl 内核参数72 条

kernel.shmmax SysV 共享内存上限

shmmax 限制单个共享内存段字节数、shmall 限制系统共享内存总页数、shmmni 限制段数量;数据库部署常需核对。

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_groupGID允许使用大页共享内存的用户组
shmall 的单位是页而 shmmax 的单位是字节,单位混用是经典事故;修改前把单位与换算写进注释,避免下一次自己看错。
PostgreSQL 等现代应用常用 mmap 与大页共享内存,与 SysV 参数没有直接关系,先确认应用实际依赖哪套机制再动手。

按应用类型核对

  • 数据库实例:按官方文档给出的共享内存段大小核对 shmmax 与 shmall
  • 缓存与消息中间件:先确认使用的是 SysV 共享内存还是文件映射
  • 大页共享内存:需要同时配置大页预留与 hugetlb_shm_group 用户组
  • 排查阶段先用 ipcs -m 列出实际存在的段,再回头核对参数限值

易错点

  • 单位混用:shmall 按字节设置会小到几乎不可用,按页设置才正确
  • 只调 shmmax 不调 shmall:单段够大但总量受限,仍然会分配失败
  • 忽略残留段:异常退出的应用会留下无人挂接的段持续占用总量
  • 照搬旧文档数值:不同应用与版本要求不同,应以官方部署文档为准
  • 以为所有数据库都依赖 SysV:现代版本多用 mmap,改错对象没有任何效果

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/kernel.rst
  • man 2 shmget
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌