网易首页 > 网易号 > 正文 申请入驻

Linux 文件句柄的这些技术内幕,只有 1% 的人知道

0
分享至

王子勇
腾讯高级业务运维工程师,有10年研发与运维工作经验。崇尚开源,喜欢钻研系统技术。微信号: jacuro

1. 缘起

某个月朗风清的晚上,正在公司对面的深大操场跑步,突然接到同事发来的消息,他发现某机器上的文件句柄使用量有十一万多个(下面输出中的第一个字段)

但是通过运维常用的lsof命令算了下,相差甚远。

似乎很不科学,这里看到的数据不到1万个,剩下10多万的文件句柄哪里去了呢(系统完整性检查已排除黑客入侵可能性)

2. 文件描述符和文件句柄的故事

先看一张著名的图吧

这里我们先区分好两个概念:文件描述符和文件句柄

简单来说,每个进程都有一个打开的文件表(fdtable)。表中的每一项是struct file类型,包含了打开文件的一些属性比如偏移量,读写访问模式等,这是真正意义上的文件句柄。

文件描述符是一个整数。代表fdtable中的索引位置(下标),指向具体的struct file(文件句柄)。

3. file-nr 文件里的值是文件描述符还是文件句柄?

顺着内核代码找一下:

可以看出file-nr指标是由proc_nr_files函数处理,该函数最终其实是读取了nr_files全局变量

找下什么地方增加了这个值:

可以看到fs/file_table.c文件中第127行的get_empty_filp函数会增加这个值。那么这个函数是干什么的呢?

内核里面有注释“Find an unused file structure and return a pointer to it.”, 其实就是用来分配struct file的。

到此,相信你已经知道答案了。file-nr文件里面的第一个字段代表的是内核分配的struct file的个数,也就是文件句柄个数,而不是文件描述符。

4. 哪些地方会分配文件句柄?

知道文件句柄最终是通过get_empty_filp函数从filp cache中分配的之后,我们顺着函数调用链路简单梳理下,就能知道有哪些地方会分配文件句柄了:

  • open系统调用打开文件(path_openat内核函数)

  • 打开一个目录(dentry_open函数)

  • 共享内存attach (do_shmat函数)

  • socket套接字(sock_alloc_file函数)

  • 管道(create_pipe_files函数)

  • epoll/inotify/signalfd等功能用到的匿名inode文件系统(anon_inode_getfile函数)

实际上,lsof的手册页也有部分描述:

5. 找出元凶

有了上面的知识,我们除了看lsof的输出之外,再通过ipcs命令看一下共享内存的情况:

居然有部分共享内存段被attach了9多万次,数量级对得上,毫无疑问就是它了!

可能有些同学会有疑问,同一个进程居然可以重复attach同一段共享内存那么次?答案是可以的,内核无限制。显然,这样做逻辑上是有问题的,对共享内存的正常操作,要么是attach后一直用,要么是attach用完之后就detach。

6. 排除了共享内存等的情况,我看到的file-nr值和lsof输出还是有很大差异?

上面的案例算是比较典型,然而,即便在一个比较“正常”的系统上,我们可以看到file-nr和lsof的输出还是有不小的差距的:

这里本质上是因为文件描述符和文件句柄是两个不同的东西:lsof在用户空间,主要还是从文件描述符的角度来看文件句柄。

我们来做一个实验:只打开一次文件,然后复制1000次文件描述符。测试代码如下:

我们启动dupfd进程打开了一次/dev/zero文件,复制了1000次文件描述符。file-nr中的文件句柄数只是个位数的变化,而lsof看到的结果涨了1000多。

如果我们把前面的代码换成open 1000次, 就可以看到file-nr和lsof的输出几乎都涨了1000。

lsof看到的是文件描述符不能代表文件句柄,还有一个有趣的例子。下面的mmap程序运行后。 文件句柄增加了将近1000, 而lsof看到的文件描述符才个位数:

我们来看一下测试的mmap程序代码:

