首页/系统/Linux 内核与性能调优速查/kernel.sem SysV 信号量四元组
sysctl 内核参数72 条

kernel.sem SysV 信号量四元组

四个数值分别限制:每组信号量数、系统信号量总数、单次操作数、信号量组数(发行版常见 250 32000 32 128)。

System V 信号量四元组

kernel.sem 由四个数字组成,用于限制 System V 信号量的规模:semmsl(单个信号量组内信号量数量上限)、semmns(全系统信号量总数)、semopm(单次 semop 调用可操作的最大数量)、semmni(全系统信号量组数量上限)。发行版常见写法是 250 32000 32 128,四个位置含义不同,顺序记错就会出现「配置看似生效但应用照样报错」。

基本信息

格式kernel.sem = semmsl semmns semopm semmni
常见发行版值250 32000 32 128
查看现状sysctl kernel.sem;ipcs -s 列出已存在的信号量组
系统调用semget / semop / semctl(System V 接口)
生效方式root 写入后立即生效,重启丢失

典型使用场景

  • 数据库或中间件启动报无法创建信号量、ENOSPC 类错误
  • 遗留应用依赖 System V 信号量,需按官方文档核对参数
  • 按并发量核对 semopm 是否低于应用单次操作数
  • 排查信号量泄漏:清理异常退出留下的信号量组
  • 基线审计:确认发行版默认值是否被调优脚本改写

查看与调整

查看与调整
sysctl kernel.sem
ipcs -s | head          # 现有信号量组,nattch 非 0 说明仍被占用
ipcs -s -i 32768        # 查看指定 semid 的详细信息
ipcs -l | grep -A3 -i sem   # 打印当前限制与实际使用量
sysctl -w kernel.sem='250 32000 32 128'   # 临时修改,四值顺序不可颠倒
cat /proc/sys/kernel/sem
ulimit -s               # 注意这是栈大小,与信号量无关,别混用

四元组逐项读法

位置名称含义与异常表现
第 1 个semmsl单组内信号量上限,调小会让需要大组的应用 semget 失败
第 2 个semmns全系统信号量总数上限,报 ENOSPC 常需抬高
第 3 个semopm单次 semop 操作数上限,低于应用单次操作数会返回 EINVAL
第 4 个semmni全系统信号量组数上限,泄漏的组会把它耗尽
数据库与中间件安装文档通常给出按并发量计算的数值,按其官方要求设置最稳妥,不要照抄来源不明的数字。
现代应用与容器环境更常用 POSIX 信号量或文件锁;调整前先确认应用依赖的是哪一种接口,改错对象等于没改。

易错点

  • 记错四值顺序:配置看似写入成功但应用仍旧报错,改前应逐位标注含义
  • 只调 semmns 不调 semmni:组数耗尽与总数耗尽的报错不同,参数要对准错误码
  • 忽略信号量泄漏:异常退出的进程会留下 nattch 为 0 的组,ipcs -s 可见但不会自动回收
  • 把 ulimit -s 当信号量参数:那是线程栈大小,与 System V 信号量无关
  • 盲目放大到网上流传的数值:信号量是内核资源,放大不会带来性能提升

数据来源与参考

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