在 Debian(以及大多数 Linux 发行版)中,ulimit 用于限制 shell 及其子进程 可使用的系统资源,如文件描述符、进程数、内存等。优化 ulimit 通常是为了 高并发、数据库、Web 服务、容器、开发环境 等场景。
下面按 优化维度 + 配置方式 + 常见场景 系统说明。
ulimit -a
常见关键项:
| 项目 | 含义 | 常见优化点 |
|---|---|---|
-n |
文件描述符(open files) | Web / DB / 高并发 |
-u |
最大用户进程数 | 多进程服务 |
-s |
栈大小 | 程序崩溃、线程多 |
-m |
内存(RSS) | 不常用 |
-v |
虚拟内存 | 有限 |
-c |
core dump | 调试 |
-t |
CPU 时间 | 安全限制 |
ulimit -n
ulimit -u
ulimit -n 65535
ulimit -u 4096
⚠️ 只对当前 shell 和子进程有效,重启失效
/etc/security/limits.conf(最常用)编辑:
sudo vim /etc/security/limits.conf
示例(推荐配置):
* soft nofile 65535
* hard nofile 65535
* soft nproc 4096
* hard nproc 4096
说明:
*:所有用户(可改为 root、www-data 等)soft:软限制(可临时突破)hard:硬限制(不可突破)nofile:文件描述符nproc:进程数✅ 对登录用户生效(SSH、su)
sudo vim /etc/security/limits.d/99-custom.conf
内容同上:
* soft nofile 65535
* hard nofile 65535
✅ 优先级高于 limits.conf
⚠️ systemd 启动的服务默认不读 limits.conf
systemctl show nginx | grep Limit
sudo systemctl edit nginx
写入:
[Service]
LimitNOFILE=65535
LimitNPROC=4096
重载:
sudo systemctl daemon-reexec
sudo systemctl restart nginx
✅ 数据库 / Web / Java 服务必须这样
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
sysctl kernel.pid_max
修改:
kernel.pid_max = 65535
LimitNOFILE=65535
LimitNOFILE=65535
LimitNPROC=4096
LimitNOFILE=65535
LimitNOFILE=65535
LimitNPROC=4096
{
"default-ulimits": {
"nofile": { "Name": "nofile", "Hard": 65535, "Soft": 65535 }
}
}
docker run --ulimit nofile=65535:65535
cat /proc/$(pidof nginx)/limits
lsof | wc -l
❌ 修改 limits.conf 后 systemd 服务不生效
✅ 必须改 service 的 LimitNOFILE
❌ 文件描述符仍不够
✅ 检查 fs.file-max
❌ Docker 容器不生效
✅ 检查 daemon ulimit 或 run 参数
* soft nofile 65535
* hard nofile 65535
* soft nproc 4096
* hard nproc 4096
fs.file-max = 2097152
kernel.pid_max = 65535
如果你愿意,我可以:
只要告诉我你的使用场景即可。