在 Debian(以及绝大多数 Linux 发行版)里,ulimit 不够用是一个很常见的问题,通常不是“命令失效”,而是作用范围、默认值、单位或系统级限制导致的。下面按常见原因系统梳理一下。
ulimit 到底是什么(先纠正一个误区)ulimit 是 shell 级别的限制,只对:
它不是系统全局永久配置,也不是内核硬限制本身。
ulimit 只在当前终端生效ulimit -n 65535
退出终端或重启后:
✅ 正确方式之一(临时):
ulimit -n 65535
./your_program
ulimit,但服务不读 shell 环境systemd 服务根本不读 .bashrc / profile
如果你是:
在 shell 里 ulimit 改了也没用
✅ systemd 正确方式:
[Service]
LimitNOFILE=65535
然后:
systemctl daemon-reload
systemctl restart xxx
ulimit -Hn # 硬限制
ulimit -Sn # 软限制
普通用户:
✅ 提高硬限制需要 root:
ulimit -Hn 100000
ulimit -Sn 100000
nofile 很小Debian 默认经常是:
soft nofile 1024
hard nofile 4096
对高并发程序明显不够
✅ 永久修改(用户级):
/etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
⚠ 注意:
pam_limits.soulimit -t # 秒
ulimit -v # KB
ulimit -u # 进程数
比如:
ulimit -v 1000000
是 1GB 虚拟内存,不是 1TB
Docker 默认:
ulimit✅ 启动容器时:
docker run --ulimit nofile=65535:65535
或 docker-compose:
ulimits:
nofile:
soft: 65535
hard: 65535
即使你改了 limits.conf,systemd 可能仍限制:
system.conf
user.conf
DefaultLimitNOFILE=65535
# 当前进程限制
cat /proc/$$/limits
# 某个进程
cat /proc/<pid>/limits
# systemd 服务
systemctl show xxx | grep Limit
你可以直接说:
我可以给你精确的一条命令级别解决方案。