ulimit -n 修改无效是因为软限制不能超过硬限制,且 systemd 服务不读取 /etc/security/limits.conf;需先调高硬限制并重新登录,systemd 服务须单独配置 limitnofile 并重载。

ulimit -n 为什么改了没效果
直接运行 ulimit -n 65536 却发现新起的进程还是 1024,不是命令错了,而是软限制被硬限制卡死了。Linux 要求:当前会话的软限制(ulimit -Sn)不能超过硬限制(ulimit -Hn),而硬限制又受限于 /etc/security/limits.conf 和系统级上限 /proc/sys/fs/file-max。
实操建议:
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
- 先查硬限制:
ulimit -Hn,若输出是 4096,那ulimit -n 65536必然失败 - 普通用户无法临时提硬限,必须改
/etc/security/limits.conf并重新登录(SSH 断开重连,不是新开终端窗口) - root 用户也要显式写
root soft nofile 65536和root hard nofile 65536,*不匹配 root - 确认
/etc/pam.d/common-session含session required pam_limits.so(Ubuntu/Debian 默认有;CentOS 需检查/etc/pam.d/system-auth)
systemd 服务的 LimitNOFILE 怎么设才生效
nginx、redis、node 这类用 systemctl start 启动的服务,完全不读 /etc/security/limits.conf —— systemd 绕过了 PAM,所以改 limits.conf 对它们无效。
实操建议:
- 全局生效(推荐):
sudo systemctl edit --full systemd-system.conf,添加DefaultLimitNOFILE=65536 - 单服务生效(更安全):
sudo systemctl edit nginx.service,在[Service]段下加LimitNOFILE=65536 - 改完必须执行
sudo systemctl daemon-reload,再sudo systemctl restart nginx - 验证是否生效:
cat /proc/$(pgrep nginx)/limits | grep "Max open files",看Soft Limit和Hard Limit是否已更新
fs.file-max 和 ip_local_port_range 怎么协同调
只调进程级文件描述符还不够。一个连接要成功建立,得同时满足:进程有空闲 fd、系统总 fd 有余量、客户端能分配到可用端口、内核连接队列不溢出。
实操建议:
-
fs.file-max是系统总 fd 上限,设太小会导致所有进程抢资源。建议设为2097152(200 万),写入/etc/sysctl.conf后执行sudo sysctl -p -
net.ipv4.ip_local_port_range决定客户端可选端口数,默认32768 60999(约 2.8 万)。高并发短连接场景建议扩到1024 65535 -
net.core.somaxconn控制 listen backlog 队列长度,至少设为65535,否则大量 SYN 请求会被丢弃 - 注意:
fs.file-max不能超过内核参数fs.nr_open(查cat /proc/sys/fs/nr_open),2.6.25+ 内核一般支持到 100 万以上
验证时容易漏掉的关键点
很多人改完配置就跑 ulimit -n 看一眼,以为万事大吉,结果服务一压就报 Too many open files —— 因为验证对象错了。
实操建议:
- 对交互式 shell,用
ulimit -n查的是当前会话限制,不是服务进程的实际值 - 对 systemd 服务,必须查其真实进程:
cat /proc/$(pgrep -f "nginx: master")/limits,而不是ulimit - 确认服务是以哪个用户运行的:
ps -o pid,uid,comm -C nginx,再对应检查该用户的limits.conf条目或 unit 文件中的LimitNOFILE - 如果用了容器(如 Docker),宿主机的配置对容器内进程无效,需在
docker run中加--ulimit nofile=65536:65536或改 containerd 的default-runtime配置










