在 Ubuntu 中,ulimit 用于限制用户进程可使用的系统资源(如文件描述符数量、进程数、内存等)。下面按使用场景系统说明如何设置。
ulimit -a
常见参数:
ulimit -n # 文件描述符数量
ulimit -u # 最大用户进程数
ulimit -s # 栈大小
ulimit -c # core 文件大小
只对当前终端 / 当前用户有效,重启或新开 shell 失效。
ulimit -n 65535
ulimit -u 4096
⚠️ 非 root 用户只能调小,不能调大超过系统限制。
/etc/security/limits.conf编辑文件:
sudo vim /etc/security/limits.conf
示例(对某个用户):
www-data soft nofile 65535
www-data hard nofile 65535
* soft nproc 4096
* hard nproc 4096
格式说明:
<用户/组> soft/hard 资源类型 值
常用资源:
nofile:打开文件数nproc:进程数memlock:锁定内存core:core 文件✅ 需要 重新登录 或重启生效。
检查:
grep pam_limits /etc/pam.d/common-session
grep pam_limits /etc/pam.d/common-session-noninteractive
应有:
session required pam_limits.so
如果是 systemd 服务(如 nginx、mysql、docker),limits.conf 不生效。
sudo systemctl edit nginx
添加:
[Service]
LimitNOFILE=65535
LimitNPROC=4096
然后:
sudo systemctl daemon-reload
sudo systemctl restart nginx
查看:
cat /proc/$(pgrep nginx | head -1)/limits
cat /proc/sys/fs/file-max
临时修改:
sudo sysctl -w fs.file-max=1000000
永久:
sudo vim /etc/sysctl.conf
fs.file-max = 1000000
sudo sysctl -p
❌ limits.conf 对 systemd 服务无效
❌ 非 root 用户不能调高 hard limit
❌ Docker 容器需额外设置 --ulimit
❌ 修改后不重新登录不生效
docker run --ulimit nofile=65535:65535 nginx
如果你能告诉我:
我可以给你精确配置示例。