ulimit 是 Linux 控制进程资源上限的核心机制,重点管理“打开文件数”(nofile),需区分 soft/hard 限制、临时修改(当前 Shell 有效)与永久修改(limits.conf 或 systemd 配置)。

Linux 中 ulimit 是控制进程资源使用上限的核心机制,其中“打开文件数”(nofile)限制最常遇到——服务启动失败、日志报错“Too many open files”,往往就是它在作祟。调整需区分临时生效与永久生效,且要注意 soft/hard 两层限制的关系。
理解 soft 与 hard 限制的区别
每个 ulimit 项都有 soft 和 hard 两个值:
- soft limit:进程实际遵守的限制,可由普通用户自行调低,或由 root 在不超过 hard 值的前提下调高
- hard limit:soft 的上限门槛,普通用户无法突破,仅 root 可修改(且需先提升 hard 才能提升 soft)
例如执行 ulimit -n 65536,实际是设置 soft nofile;若当前 hard 值为 4096,该命令会失败,需先用 sudo ulimit -Hn 65536 提升 hard 值。
临时修改:仅对当前 Shell 及其子进程有效
适用于调试、测试或单次运行高并发程序:
- 查看当前限制:
ulimit -n(显示 soft 值),ulimit -Hn查 hard 值 - 设置 soft nofile 为 65536:
ulimit -n 65536 - 同时设置 soft 和 hard(需 root):
sudo ulimit -n 65536; ulimit -n 65536
注意:该方式退出终端即失效,systemd 管理的服务默认不继承交互式 Shell 的 ulimit 设置。
永久修改:影响系统级服务与用户登录会话
推荐通过 /etc/security/limits.conf 配置,按用户、组或通配符生效:
- 为特定用户设限(如 nginx 用户):
nginx soft nofile 65536
nginx hard nofile 65536 - 为所有普通用户设限:
* soft nofile 65536
* hard nofile 65536 - 为某个用户组(如 www-data):
@www-data soft nofile 65536
@www-data hard nofile 65536
配置后需重新登录或重启服务才能生效;systemd 服务还需额外处理(见下条)。
systemd 服务的特殊处理
systemd 忽略 limits.conf,必须在 service 单元文件中显式声明:
- 编辑服务文件,如
/etc/systemd/system/nginx.service,在[Service]段添加:
LimitNOFILE=65536 - 重载配置并重启:
sudo systemctl daemon-reload && sudo systemctl restart nginx - 验证是否生效:
systemctl show nginx | grep LimitNOFILE或查进程实际值:cat /proc/$(pidof nginx)/limits | grep "Max open files"
若使用 systemctl --user 启动的服务,需在 ~/.config/systemd/user.conf 中设置 DefaultLimitNOFILE=65536 并重载用户 manager。


















