在 Debian(以及大多数 Linux 发行版)中,ulimit 用于控制单个进程可使用的系统资源上限(文件描述符、进程数、内存、栈大小等)。所谓“调优”,通常是根据业务场景提高或合理限制这些上限,避免资源耗尽或性能瓶颈。
下面按「概念 → 查看 → 临时调整 → 永久调整 → 常见场景」系统说明。
ulimit 是 shell 内建命令,影响的是当前 shell 及其子进程。
常见重要参数:
| 参数 | 含义 |
|---|---|
-n |
文件描述符(fd)数量 |
-u |
用户最大进程数 |
-m |
最大内存(很多系统忽略) |
-v |
虚拟内存 |
-s |
栈大小 |
-c |
core 文件大小 |
-t |
CPU 时间 |
ulimit -a
示例输出:
core file size (blocks, -c) 0
open files (-n) 1024
max user processes (-u) 1024
查看单个:
ulimit -n
ulimit -u
ulimit -n 65535
ulimit -u 4096
⚠️ 注意:
查看硬/软限制:
ulimit -Hn # 硬限制
ulimit -Sn # 软限制
/etc/security/limits.conf编辑:
vim /etc/security/limits.conf
示例(对用户 www):
www soft nofile 65535
www hard nofile 65535
www soft nproc 4096
www hard nproc 4096
说明:
soft:软限制(可临时超过)hard:硬限制(上限)nofile:文件描述符nproc:进程数✅ 需要重新登录或重启服务才生效
如果你的程序是 systemd 服务,
limits.conf 不会生效!
编辑 service 文件:
systemctl edit nginx
添加:
[Service]
LimitNOFILE=65535
LimitNPROC=4096
然后:
systemctl daemon-reload
systemctl restart nginx
查看是否生效:
cat /proc/<pid>/limits
即使 ulimit 调高,内核也有总上限:
cat /proc/sys/fs/file-max
临时调整:
sysctl -w fs.file-max=1000000
永久:
vim /etc/sysctl.conf
fs.file-max = 1000000
sysctl -p
nofile 65535+
nproc 4096+
nofile 65535
还需注意:
-Xss 栈大小限制普通用户:
* soft nproc 1024
* hard nproc 2048
ulimit -c unlimited
或:
* soft core unlimited
❌ 改了 limits.conf 但没生效
→ 服务是 systemd 启动的
❌ Docker 容器不生效
→ 需在宿主机或 docker run 时指定:
docker run --ulimit nofile=65535:65535
❌ 普通用户无法调高
→ 超过 hard limit
ulimit -n
cat /proc/<pid>/limits
sysctl fs.file-max
systemctl show <service> | grep Limit
如果你能告诉我:
我可以给你一套精确调优参数。