在 CentOS(以及大多数 Linux 发行版)中,ulimit 不够用通常并不是“系统不支持”,而是受多层限制和配置影响。下面按常见原因系统地解释一下。
ulimit 控制的是单个进程的资源上限,例如:
⚠️ 注意:
ulimit 是“进程级限制”,不是系统总资源
很多人这样操作:
ulimit -n 65535
但:
✅ 正确方式(CentOS 7+):
/etc/security/limits.conf
或
/etc/systemd/system.conf
/etc/systemd/user.conf
CentOS 7/8 使用 systemd:
limits.conf 对 systemd 服务默认不生效
必须改:
/etc/systemd/system.conf
例如:
DefaultLimitNOFILE=65535
DefaultLimitNPROC=65535
然后:
systemctl daemon-reexec
并确认服务里有:
[Service]
LimitNOFILE=65535
nproc 限制的是:
该用户能创建的线程/进程总数
常见问题:
检查:
ulimit -u
cat /etc/security/limits.d/*.conf
cat /proc/sys/fs/file-max
临时调整:
sysctl -w fs.file-max=1000000
永久:
/etc/sysctl.conf
fs.file-max = 1000000
ulimit -n
⚠️ 即使 ulimit 很大,file-max 不够也会失败
su ❌(不加载 limits)su - ✅(登录 shell)CentOS 中:
su mysql # 可能不生效
su - mysql # 生效
某些服务在 SELinux 下:
/var/log/audit/audit.log排查:
getenforce
如果你在:
那么:
Docker 示例:
docker run --ulimit nofile=65535:65535
# 当前进程限制
cat /proc/$$/limits
# 系统总限制
cat /proc/sys/fs/file-max
# systemd 服务限制
systemctl show <服务名> | grep Limit
CentOS 上 ulimit“不够”,99% 是因为:
- systemd 没配
- limits.conf 没生效
- 系统级 file-max 太小
- 或限制的是“用户”不是“进程”
如果你愿意,可以告诉我:
我可以直接给你一份可复制的配置。