代码中,我们循环1000次打开/dev/zero文件,之后mmap映射到进程地址空间,然后把这些打开的文件描述符都关掉。很显然,打开的描述符都被close掉了,不会有什么变化。 那为什么文件句柄数还是增加了1000个左右呢?

原来,linux内核中很多对象都是有引用计数的。 虽然文件句柄是由open先打开的,但mmap之后,引用计数被加1,尽管我们接着把文件描述符close掉了,但是底层指向的struct file由于引用数大于0,不会被回收。

通过上面两个例子,你应该知道lsof的输出和实际的文件句柄数有差距的原因了。

7. 如何找出内存映射间接占用的文件句柄?

实际上,不管是mmap映射文件,还是通过shmat连共享内存,最终都会在进程地址空间中分配一片内存区。 通过pmap命令可以看出一些端倪:

回到故事的开头。那个使用了11万文件句柄的机器,在内核slab cache中,除了文件句柄(struct file对象)对应的filp cache对象多之外,对应的内存区对象vm_area_struct占用也是超多的.
下面是slabtop的部分输出:

8. 还有其他lsof漏掉的情况吗?

当然有了,lsof是通过查看进程的内存映射和文件描述符表来枚举打开文件的, 如果是一个多线程的服务。主线程先退出了,子线程还活着, 那么进程的fd表看起来就是空的。

9. 总结

Linux内核暴露出来的指标对系统监控很有意义,认识这些指标背后隐含的对象以及增长原因,能够帮助我们在异常时找出问题所在。

9 月的上海,运维人有个必去的地方,第10 届 GOPS ,回到起点,回到初心!

AIOps 风向标! GOPS 全球运维大会 2018 · 上海站震撼来袭!

GOPS 2018 上海站 亮点之一:腾讯运维双雄:聂鑫、大梁带现身 GOPS 上海站 带您嗨聊一整天!

点击阅读原文,了解更多精彩

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
国家一级女演员陈丽云被逮捕!

国家一级女演员陈丽云被逮捕!

许三岁
2026-03-28 09:24:30
太残暴8连鞭!斯诺克巡回锦标赛:赵心童8-0希金斯,小特瑟瑟发抖

太残暴8连鞭!斯诺克巡回锦标赛:赵心童8-0希金斯,小特瑟瑟发抖

杨仔述
2026-04-04 23:03:21
美军直升机超低空飞行搜救,地上伊朗士兵用机枪追着打!伊朗称用了新武器;美军飞行员被俘怎么办?特朗普:希望“那种情况”不会发生

美军直升机超低空飞行搜救,地上伊朗士兵用机枪追着打!伊朗称用了新武器;美军飞行员被俘怎么办?特朗普:希望“那种情况”不会发生

每日经济新闻
2026-04-04 13:47:27
安徽失联女童最新线索!手机被扔在地沟,家属的疑虑,恐怕要成真

安徽失联女童最新线索!手机被扔在地沟,家属的疑虑,恐怕要成真

奇思妙想草叶君
2026-04-04 23:39:57
马兴瑞、夏智伦、苏海明、周鹏程、张斌、石永忠、王文权、王辉、孙大志、黄昌鼎接受纪律审查和监察调查

马兴瑞、夏智伦、苏海明、周鹏程、张斌、石永忠、王文权、王辉、孙大志、黄昌鼎接受纪律审查和监察调查

豫府号
2026-04-03 23:33:48
出访大陆前,郑丽文拜访吴伯雄,吴伯雄一句话,让蒋万安无话可说

出访大陆前,郑丽文拜访吴伯雄,吴伯雄一句话,让蒋万安无话可说

DS北风
2026-04-04 13:30:07
当“李赔光” 遇上 “董圣人”:一场担当的照妖镜,照出了虚伪

当“李赔光” 遇上 “董圣人”:一场担当的照妖镜,照出了虚伪

橙星文娱
2026-04-04 12:40:45
国家一级演员陈丽云被捕

国家一级演员陈丽云被捕

