百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

如何解决 Linux 系统文件描述符耗尽的问题

sinye56 2025-01-24 13:52 30 浏览 0 评论

文件描述符(File Descriptor) 是 Linux 系统中用于标识打开文件或网络连接的整数句柄。当系统或应用程序打开的文件描述符数量达到上限时,会导致文件无法打开、网络连接失败等问题。以下是文件描述符耗尽的原因分析、诊断方法以及解决方案


一、文件描述符耗尽的常见原因

  1. 应用程序未正确关闭文件或连接
  2. 程序未释放打开的文件或网络连接,导致描述符泄漏。
  3. 并发连接过多
  4. 高并发的网络服务(如 Nginx、Redis、MySQL)打开大量连接,超出文件描述符限制。
  5. 系统全局限制不足
  6. 系统设置的全局文件描述符限制过低,导致资源耗尽。
  7. 单个用户或进程限制不足
  8. 某个用户或进程的文件描述符限制较低,无法满足实际需求。
  9. 恶意攻击或异常流量
  10. DDoS 攻击或异常流量导致服务打开大量网络连接,耗尽文件描述符。

二、文件描述符耗尽的诊断方法

1. 检查系统文件描述符限制

  • 查看系统允许的最大文件描述符数量:
  • bash
  • 复制
  • cat /proc/sys/fs/file-max

2. 检查当前使用的文件描述符数量

  • 查看系统当前打开的文件描述符总数:
  • bash
  • 复制
  • lsof | wc -l
  • 查看每个进程使用的文件描述符数量:
  • bash
  • 复制
  • lsof -u <用户名>

3. 检查具体进程的文件描述符使用

  • 列出某个进程打开的文件描述符:
  • bash
  • 复制
  • lsof -p
  • 检查某个进程的文件描述符限制:
  • bash
  • 复制
  • cat /proc//limits

4. 检查文件描述符泄漏

  • 使用 lsof 查找未释放的文件:
  • bash
  • 复制
  • lsof | grep deleted
    • 如果程序删除了文件但未关闭文件描述符,会占用资源。

5. 检查网络连接

  • 检查打开的网络连接数量:
  • bash
  • 复制
  • netstat -an | grep ESTABLISHED | wc -l

三、解决文件描述符耗尽的问题

1. 增加系统级别的文件描述符限制

(1) 临时增加文件描述符限制

  • 修改系统级限制(立即生效但重启失效):
  • bash
  • 复制
  • echo 1000000 > /proc/sys/fs/file-max
  • 验证更改:
  • bash
  • 复制
  • cat /proc/sys/fs/file-max

(2) 永久增加文件描述符限制

  • 编辑 /etc/sysctl.conf,添加以下配置:
  • bash
  • 复制
  • fs.file-max = 1000000
  • 使配置生效:
  • bash
  • 复制
  • sysctl -p

2. 增加用户级别的文件描述符限制

(1) 修改 ulimit 临时值

  • 查看当前用户的文件描述符限制:
  • bash
  • 复制
  • ulimit -n
  • 临时修改文件描述符限制(当前会话有效):
  • bash
  • 复制
  • ulimit -n 65535

(2) 修改用户的永久限制

  • 编辑 /etc/security/limits.conf 文件,添加以下内容:
  • bash
  • 复制
  • <用户名> soft nofile 65535 <用户名> hard nofile 65535
  • 如果使用的是 systemd 服务,还需修改 PAM 配置: 编辑 /etc/pam.d/common-session 和 /etc/pam.d/common-session-noninteractive,添加:
  • bash
  • 复制
  • session required pam_limits.so

3. 修改系统服务的文件描述符限制

(1) 配置 Systemd 服务

  • 如果应用是通过 systemd 启动的,需要修改对应服务的配置: 编辑服务文件(如 /etc/systemd/system/<服务名>.service):
  • bash
  • 复制
  • [Service] LimitNOFILE=65535
  • 重载 systemd 配置并重启服务:
  • bash
  • 复制
  • systemctl daemon-reexec systemctl restart <服务名>

(2) 配置 Shell 脚本启动的服务

  • 如果服务通过脚本启动,可以在脚本中添加:
  • bash
  • 复制
  • ulimit -n 65535

4. 优化应用程序

(1) 修复资源泄漏

  • 检查应用程序是否正确关闭文件和网络连接(例如,通过代码审查或日志分析)。

(2) 调整连接池大小

  • 如果应用程序使用连接池(如数据库连接池),限制连接池的最大大小以减少文件描述符占用。

(3) 增加多线程或异步处理

  • 优化程序的资源管理,减少文件描述符的占用时间。

5. 优化网络服务

(1) 关闭不必要的连接

  • 使用 netstat 或 ss 检查大量空闲的网络连接,并优化网络超时设置(如 keep-alive 参数)。

(2) 增加网络文件描述符

  • 对于高并发服务(如 Nginx、Redis),增加文件描述符限制: Nginx
    编辑 nginx.conf:
  • bash
  • 复制
  • worker_rlimit_nofile 65535;
  • Redis
    编辑 redis.conf:
  • bash
  • 复制
  • maxclients 10000

6. 应对恶意攻击

(1) 限制每个 IP 的连接数

  • 使用防火墙(如 iptables)限制单个 IP 的连接数:
  • bash
  • 复制
  • iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 -j DROP

(2) 启用 DDoS 防护

  • 使用工具(如 fail2ban)限制恶意 IP 的连接。

(3) 配置反向代理

  • 使用反向代理(如 Nginx)分担流量压力。

