不能用 prlimit --nofile 动态调高运行中服务的软限制,因默认只改硬限制且软限不得超硬限;须先以 root 提升硬限(如 sudo prlimit --nofile=:8192 PID),再设软限(sudo prlimit --nofile=8192: PID),或一步指定 soft:hard(如 8192:8192)。

不能用 prlimit --nofile 动态调整正在运行服务的软限制(soft limit)连接句柄数——prlimit 默认只修改硬限制(hard limit),且软限制不能超过硬限制。若要调高软限制,必须先确保硬限制足够高,再显式指定软限制值。
确认当前 limits 并检查硬限制是否足够
先查看目标进程当前的文件描述符限制:
- 用
ps aux | grep 服务名找到 PID - 执行
prlimit -n PID,输出类似:
NOFILE soft=1024 hard=4096
表示当前软限 1024、硬限 4096 - 若想把软限调到 8192,但硬限只有 4096,则必须先提升硬限,否则会报错:
Operation not permitted
先提硬限制,再设软限制(需 root 权限)
必须用 root 执行,且目标进程需由同一用户启动(或具备 CAP_SYS_RESOURCE 能力):
- 一步到位(同时设软+硬):
sudo prlimit --nofile=8192:8192 PID
注意格式:soft:hard,中间是英文冒号 - 分两步(更清晰):
sudo prlimit --nofile=:8192 PID← 只改硬限(软限保持不变)sudo prlimit --nofile=8192: PID← 只改软限(硬限保持不变)
验证是否生效 & 注意事项
调整后立即验证:
- 再次运行
prlimit -n PID,确认 soft 和 hard 均已更新 - 注意:该操作仅对当前进程有效,重启服务后恢复 systemd 或启动脚本中定义的 limits
- 若服务由 systemd 管理,长期生效应修改其 service 文件:
在[Service]段添加:LimitNOFILE=8192或LimitNOFILE=8192:8192 - 普通用户进程默认无法提升硬限制,除非配置了
/etc/security/limits.conf或 systemd 的DefaultLimitNOFILE
常见失败原因
- 没加
sudo—— 非 root 用户无法提升硬限 - 软限写成
--nofile=8192—— 这只会改软限,但硬限不够则失败 - PID 错误或进程已退出 —— prlimit 会提示
No such process - 内核参数限制(如
/proc/sys/fs/nr_open)低于目标值 —— 需先调高该全局上限


















