Linux服务器系统资源限制:告别Too
为什么你的服务老是报"Too many open files"
部署在Linux服务器上的Web服务或数据库,运行一段时间后突然挂掉,日志里出现Too many open files。
这往往是由于Linux服务器系统资源限制中的文件描述符上限太低导致的。
默认情况下,普通用户的文件描述符限制只有1024,对于高并发的服务显然不够。
下面我带你一步步调高这个限制,彻底解决问题。
临时提额:先用ulimit -n应急
如果服务正在报错,可以先临时调大当前会话的限制,让服务立刻恢复工作。
- 登录服务器,执行命令查看当前限制:
ulimit -n
输出一般是1024。
- 临时提升到65535:
ulimit -n 65535
注意:这条命令只对当前终端会话生效,连接断开或新开终端后失效。
- 验证修改结果:
ulimit -n
显示65535说明临时修改成功。
一劳永逸:修改/etc/security/limits.conf
要让修改永久生效,需要在系统级配置文件中写入限制。
- 用编辑器打开配置文件:
vim /etc/security/limits.conf
- 在文件末尾添加以下内容(注意:不要复制注释部分):
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
*表示对所有用户生效,如果你想只针对特定用户(比如www),把*换成用户名。soft是软限制,hard是硬限制,应用时取软限制值。nofile代表文件描述符数量,nproc代表最大进程数。
- 保存并退出(vim中按Esc后输入
:wq回车)。 - 由于limits.conf在用户登录时生效,如果当前服务是systemd管理的,需要接着处理下一节。
针对systemd服务单独放开限制
很多现代Linux发行版使用systemd管理服务(如Nginx、MySQL),它们不受limits.conf直接限制,而是读取服务单元文件的LimitNOFILE字段。
- 找到服务对应的单元文件(以nginx为例):
systemctl cat nginx
通常文件位置是/usr/lib/systemd/system/nginx.service或/etc/systemd/system/nginx.service。
- 编辑服务文件:
systemctl edit nginx
这会创建一个override目录。
在其中写入:
[Service]
LimitNOFILE=65535
LimitNPROC=65535
提示:如果直接编辑原文件,记得之后执行systemctl daemon-reload。
- 重载配置并重启服务:
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。
改完后一定要重启相关服务并验证。
如果你正在遭遇类似报错,建议优先检查当前进程的文件描述符消耗,确认是否真的达到了上限,再按本文步骤操作。
遇到异常时,回看上面的高频问题和踩坑说明,大部分问题都能自己解决。