Ubuntu ulimit 设置

发布于:2025-08-09 ⋅ 阅读:(15) ⋅ 点赞:(0)
#<domain>     <type>  <item>          <value>
*          soft    nofile          2097152
*          hard    nofile          2097152
*          soft    memlock         4194304
*          hard    memlock         unlimited
*          soft    stack           524288
*          hard    stack           unlimited
root       soft    nofile          2097152
root       hard    nofile          2097152
root       soft    memlock         4194304
root       hard    memlock         unlimited
root       soft    stack           524288
root       hard    stack           unlimited

设置的是这个为啥会看到的结果是

ulimit -n
1024
ulimit -Hn
524288

你在 /etc/security/limits.conf 中明明设置了:

*     soft    nofile   2097152
*     hard    nofile   2097152
root  soft    nofile   2097152
root  hard    nofile   2097152

但你登录后却看到:

ulimit -n    => 1024        # soft limit
ulimit -Hn   => 524288      # hard limit

这表示:

  • 你的 nofile 限制没有完全按 /etc/security/limits.conf 生效
  • 但系统 部分提高了 hard limit 到 524288,不是你配置的 2097152

✅ 可能的真实原因(很可能是 systemd “覆盖掉了” limits.conf)

💡 现代系统(特别是 Ubuntu 16+、CentOS 7+/RHEL 7+)使用 systemd 启动服务和 shell session,不会默认读取 limits.conf,而是通过 systemd 的 DefaultLimitNOFILE 控制。


🔍 核实你的 systemd 默认限制

你可以运行:

systemctl show --property=DefaultLimitNOFILE

结果可能是:

DefaultLimitNOFILE=1024:524288

这个意思是:

  • soft = 1024
  • hard = 524288

这就解释了你当前看到的 ulimit 输出。


✅ 解决方法:让 systemd 遵循你的限制(推荐)

你有两种方式可以修复:


🔧 方法 1:修改全局 systemd 限制(影响所有服务)

编辑:

sudo vim /etc/systemd/system.conf
sudo vim /etc/systemd/user.conf

找到并取消注释这两行(或者加上):

DefaultLimitNOFILE=2097152

然后:

sudo systemctl daemon-reexec

⚠️ 此方法对 login shell 和所有 systemd 启动的服务/终端都有效


🔧 方法 2:修改特定服务(如 containerd、kubelet、sshd)

创建或编辑对应服务 override 文件:

sudo systemctl edit sshd

输入以下内容:

[Service]
LimitNOFILE=2097152

保存后重启服务:

sudo systemctl daemon-reexec
sudo systemctl restart sshd

🔧 方法 3:如果你用的是 susudo 进入 root

sudo susu 默认不会创建 login shell(不走 pam)

所以你应该:

su - root    # 带 `-` 才走 pam 和 limits.conf

或者直接从 ssh 登录,避免 sudo su 的中间壳限制。


✅ 推荐验证流程:

  1. 检查 systemd 默认限制:
systemctl show --property=DefaultLimitNOFILE
  1. 临时调高以测试:
ulimit -n 2097152

✅ 如果能成功说明只是 shell 启动限制问题。

  1. 最终目标:
ulimit -n    # 应该默认是 2097152
ulimit -Hn   # 应该也是 2097152

🧭 总结:

问题原因 是否符合你的情况
systemdDefaultLimitNOFILE 限制了你 ✅ 很可能
使用了非 login shell(例如 sudo su ✅ 可能
/etc/security/limits.conf 本身无效 ❌ 配置正确
PAM 未加载 pam_limits.so 如果你配置了就 ✅
systemd 启动服务时没有设置 LimitNOFILE ✅ 如果你关心后台服务

需要我帮你定制一份修复流程(比如你的发行版是 Ubuntu 20.04,使用 systemd)可以继续贴出来,我可以一步步帮你操作。
⚠️警告:修改完 /etc/systemd/system.conf 后必须重启操作系统才能生效。


网站公告

今日签到

点亮在社区的每一天
去签到