












⚠️关键点:
/etc/security/limits.conf只对登录 shell 会话生效;systemd 托管的后台服务完全忽略该文件。- 进程一旦启动,ulimit 不会动态更新,必须重启进程 / 服务才生效。
- 两层限制:用户层 ulimit;内核全局
fs.file‑max。
# 当前shell软限制
ulimit -n
(base) [root@VM-8-12-centos ~]# ulimit -n
100001
# 当前shell硬限制
ulimit -Hn
(base) [root@VM-8-12-centos ~]# ulimit -Hn
100002
# 查看某个正在运行进程真实限制(PID替换成你的进程号)
cat /proc/<PID>/limits | grep "Max open files"
# systemd服务查看LimitNOFILE
systemctl show yourservice --property=LimitNOFILE
(base) [root@VM-8-12-centos ~]# systemctl show yourservice --property=LimitNOFILE
LimitNOFILE=1048576
# 内核全局最大文件句柄
sysctl fs.file-max
(base) [root@VM-8-12-centos ~]# sysctl fs.file-max
fs.file-max = 198942
ulimit -n 65536
编辑 limits.conf
sudo nano /etc/security/limits.conf
文件末尾追加(示例 65536,按需调整):
* soft nofile 65536
* hard nofile 65536
root soft nofile 65536
root hard nofile 65536
root 必须单独写,
*不覆盖 root 用户。
检查 PAM 是否开启(Ubuntu 默认开启):
grep pam_limits.so /etc/pam.d/common-session
要有:session required pam_limits.so,没有就手动加上腾讯云。
生效:完全注销退出登录,重新 ssh/login,不要 su 切换,再执行
ulimit‑n验证。
limits.conf 对 systemd 服务无效!! 必须改 systemd 配置。
sudo systemctl edit myapp.service
填入:
[Service]
# soft:hard,示例:软65536,硬1048576
LimitNOFILE=65536:1048576
保存退出,重载并重启服务:
sudo systemctl daemon-reload
sudo systemctl restart myapp
sudo mkdir -p /etc/systemd/system.conf.d
sudo nano /etc/systemd/system.conf.d/99-nofile.conf
[Manager]
DefaultLimitNOFILE=65536:1048576
生效:
sudo systemctl daemon-reexec
daemon‑reexec重启 systemd 主进程,所有已运行的 systemd 服务需要各自重启才会拿到新限制,旧进程保持旧值。
一般默认足够,高并发场景调大:
sudo nano /etc/sysctl.conf
fs.file-max = 2097152
应用:
sudo sysctl -p
ulimit‑n不变:没有完全注销重登录,su/sudo 不会加载 pam_limits,新开 ssh 会话测试。/proc/PID/limits还是 1024:没有修改 systemd 的 LimitNOFILE,服务未重启。fs.nr_open会失败;LimitNOFILE硬值不能超过fs.nr_open。echo "=== shell ulimit -n ==="
ulimit -n
ulimit -Hn
echo "=== kernel fs.file-max ==="
sysctl fs.file-max
echo "=== systemd全局默认 ==="
systemctl show --property=DefaultLimitNOFILE
如果你告诉我:是 ssh 登录运行程序,还是 systemd service 托管,我可以给你直接复制粘贴的整套配置。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。