温馨提示×

为什么centos ulimit不够

小樊
41
2026-10-11 22:23:16
栏目: 智能运维

在 CentOS(以及大多数 Linux 发行版)中,ulimit 不够用通常并不是“系统不支持”,而是受多层限制和配置影响。下面按常见原因系统地解释一下。


一、ulimit 是什么(先理清概念)

ulimit 控制的是单个进程的资源上限,例如:

  • 打开文件数(nofile)
  • 进程/线程数(nproc)
  • 栈大小
  • 内存占用等

⚠️ 注意:

ulimit 是“进程级限制”,不是系统总资源


二、为什么你会感觉 ulimit “不够”

1️⃣ 只改了当前 shell,没生效到服务

很多人这样操作:

ulimit -n 65535

但:

  • 只对当前终端会话有效
  • 重启或新开进程后失效
  • systemd 启动的服务完全不读这个

✅ 正确方式(CentOS 7+):

/etc/security/limits.conf

或

/etc/systemd/system.conf
/etc/systemd/user.conf

2️⃣ systemd 不读 limits.conf(非常常见)

CentOS 7/8 使用 systemd:

limits.conf 对 systemd 服务默认不生效

必须改:

/etc/systemd/system.conf

例如:

DefaultLimitNOFILE=65535
DefaultLimitNPROC=65535

然后:

systemctl daemon-reexec

并确认服务里有:

[Service]
LimitNOFILE=65535

3️⃣ nproc 限制是“按用户”,不是“按进程”

nproc 限制的是:

该用户能创建的线程/进程总数

常见问题:

  • 数据库 + 应用 + 脚本同用户
  • 线程数叠加后超限

检查:

ulimit -u
cat /etc/security/limits.d/*.conf

4️⃣ 文件描述符被“系统级 + 用户级”双重限制

系统级(总上限)

cat /proc/sys/fs/file-max

临时调整:

sysctl -w fs.file-max=1000000

永久:

/etc/sysctl.conf
fs.file-max = 1000000

用户级(ulimit)

ulimit -n

⚠️ 即使 ulimit 很大,file-max 不够也会失败


5️⃣ 使用了非登录 shell / su - 问题

  • su ❌(不加载 limits)
  • su - ✅(登录 shell)

CentOS 中:

su mysql      # 可能不生效
su - mysql    # 生效

6️⃣ SELinux / 安全模块干扰(较少但存在)

某些服务在 SELinux 下:

  • 被强制限制资源
  • 日志在 /var/log/audit/audit.log

排查:

getenforce

7️⃣ 容器 / 云环境限制(很多人忽略)

如果你在:

  • Docker
  • Kubernetes
  • 云主机模板

那么:

  • ulimit 被父进程限制
  • 容器内改了也没用

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 太小
  • 或限制的是“用户”不是“进程”

如果你愿意,可以告诉我:

  • CentOS 版本(6 / 7 / 8 / Stream)
  • 具体场景(Nginx / MySQL / Java / Docker)
  • 报错信息

我可以直接给你一份可复制的配置。

0 踩