如何获取打开文件和文件描述符数量

news/2025/1/11 17:44:08/

文件描述符

文件描述符(FD:file descriptors)即文件句柄,当某个程序打开文件时,内核返回相应的文件描述符,程序为了处理该文件必须引用此描述符。

文件描述符是一个正整数,用以标明每一个被进程所打开的文件和socket。最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应,后面打开的文件依此类推对应3、4…… 。

linux系统对每个用户、进程、或整个系统的可打开文件描述符数量都有一个限制,一般默认为1024。当我们在系统或应用的日志中碰到“too many open files”错误记录时,这个不是说打开的文件过多,而是打开的文件描述符数量已达到了限制,这时就需要增加文件描述符的数量限制了。

1 获取系统打开的文件描述符数量

[root@localhost ~]# cat /proc/sys/fs/file-nr
1952	0	13132351
  •   第一列:为已分配的FD数量
  •   第二列:为已分配但尚未使用的FD数量
  •   第三列:为系统可用的最大FD数量

已用FD数量=已分配的FD数量 - 已分配但尚未使用的FD数量。注意,这些数值是系统层面的。

1.1 更改文件描述符限制

当碰到“too many open files”错误时,就需要增加文件描述符的限制数量,系统的默认文件描述符都比较大,一般来说,只需增加用户或进程的就可以了

[root@localhost ~]# ulimit -n1024[root@localhost ~]# ulimit -n 10240[root@localhost ~]# ulimit -n10240 

注意,使用ulimit 命令更改后只是在当前会话生效,当退出当前会话重新登录后又会回到默认值1024,要永久更改可以修改文件 /etc/security/limit.conf,如

[root@localhost ~]#vi /etc/security/limits.conf 

加入 “abc hard nofile 10240”

abc:用户名,即允许test使用ulimit命令更改FD限制,最大值不超过10240,更改后abc用户的每一个进程(以abc用户运行的进程)可打开的FD数量为10240个

hard:限制类型,有soft/hard两种,达到soft限制会在系统的日志(一般为/var/log/messages)里面记录一条告警日志,但不影响使用。hard,达到这个限制,有日志且会影响使用。

nofile:限制的内容,nofile - max number of open files

1024 :值

更改后,退出终端重新登录,用ulimit看有没有生效,如果没生效,可以在abc用户的.bash_profile文件加上 ulimit -n 10240 ,以使用户abc每次登录时都会将FD最大值更改为10240,如:

[root@localhost ~]#echo "ulimit -n 10240" >> /home/abc/ .bash_profile

10240

[root@localhost ~]# su - abc

[abc@localhost ~]$ ulimit -n

10240

limit.conf文件里面本身已有很详细的使用方法,这个下次可以说说。

//系统级别

将整个操作系统可以使用的FD数量更改为51200

[root@localhost ~]# echo "51200" > /proc/sys/fs/file-max

[root@localhost ~]# cat /proc/sys/fs/file-nr

1184    0       51200

像这样更改在系统重启后会恢复到默认值,要永久更改可以在sysctl.conf文件加上fs.file-max = 51200

如:

[root@localhost ~]# echo "fs.file-max = 51200" >> /etc/sysctl.conf

2 获取打开的文件数量

linux的一切皆为文件,那么如何知道系统/应用打开了哪些或是多少个文件呢?很简单,用lsof命令就行了,lsof,list  open files的简写,可列出程序或系统正在使用的文件。

2.1 获取整个系统打开的文件数量

     [root@localhost ~]# lsof |wc -l

       1864

2.2 获取某个用户打开的文件数量 

[root@localhost ~]# lsof -u test |wc -l15

2.3 获取某个程序打开的文件数量 

[root@localhost ~]# pidof vim3253[root@localhost ~]# lsof -p 3253 |wc -l31

上面所示只是用lsof来显示已打开的文件数量,lsof的功能远不止这些,有兴趣可以man lsof看下 

