在 Linux 平台上运行的进程都会从系统资源申请一定数量的句柄,而且系统控制了进程能够申请的最大句柄数量。用户程序如果不及时释放无用的句柄,将会引起句柄泄露,从而可能造成申请资源失败,导致系统文件句柄用光连接不能建立。本文主要介绍Linux下如何查看和修改进程打开的文件句柄数,避免这类问题的发生。

句柄介绍

句柄的介绍及应用
句柄是在 Windows 中引入的一个概念,它是和对象一一对应的 32 位无符号整数值。句柄可以映射到唯一的对象,它是处理对象的一个接口,对于所涉及的对象,可以通过相应的句柄来操作它。句柄的引入主要是操作系统为了避免应用程序直接对某个对象的数据结构进行操作为目的,用操作句柄来代替操作对象。

在 Linux 环境中,任何事物都是用文件来表示,设备是文件,目录是文件,socket 也是文件。用来表示所处理对象的接口和唯一接口就是文件。应用程序在读 / 写一个文件时,首先需要打开这个文件,打开的过程其实质就是在进程与文件之间建立起连接,句柄的作用就是唯一标识此连接。此后对文件的读 / 写时,目标文件就由这个句柄作为代表。最后关闭文件其实就是释放这个句柄的过程,使得进程与文件之间的连接断开。

句柄泄露

造成句柄泄露的主要原因,是进程在调用系统文件之后,没有释放已经打开的文件句柄。在 Linux 系统中,进程与文件之间是通过“打开文件”操作建立连接,文件系统会返回文件句柄来唯一标识进程与文件的连接。每当一个进程执行完毕之后,Linux 系统会将与进程相关的文件句柄自动释放。但是,如果进程一直处于执行状态,文件的句柄只能通过“关闭文件”操作来自我释放。与 Windows 系统的设置不同,Linux 系统对进程可以调用的文件句柄数做了限制,在默认情况下,每个进程可以调用的最大句柄数为 1024 个。超过了这个数值,进程则无法获得新的句柄。因此,句柄的泄露将会对进程的功能失效造成极大的隐患。

如何修改系统最大句柄数

Linux 中,单个进程能够打开的最大文件句柄数量是可以配置的,系统默认是 1024。当单个进程打开的文件句柄数量超过了系统定义的值,就会出现“Too many files open”的错误提示。用户可以通过以下命令查看系统定义的最大值:

ulimit – n

查看当前进程打开了多少句柄数:

$ lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more131 24204 57 24244  57 24231 ......

其中第一列是打开的句柄数,第二列是进程ID。可以根据ID号来查看进程名:

# ps aef|grep 24204
nginx  24204 24162 99 16:15 ?    00:24:25 /usr/local/nginx/sbin/nginx -s

对于一般的应用程序而言 1024 已经完全够用了,但是有些进程处理大量请求,很有可能 1024 就不够用了,则需要调整系统参数,来适应应用的变化。Linux 有硬性和软性设置两种,都可以通过 ulimit 来设置。例如

ulimit – HSn 2048

以上命令就可以设置 H(硬性),S(软性)的值为 2048。n表示设定单个进程最大的打开文件句柄数量。个人觉得最好不要超过4096,毕竟打开的文件句柄数越多响应时间肯定会越慢。设定句柄数量后,系统重启后,又会恢复默认值。如果想永久保存下来,可以修改.bash_profile文件,可以修改 /etc/profile 把上面命令加到最后。

Linux 检测句柄的方法

在 Linux 平台上,lsof(list open files)是一个列出当前系统打开文件的工具。在 Linux 环境下,任何事物都以文件的形式存在,系统在后台为应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过 lsof 工具能够查看这个列表对系统监测以及排错将是很有帮助的。

在终端下输入 lsof 即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。屏幕显示如下:

COMMAND     PID    USER   FD      TYPE     DEVICE      SIZE       NODE NAME init          1    root  cwd       DIR        3,2      4096          2 / init          1    root  rtd       DIR        3,2      4096          2 / init          1    root  txt       REG        3,2     32684    1200637 /sbin/init
……

lsof 输出各列信息的意义如下:

  • COMMAND:进程的名称
  • PID:进程标识符
  • USER:进程所有者
  • FD:文件描述符,应用程序通过文件描述符识别该文件。如 cwd、txt 等
  • TYPE:文件类型,如 DIR、REG 等
  • DEVICE:指定磁盘的名称
  • SIZE:文件的大小
  • NODE:索引节点(文件在磁盘上的标识)
  • NAME:打开文件的确切名称

在 Linux 系统中可以用 man lsof 查看详细的介绍和参数使用方法,在这里不作过多介绍。在侦测程序句柄泄露的应用中,我们主要用到 lsof 的如下使用方法:

lsof – p PID

PID 是指我们要侦测程序的进程号,可以用命令 ps – ef 来得到。我们以进程号 14946 为例:

# lsof -p 14946 COMMAND     PID USER   FD   TYPE  DEVICE     SIZE   NODE NAME rpc.rquot 14946 root  cwd    DIR     3,2     4096      2 / rpc.rquot 14946 root  rtd    DIR     3,2     4096      2 / rpc.rquot 14946 root txt REG 3,2 65292 267543 /usr/sbin/rpc.rquotad rpc.rquot 14946 root mem REG 3,2 45889 535442 /lib/libnss_files-2.3.4.so rpc.rquot 14946 root mem REG 3,2 1454802 541622 /lib/tls/ libc-2.3.4.so
……

每一行就代表该进程正在使用的一个文件,即句柄。统计行数总和就是该进程打开的所有句柄数量,这为我们用统计方法侦测句柄泄露提供的依据。

Linux文件句柄泄漏相关推荐

  1. 文件句柄和文件句柄泄漏解决

    文件句柄 在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件.该函数取回一个顺序号,即文件句柄(file handle),该文件句柄对于 ...

  2. Linux内存泄漏检测方法总结

    Linux内存泄漏检测方法总结 一.mtrace分析内存泄露 mtrace原理 设置日志生成路径 测试实例 日志 泄露分析 使用addr2line工具定位源码位置 使用mtrace工具分析日志信息 二 ...

  3. linux内存泄漏通用排查方法

    一.   概述 Linux下经常遇到内存泄漏的问题,尤其对C/C++开发人员来说是一个亘古不变的话题,现在介绍解决Linux内存泄漏问题的方法层出不穷,让人眼花缭乱,但是作为开发人员应该从本质上了解为 ...

  4. Linux文件句柄限制总结

    文件句柄 tips: 网上说什么的也有,你抄我的我抄你的,也是醉了,故自己综合查阅的资料,根据自己的理解和判断以及部分的实践整理下吧,也不敢保证都是对的,如果有比较大的错误,希望看到这篇文章的你提出来 ...

  5. linux文件句柄,【LINUX】使用lsof处理文件恢复、句柄以及空间释放问题

    曾经在生产上遇到过一个df 和 du出现的结果不一致的问题,为了排查到底是哪个进程占用了文件句柄,导致空间未释放,首先在linux上面,一切皆文件,这个问题可以使用lsof这个BT的命令来处理(这个哈 ...

  6. Linux文件句柄占用数量查看与设置

    安装lsof yum install lsof 查看线程占句柄数 ulimit -a 查看系统打开句柄最大数量 more /proc/sys/fs/file-max 1 查看打开句柄总数 lsof|a ...

  7. linux 文件句柄 sock,linux socket句柄

    CPU资源监控(-u,或-P ALL) 例如,每10秒采样一次,连续采样3次,观察CPU 的使用情况,并将采样结果以二进制形式存入当前目录下的文件test中,需键入如下命令: sar -u -o te ...

  8. linux文件句柄上线的修改,修改Linux文件句柄限制

    1.  添加ulimit -HSn 655350   到/etc/profile 2. 配置生效  source /etc/profile 分类: LINUX 2010-09-08 00:06:51 ...

  9. Linux——文件句柄数设置

    在使用Linux时我们需要同时打开多个文件,来适配高并发的需求,这时就需要设置一下文件句柄数了,默认打开的是1024 文件句柄,文件描述符,会随着进程数增加而增加. Linux是有文件句柄限制的,而且 ...

最新文章

  1. maven 添加数据库驱动
  2. Java ---- java io / java nio / java net 学习资源汇总
  3. Gabor滤波器的特征提取C++实现
  4. Python:非常详细的解释如何判断某个变量的类型以及代码实现
  5. Gentoo源码安装
  6. 文件上传案例的客户端
  7. ORACLE数据库触发器
  8. scala语言示例_标有示例的Scala关键字
  9. android 关于listview scrollview 底部 控件无法显示的两个解决方案
  10. java.util.list e_E remove()
  11. 2019-2、CentOS7_直播服务搭建_nginx_nginx-http-flv-module
  12. SpringBoot连接Redis服务出现DENIED Redis is running in protected mode because protected mode is enabled
  13. 【OpenCV】绘制简单图形
  14. JavaScript——JQuery原理介绍及模拟
  15. Asp.Net 之Jquery知识点运用
  16. 长时间佩戴蓝牙耳机哪个款式好用?这几款半入耳式佩戴稳定舒适,不要错过
  17. 3dmaxobj导出选项,3DMAX将模型导出OBJ格式和贴图
  18. Vulkan 究竟是什么
  19. 关于音视频直播技术的总结
  20. 大数据开发学习资料汇总

热门文章

  1. uni-app扫码添加声音
  2. linux dstat 监控mysql_linux命令---dstat强大的性能监测工具(通用的系统资源统计工具:可以实时的监控cpu、磁盘、网络、IO、内存等使用情况。)...
  3. 人总付出一点就想得到很多!
  4. 深入理解最强桌面地图控件GMAP.NET --- 初识
  5. 交换机链路聚合详解【华为eNSP】
  6. 新手入门新电脑安装配置orb slam2 一步到位不踩坑(ubutun18.04)
  7. Revit软件:内建空心模型剪切内建模型和非内建模型
  8. 【车载以太网测试从入门到精通】——网络层测试
  9. Cocos Creator 3.2 中实现2D地图3D人物45度角RPG游戏完整效果
  10. netty自定义消息实现心跳检测与重连