Linux怎么查看系统句柄数占用情况 Linux文件描述符限制优化详解

轻晨同学_2048

轻晨同学_2048

2026-05-22

836人浏览

原创

最可靠的方法是读取 /proc/sys/fs/file-nr 的第二列,它表示当前系统活跃占用的文件句柄数;需结合 fs.file-max 和各进程 LimitNOFILE 统一调优,否则参数再大也仅延缓崩溃。

linux怎么查看系统句柄数占用情况 linux文件描述符限制优化详解

Linux 文件句柄(file descriptor)耗尽不是“会不会发生”的问题,而是“什么时候发生”的问题——尤其在短连接 HTTP 服务、日志密集型应用或 UDP 高频收发场景下,Too many open files 报错往往来得突然,但根源早已埋在 /proc/sys/fs/file-nr 的第二列里。

怎么准确查当前系统已用句柄总数

别信 lsof | wc -l:它会因权限失败中断、含表头和空行,计数漂移大;也别只看某个进程的 /proc/[pid]/fd/,局部高不代表全局瓶颈。

最可靠的是直接读内核统计:

  • cat /proc/sys/fs/file-nr 输出三列,顺序是:已分配句柄数、已分配但未使用数、系统上限(fs.file-max)。真正该盯的是第二列 —— 它才是当前「活跃占用」的真实值
  • 例如输出 12480 3210 2097152,说明已有 3210 个句柄正在被使用(第一列减第二列 = 已分配未用),离上限还很远;但如果第二列接近第三列的 80% 以上,就得预警
  • 这个值是全系统聚合统计,不依赖用户权限,也不受 lsof 进程自身开销干扰

为什么 ulimit -n 改了,程序还是报 Too many open files

因为 ulimit 只管「单进程软硬限制」,而 systemd 服务默认绕过 /etc/security/limits.conf —— 即便你配了 * soft nofile 65535,对 nginx、redis、java 应用等通过 systemd 启动的服务完全无效。

必须在 service 文件里显式声明:

  • 编辑对应 unit 文件,比如 /etc/systemd/system/nginx.service
  • 在 [Service] 段下添加:LimitNOFILE=65535(注意不是 nofile,是 LimitNOFILE)
  • 执行 sudo systemctl daemon-reload && sudo systemctl restart nginx 生效
  • 验证方式:cat /proc/$(pgrep nginx | head -n1)/limits | grep "Max open files",确认 Soft Limit 和 Hard Limit 已更新

系统级 file-max 调多少才够用

别按“经验值”硬设 65536 或 1048576。真实需求取决于并发连接数 ×(每个连接平均打开的文件数 + 日志/配置/临时文件等额外开销)。

Obsidian (Linux)
Obsidian (Linux)

操作 Obsidian 库(纯 Markdown 笔记),并通过 notesmd-cli 实现自动化。

下载

粗略估算公式:file-max ≥ 并发连接峰值 × 3 ~ 5。例如某 API 服务峰值 2 万 TCP 连接,建议 fs.file-max ≥ 100000。

调整时注意两点:

  • 临时改用:sudo sysctl -w fs.file-max=100000,立即生效但重启丢失
  • 永久生效必须写入 /etc/sysctl.conf,且要确保 sysctl -p 执行成功(检查有无报错,部分发行版需加 -f 强制)
  • 改完别忘了同步调高各关键服务的 LimitNOFILE,否则系统有容量,进程却卡在自己的限制里

哪些地方容易漏掉句柄泄漏线索

句柄泄漏不总表现为持续增长,也可能在流量高峰后残留不释放 —— 此时 file-nr 第二列缓慢爬升,但 lsof -p [pid] | wc -l 看不出明显异常。

更有效的排查路径:

  • 用 lsof -n -p [pid] | awk '$5 ~ /^[0-9]+[uw]/ {print $5}' | sort | uniq -c | sort -nr 查看该进程 FD 类型分布,如果大量 0u(stdin)、1u(stdout)或重复的 socket 地址,大概率是子进程继承了父进程句柄但没 close
  • 检查是否用了 fork() 后未 close() 父进程打开的 socket 或日志文件描述符
  • Java 应用注意 FileInputStream 是否都套了 try-with-resources;Go 注意 os.Open 后是否 defer Close();Node.js 留意 fs.createReadStream 是否监听了 close 事件

真正棘手的从来不是调参,而是发现某个进程明明只开了几百个连接,/proc/[pid]/fd/ 下却躺着上万个符号链接 —— 那说明代码里早有句柄没关,参数再大也只是延缓崩溃时间。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

4210

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3573

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2793

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

6870

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

6502

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

3753

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

3245

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

3479

6

linux查找文件命令
linux查找文件命令

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.31

297

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习