四、预防措施

  1. 定期监控文件描述符使用情况
  2. 使用 lsof 或 netstat 定期检查系统和应用的文件描述符使用状况。
  3. 优化系统和应用配置
  4. 确保系统及应用的文件描述符限制满足实际需求。
  5. 使用负载均衡或分布式架构分担流量。
  6. 设置报警机制
  7. 使用监控工具(如 Prometheus、Zabbix)监控文件描述符使用情况,设置报警阈值。
  8. 做好资源回收
  9. 定期检查并清理未关闭的文件或连接。

五、总结

文件描述符耗尽通常是由于系统资源不足或程序异常引起的,通过以下步骤可以有效解决问题:

  1. 排查问题:检查文件描述符使用情况,找到耗尽的原因(如应用程序、网络连接)。
  2. 调整限制:增加系统、用户或进程级的文件描述符限制。
  3. 优化应用:修复资源泄漏、优化连接池或网络服务配置。
  4. 防止攻击:使用防火墙、反向代理等手段应对恶意流量。

通过科学的诊断和配置调整,可以避免文件描述符耗尽对系统和应用的影响,保障服务的稳定性和高效性。

相关推荐

6个接私活的网站,你有技术就有钱

如果觉得有帮助,还请大家帮忙多多转发,点个关注作者:发哥链接:GitHubDaily本篇文章会向大家推荐国内外几个接外包比较靠谱的平台,主旨是贵精不贵多。因此,像「猪x戒」这种会让程序员自贬身价,扰乱...

Java开源可商用的CMS建站系统_java建站源码

Java研发的CMS内容管理系统具有许多优势和特点,包括以下几个方面:跨平台性:Java是一种跨平台的编程语言,可以在不同的操作系统上运行,包括Windows、Linux、Mac等。这意味着Java...

SEO新手建站必看&quot;干货&quot;优质空间和功能选择技巧!

一.空间的分类服务器:远程的高级大型计算机。vps:虚拟服务器。虚拟空间:也称虚拟主机云主机:是在一组集群主机上虚拟出多个类似独立主机的部分,集群中每个主机上都有云主机的一个镜像,从而大大提高了虚拟主...

千字长文教你使用 宝塔面板 快速搭建网站

本文将教大家使用宝塔面板快速搭建网站,云服务器购买以及域名注册部分请自行上网搜索了解,亦可留言联系小编进行咨询。如果是和下方一样本地搭建演示的话,则不需要付费购买域名和主机。宝塔面板的是...

BlueHost香港虚拟主机建站的5个优点

应该是从2006年左右开始,如果我们建站选择国内的主机需要备案手续,而且比较繁琐,且根据各地的不同政策还需要到接入点拍照登记个人信息等,一来比较繁琐,二来我们担心万一网站可能存在的信息问题导致不必要的...

10款好用的Linux服务器网站管理面板推荐

如今在建站时,很多人都会使用管理面板来辅助建站,因为相对于手动安装软件,面板更加简单而且高效,即使新手也能很快学会搭建网站,在本文中我们来推荐几款好用的网站管理面板宝塔面板宝塔面板是一款简单好用的网站...

小白拥有一台云服务器到底能干些什么?成就感爆棚的简单方案!

?云服务器是什么?云服务器(比如阿里云、腾讯云等)是提供给用户的一种虚拟服务器资源,你可以把它看作一台“rent的电脑”,只需要支付少量费用就可以拥有一个功能强大的网络设备。对于小白来说,拥有一...

苹果CMS,苹果CMS采集插件,苹果CMS快速建站(图文教程)

苹果CMS,有着强大的管理功能,管理后台界面大方、操作简单、功能齐全、模块众多、双端管理。苹果CMS加上丰富的系统标签,系统内置了丰富的cms标签并支持thinkphp框架标签完美融合,可以调取系统内...

新手搭建网站、小程序、APP等系统,如何选择服务器?

今天和小蔡和大家说说,新手搭建网站,如何选择服务器?废话不多说,直接来干货。服务器是存放网站源代码的容器,也是运行网站程序的工具,所以是不可或缺的。新手刚接触搭建网站,若不知道怎么去选择一台适合自己...

在海外VPS服务器(Hostinger)上配置宝塔面板的操作步骤

不得不说,宝塔面板是真的好用啊~用上就放不下了,一些海外的免费开源的服务器集成面板(比如CloudPanel)我也用了,不喜欢,真的不如宝塔面板方便耐用。今天聊一下在海外服务器(也包括国内服务器,没有...

干货盘点:每个wordpress站长都推荐完成的60个任务清单

构建和运营wordpress网站包含了很多重要任务,遗漏哪一方面都可能造成或大或小的不良后果,因此我们特别整理了这个任务清单,为你查漏补缺,希望能对您现在运营或者即将开始构建的wordpress网站有...

为什么站长喜欢选择BlueHost主机建站

BlueHost正式成立于2003年,从事主机(虚拟主机)业务至今已经将近十余年,无论从口碑还是用户的评价,我们基本很少看到关于Bluehost主机产品和商家负面的评论信息。从2014年开始,Blue...

自助建站时代来临 半小时成建站达人

“H5”意为第五代HTML,即第五代网页编写语言。自从1991年第一代HTML开始研发以来,网页编写、网站建设一直都属于高端技术行业,网站建设人员都是一些专业型人才,这也意味着网站的建设和维护都需要不...

现代化、开源的 Linux 服务器运维管理面板

1Panel是一个现代化、开源的Linux服务器运维管理面板。1Panel的功能和优势包括:快速建站:深度集成Wordpress和Halo,域名绑定、SSL证书配置等一键搞定;高效管理...

[1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

测评介绍本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽,后端使用GO开发,前端使用VUE的Element-Plus作为UI框架,整个面板的管理都是基于do...

取消回复欢迎 发表评论: