温馨提示×

如何优化ubuntu ulimit

小樊
49
2026-10-26 04:11:54
栏目: 智能运维

在 Ubuntu 中,ulimit 用于控制 shell 及进程可使用的系统资源(如打开文件数、进程数、内存等)。优化 ulimit 通常是为了解决“Too many open files”“fork: retry: Resource temporarily unavailable”等问题。下面按使用场景 + 配置方式系统说明。


一、先了解当前 ulimit 状态

ulimit -a

常见关键项:

  • open files (-n):最大打开文件数
  • max user processes (-u):最大用户进程数
  • stack size (-s)
  • virtual memory (-v)

查看某一项:

ulimit -n
ulimit -u

二、临时修改(仅当前 shell / 进程)

ulimit -n 65535
ulimit -u 4096

⚠️ 重启或新开 shell 后失效。


三、用户级永久配置(推荐)

1️⃣ 修改 /etc/security/limits.conf

sudo vim /etc/security/limits.conf

示例(为所有用户或指定用户):

* soft nofile 65535
* hard nofile 65535
* soft nproc 4096
* hard nproc 4096

说明:

  • soft:警告值(可临时超过)
  • hard:最大值(不可超过)
  • nofile:打开文件数
  • nproc:进程数

✅ 生效条件:

  • 使用 PAM 登录(SSH / 桌面登录)
  • 重启或重新登录

2️⃣ systemd 用户限制(重点!)

在 Ubuntu 16.04+ / 18.04+ / 20.04+ 中,很多服务由 systemd 管理,limits.conf 不生效。

修改用户级 systemd 限制

sudo vim /etc/systemd/user.conf
DefaultLimitNOFILE=65535
DefaultLimitNPROC=4096
systemctl --user daemon-reexec

四、服务级 ulimit(最常见坑)

1️⃣ 修改 systemd service 文件

sudo systemctl edit nginx

加入:

[Service]
LimitNOFILE=65535
LimitNPROC=4096

然后:

sudo systemctl daemon-reload
sudo systemctl restart nginx

查看是否生效:

cat /proc/$(pgrep nginx | head -1)/limits

五、系统级内核参数(配合 ulimit)

1️⃣ 文件描述符总数

cat /proc/sys/fs/file-max

临时:

sudo sysctl -w fs.file-max=2097152

永久:

sudo vim /etc/sysctl.conf
fs.file-max = 2097152
sudo sysctl -p

2️⃣ 进程数限制(pid_max)

cat /proc/sys/kernel/pid_max
sudo sysctl -w kernel.pid_max=4194304

六、常见优化场景推荐值

Web / 数据库服务器

nofile 65535~1048576
nproc  4096~8192

高并发 Java / Node / Go

nofile 100000+

Docker 容器

docker run --ulimit nofile=65535:65535

七、排错 checklist

✅ 修改后是否重新登录 / 重启服务
✅ systemd 服务是否单独配置 Limit*
✅ 是否受内核 file-max 限制
✅ root 用户是否被 * 覆盖(需显式写 root)


如果你能告诉我:

  • Ubuntu 版本
  • 使用场景(Web / DB / Docker / Java)
  • 报错信息

我可以给你一套精确可直接用的配置。

0 踩