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 信号量或文件锁;调整前先确认应用依赖的是哪一种接口,改错对象等于没改。