进程打开的文件描述符与文件

如前面说的,为什么说“too many open files”错误不是说打开的文件过多,而是打开的文件描述符数量已达到了限制,这个简单的可以用man ulimit就可得知

[abc@localhost ~]$   man ulimit 

//找到ulimit,可以看到下列一行

n   The maximum number of open file descriptors (most systems do not allow this value to be set)

这行就说明了用ulimit -n xxx 更改的是文件描述符而不是文件的最大值。

另用lsof可知道进程都打开了哪些文件和文件描述符:

[abc@localhost ~]$ lsof -p 3330

可看到运行vim时,打开了很多个文件,但文件描述符只有后面四个。

转载于:https://www.cnblogs.com/mfryf/p/5329770.html


http://www.ppmy.cn/news/169582.html

相关文章

多层网关已成过去,网关多合一成潮流,网关改造正当时丨Higress 正式发布 1.0 版本

作者:Higress 团队 01 前言 K8s 通过 Ingress / Gateway API 将网关标准化,逐步将安全网关、流量网关、微服务网关内聚,解决从单体到微服务到云原生多层网关的复杂度,合久必分,分久必合,多层网关已成过去…

SpringBoot使用SSE进行实时通知前端

SpringBoot使用SSE进行实时通知前端 说明maven依赖SSE工具类代码 Controller测试代码测试结果如下:注意将超时时间由原来的0改为默认的30秒,会报错。将springboot降为低版本如1.4.2.RELEASE。 说明 项目有个需求是要实时通知前端,告诉前端这个任务加载好…

i5 13400 和 i5-12400 差距 i513400对比12400选哪个好

i5-13400采用10纳米工艺,拥有6个大核和4个小核,共16线程,标准运行频率为2.5 GHz,最高运行频率为 4.6 GHz,L2级缓存为9.5 MB,L3级缓存为20MB,功耗为65W 组装电脑选 i513400还是12400怎么搭配更合…

rtx4000显卡什么级别 rtx4000显卡属于哪个级别

RTX™ 4000 采用 NVIDIA Turing™ 架构 和 NVIDIA RTX 平台,可在单插槽 PCI-e 外形中提供卓越的性能和功能。rtx4000怎么样这些点很重要 http://www.adiannao.cn/dq 它是基于TU106核心的,整体规格跟RTX 2070显卡差不多,2304个CUDA核心&#…

七彩虹将星x15xs 2022款 怎么样

七彩虹新款的将星X15 XS游戏笔记本正式上市,搭载了英特尔刚刚推出的第十二代酷睿移动版处理器以及NVIDIA RTX 30系显卡,性能有了新的提升。 将星X15-XS依然采用延续了雷震子IP,机器的外观设计非常有特点,苍劲有力的书法“将”字位…

七彩虹计算机主板怎么样,七彩虹的主板怎么样?

七彩虹主板性价比的确是很高 不过 非要拿它和华硕的主板比较的话 首先要走出只要是华硕主板就都比其他品牌好的误区! 不管什么牌子的主板都有高端/中端/低端 当然他们用料是不一样的 就拿华硕来说 一般黑颜色的主板 大多是高端的主板 用料也相当讲究什么八相供电 全…

q4000相当于什么显卡

此显卡相当于GTX650 。 q4000:专业图形显卡,主要用在商业领域,用来制作复杂的3D图形、视频渲染和视频加速等专业工作。它不适合玩游戏,一块专业图像显卡,其游戏性能可能还不如一块千元左右的游戏显卡的性能来得强&…

rx6600xt显卡相当于什么显卡

rx6600xt显卡相当于什么n卡?相当于RTX 3060显卡 rx 6600xt采用Navi23核心,基础核心频率1968、游戏频率2359、加速频率2589、CUDA单元2048个,显存规格GDDR6,显存频率16000MHz,显存容量8GB,显存位宽128bit,TDP功耗160W。…