桑未落
2026-03-28 22:50:25
家暴打死老婆,他在行刑前尿了裤子:终于怕了

家暴打死老婆,他在行刑前尿了裤子:终于怕了

大道微言
2026-04-04 14:49:29
“我准备倒闭了!” 广东爆火鸡煲店老板再发声:我用的是冰冻鸡,别来了

“我准备倒闭了!” 广东爆火鸡煲店老板再发声:我用的是冰冻鸡,别来了

21世纪经济报道
2026-04-04 14:07:57
一天两架美军战机被击落,特朗普“赢” 不下去了 | 京酿馆

一天两架美军战机被击落,特朗普“赢” 不下去了 | 京酿馆

新京报评论
2026-04-04 15:40:55
绝无仅有,美军单日毁伤6架飞机,飞行员争夺战惊心动魄

绝无仅有,美军单日毁伤6架飞机,飞行员争夺战惊心动魄

史政先锋
2026-04-04 16:28:38
中国武术协会:已向公安机关报案

中国武术协会:已向公安机关报案

第一财经资讯
2026-04-04 19:16:21
随着上海海港2-1,山东泰山1-2,中超最新积分榜出炉

随着上海海港2-1,山东泰山1-2,中超最新积分榜出炉

侧身凌空斩
2026-04-04 21:58:52
这是迄今为止,我见过最美的女人,不接受反驳

这是迄今为止,我见过最美的女人,不接受反驳

草莓解说体育
2026-04-03 15:08:02
斯诺克最新战报!希金斯哑火仅8分,赵心童大逆转,半决赛连赢3局

斯诺克最新战报!希金斯哑火仅8分,赵心童大逆转,半决赛连赢3局

刘姚尧的文字城堡
2026-04-04 21:02:56
从1-3到4-3!王楚钦重压下完成大逆转,艰难晋级世界杯四强

从1-3到4-3!王楚钦重压下完成大逆转,艰难晋级世界杯四强

全景体育V
2026-04-04 20:09:01
2-1神剧情!13.4亿豪门88分钟扳平 补时惨遭倒第三绝杀 止步5连胜

2-1神剧情!13.4亿豪门88分钟扳平 补时惨遭倒第三绝杀 止步5连胜

狍子歪解体坛
2026-04-05 00:13:42
35岁数学家王虹再传喜讯:获纽约大学最高荣誉,成为该校“银教授”

35岁数学家王虹再传喜讯:获纽约大学最高荣誉,成为该校“银教授”

极目新闻
2026-04-04 16:28:10
曝台湾省歌手费玉清现状曝光!无儿无女,和女闺蜜互相解决需求

曝台湾省歌手费玉清现状曝光!无儿无女,和女闺蜜互相解决需求

小徐讲八卦
2026-04-02 07:51:08
2026-04-05 02:23:00
高效运维
高效运维
国内第一个运维垂直技术社区
1609文章数 516关注度
往期回顾 全部

数码要闻

好用的剃须刀哪款好?品牌十大排名不同需求精准适配,剃须更舒适

头条要闻

伊朗发动第七轮导弹袭击 耶路撒冷拦截导弹升空

头条要闻

伊朗发动第七轮导弹袭击 耶路撒冷拦截导弹升空

体育要闻

刹不住的泰格·伍兹,口袋里的两粒药丸

娱乐要闻

Q女士反击,否认逼宋宁峰张婉婷离婚

财经要闻

中微董事长,给半导体泼点冷水

科技要闻

内存一年涨四倍!国产手机厂商集体涨价

汽车要闻

17万级海豹07EV 不仅续航长还有9分钟满电的快乐

态度原创

教育
亲子
本地
数码
公开课

教育要闻

市教委最新数据出炉!小升初、初升高人数增幅过万!三大动向独家解读

亲子要闻

孕妇买200元水果被丈夫骂后续:双标到极致,家境曝光,网友劝离

本地新闻

跟着歌声游安徽,听古村回响

数码要闻

今年新款AirPods Pro、Apple TV值得等吗?升级方向曝光

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版