Linux服务器系统资源限制:告别Too

为什么你的服务老是报"Too many open files"

部署在Linux服务器上的Web服务或数据库,运行一段时间后突然挂掉,日志里出现Too many open files
这往往是由于Linux服务器系统资源限制中的文件描述符上限太低导致的。
默认情况下,普通用户的文件描述符限制只有1024,对于高并发的服务显然不够。
下面我带你一步步调高这个限制,彻底解决问题。

临时提额:先用ulimit -n应急

如果服务正在报错,可以先临时调大当前会话的限制,让服务立刻恢复工作。

  1. 登录服务器,执行命令查看当前限制:
   ulimit -n

输出一般是1024。

  1. 临时提升到65535:
   ulimit -n 65535

注意:这条命令只对当前终端会话生效,连接断开或新开终端后失效。

  1. 验证修改结果:
   ulimit -n

显示65535说明临时修改成功。

一劳永逸:修改/etc/security/limits.conf

要让修改永久生效,需要在系统级配置文件中写入限制。

  1. 用编辑器打开配置文件:
   vim /etc/security/limits.conf
  1. 在文件末尾添加以下内容(注意:不要复制注释部分):
   * soft nofile 65535
   * hard nofile 65535
   * soft nproc 65535
   * hard nproc 65535
  • * 表示对所有用户生效,如果你想只针对特定用户(比如www),把*换成用户名。
  • soft 是软限制,hard 是硬限制,应用时取软限制值。
  • nofile 代表文件描述符数量,nproc 代表最大进程数。
  1. 保存并退出(vim中按Esc后输入:wq回车)。
  2. 由于limits.conf在用户登录时生效,如果当前服务是systemd管理的,需要接着处理下一节。

针对systemd服务单独放开限制

很多现代Linux发行版使用systemd管理服务(如Nginx、MySQL),它们不受limits.conf直接限制,而是读取服务单元文件的LimitNOFILE字段。

  1. 找到服务对应的单元文件(以nginx为例):
   systemctl cat nginx

通常文件位置是/usr/lib/systemd/system/nginx.service/etc/systemd/system/nginx.service

  1. 编辑服务文件:
   systemctl edit nginx

这会创建一个override目录。
在其中写入:

   [Service]
   LimitNOFILE=65535
   LimitNPROC=65535

提示:如果直接编辑原文件,记得之后执行systemctl daemon-reload

  1. 重载配置并重启服务:
   systemctl daemon-reload
   systemctl restart nginx

验证资源限制是否生效

检查当前进程的文件描述符限制

以nginx为例,找到主进程PID:

cat /run/nginx.pid
# 或 ps aux | grep nginx | grep master

然后查看该进程的限制:

cat /proc//limits | grep "Max open files"

输出应为65535 65535

用ulimit命令验证新会话限制

重新登录服务器,或使用su -切换回普通用户,执行:

ulimit -n

显示65535则全局配置生效。

生产环境快速测试

使用stress工具或写个简短的脚本测试打开文件数,但更简单的做法是观察服务日志是否还出现Too many open files
如果没有再出现,说明调整有效。

常见踩坑与高频问题

Q:改了limits.conf重启服务器后,ulimit -n还是1024?
A:检查/etc/pam.d/common-session/etc/pam.d/sshd是否包含pam_limits.so模块。如果没有,添加一行session required pam_limits.so,然后重连SSH。

Q:服务是Docker运行的怎么办?
A:Docker容器的资源限制需要修改docker run的--ulimit参数,或者在daemon.json中配置default-ulimits。具体请搜索Docker ulimit调整。

Q:修改了limits.conf后,重启服务还是不行?
A:检查服务是否为systemd管理,如果是,必须按上述systemctl edit方法设置LimitNOFILE。另外,确认文件语法是否正确,可以使用cat /etc/security/limits.conf | grep -v "^#" | grep -v "^$"查看有效行。

Q:nproc限制(最大进程数)有什么用?
A:防止单个用户(如进程)耗尽系统进程表。如果服务需要大量线程/进程,建议同步调高nproc。注意:nproc的软限制有时受/etc/security/limits.d/20-nproc.conf影响,如果该文件存在且优先级更高,需一并修改。

总结与建议

调优Linux服务器系统资源限制是保证服务稳定运行的基础操作。
记住三条原则:临时修改用ulimit -n,永久修改改limits.conf,systemd服务补LimitNOFILE
改完后一定要重启相关服务并验证。
如果你正在遭遇类似报错,建议优先检查当前进程的文件描述符消耗,确认是否真的达到了上限,再按本文步骤操作。
遇到异常时,回看上面的高频问题和踩坑说明,大部分问题都能自己解决。

分享到:
上一篇
WP网站缓存机制详解:从插件到服务器级的完整配置指南
下一篇
Docker部署nginx:手把手教你用Docker部署
1
系统公告

泽御云五一特惠活动🔥

泽御云持证合规运营,资质齐全可查,长久稳定! 五一限时多重福利同步开启: ✅ 香港 2 核 2G 云服务器超值拼团,低价入手团长免费 ✅ 4 核 4G 多机房年付拼团,性价比拉满 ✅ 内蒙古新区限时 7 折(zeyuyunnmg)特惠,专属优惠码锁价续费 ✅ 全站通用 75 折优惠,老用户充值享专属赠金 官方站点:zeyuyun.com 合规资质齐全|售后有保障|活动限时错过不再有
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意