温馨提示×

debian ulimit为何不够用

小樊
50
2026-09-09 23:15:05
栏目: 智能运维

在 Debian(以及绝大多数 Linux 发行版)里,ulimit 不够用是一个很常见的问题,通常不是“命令失效”,而是作用范围、默认值、单位或系统级限制导致的。下面按常见原因系统梳理一下。


一、ulimit 到底是什么(先纠正一个误区)

ulimitshell 级别的限制,只对:

  • 当前 shell
  • 当前 shell 启动的进程 有效

不是系统全局永久配置,也不是内核硬限制本身。


二、最常见的原因(90% 问题在这里)

1️⃣ ulimit 只在当前终端生效

ulimit -n 65535

退出终端或重启后:

  • 限制恢复默认
  • 新开 SSH 不生效

✅ 正确方式之一(临时):

ulimit -n 65535
./your_program

2️⃣ 修改了 ulimit,但服务不读 shell 环境

systemd 服务根本不读 .bashrc / profile

如果你是:

  • Nginx
  • MySQL
  • Redis
  • 自写 service

在 shell 里 ulimit 改了也没用

✅ systemd 正确方式:

[Service]
LimitNOFILE=65535

然后:

systemctl daemon-reload
systemctl restart xxx

3️⃣ 软限制改了,硬限制不够

ulimit -Hn   # 硬限制
ulimit -Sn   # 软限制

普通用户:

  • 只能 调低硬限制
  • 不能高于硬限制

✅ 提高硬限制需要 root:

ulimit -Hn 100000
ulimit -Sn 100000

4️⃣ Debian 默认 nofile 很小

Debian 默认经常是:

soft nofile 1024
hard nofile 4096

对高并发程序明显不够

✅ 永久修改(用户级):

/etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

⚠ 注意:

  • 需要 pam_limits.so
  • 仅对 登录用户 生效

5️⃣ 单位理解错(CPU / 内存)

ulimit -t    # 秒
ulimit -v    # KB
ulimit -u    # 进程数

比如:

ulimit -v 1000000

1GB 虚拟内存,不是 1TB


6️⃣ Docker / 容器里 ulimit 不继承宿主机

Docker 默认:

  • 不继承 host 的 ulimit

✅ 启动容器时:

docker run --ulimit nofile=65535:65535

或 docker-compose:

ulimits:
  nofile:
    soft: 65535
    hard: 65535

7️⃣ systemd 有“总上限”

即使你改了 limits.conf,systemd 可能仍限制:

system.conf
user.conf
DefaultLimitNOFILE=65535

三、快速自查清单 ✅

# 当前进程限制
cat /proc/$$/limits

# 某个进程
cat /proc/<pid>/limits

# systemd 服务
systemctl show xxx | grep Limit

四、如果你的场景是“某种具体不够用”

你可以直接说:

  • 文件描述符不够
  • 进程数爆了
  • 栈溢出
  • systemd / Docker / Kubernetes
  • 某个具体软件报错

我可以给你精确的一条命令级别解决方案

0