一、linux的文件描述符

文件描述符(FD:file descriptors),也可以说是文件句柄,当某个程序打开文件时,内核返回相应的文件描述符,程序为了处理该文件必须引用此描述符。文件描述符是一个正整数,用以标明每一个被进程所打开的文件和socket。最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应,后面打开的文件依此类推对应3、4…… 。

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

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

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

1216    0       197787

//第一列 1216   :为已分配的FD数量

//第二列 0          :为已分配但尚未使用的FD数量

     //第三列197787:为系统可用的最大FD数量

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

1.2 获取进程打开的文件描述符数量

[root@localhost ~]# pidof vim

3253

[root@localhost ~]# ll /proc/3253/fd

总用量 0

lrwx------. 1 test test 64  6月  8 18:11 0 -> /dev/pts/0

lrwx------. 1 test test 64  6月  8 18:11 1 -> /dev/pts/0

lrwx------. 1 test test 64  6月  8 18:11 2 -> /dev/pts/0

lrwx------. 1 test test 64  6月  8 18:11 4 -> /home/test/.bash_history.swp

//可以看到vim进程用了4个FD

1.3 更改文件描述符限制

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

//用户或进程

[root@localhost ~]# ulimit -n

1024

[root@localhost ~]# ulimit -n 10240

[root@localhost ~]# ulimit -n

10240

注意,使用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

二、获取打开的文件数量

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

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

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

1864

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

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

15

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

[root@localhost ~]# pidof vim

3253

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

31

上面所示只是用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 更改的是文件描述符而不是文件的最大值。

我们可以来测试一下:

  • 打开一个进程vim,获取vim打开的文件及文件描述符数量

[abc@localhost ~]$ lsof -p 3330 |wc -l //文件数量

31

[abc@localhost ~]$ ls /proc/3330/fd |wc -l  //文件描述符数量

4

[abc@localhost ~]$ killall -9 vim

[1]+  已杀死               vim .bash_profile

[abc@localhost ~]$ ulimit -n 20

  • 更改限制,并测试vim的运行情况

[abc@localhost ~]$ ulimit -n 20 //更改为20,即小于文件数量31

[abc@localhost ~]$ ulimit -n

20

[abc@localhost ~]$ vim .bash_profile //可看到vim可以正常打开文件

# .bash_profile

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

. ~/.bashrc

fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

ulimit -n 10240

----------------------------------

[abc@localhost ~]$ ulimit -n 3    //更改为3,即小于FD数量4

[abc@localhost ~]$ ulimit -n

3

[abc@localhost ~]$ vim .bash_profile

-bash: start_pipeline: pgrp pipe: Too many open files

vim: error while loading shared libraries: libselinux.so.1: cannot open shared object file: Error 24

从上面可看到小于文件描述符的数值时即报“Too many open files”错误,那么这个应该可以说明这个“Too many open files”错误是是打开的文件描述符数量已达到了限制所引起的,跟打开的文件数量没有关系。

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

[abc@localhost ~]$ lsof -p 3330

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME

vim     3555  abc  cwd    DIR  253,0     4096 923587 /home/abc

vim     3555  abc  rtd    DIR  253,0     4096      2 /

vim     3555  abc  txt    REG  253,0  1971360 287900 /usr/bin/vim

vim     3555  abc  mem    REG  253,0   155696    846 /lib64/ld-2.12.so

vim     3555  abc  mem    REG  253,0    26104 281208 /usr/lib64/libgpm.so.2.1.0

vim     3555  abc  mem    REG  253,0  1912928    847 /lib64/libc-2.12.so

vim     3555  abc  mem    REG  253,0    22536    852 /lib64/libdl-2.12.so

vim     3555  abc  mem    REG  253,0   145672    859 /lib64/libpthread-2.12.so

vim     3555  abc  mem    REG  253,0   598816    848 /lib64/libm-2.12.so

vim     3555  abc  mem    REG  253,0   124624    857 /lib64/libselinux.so.1

vim     3555  abc  mem    REG  253,0   113904    856 /lib64/libresolv-2.12.so

vim     3555  abc  mem    REG  253,0  1489600 406575 /usr/lib64/perl5/CORE/libperl.so

vim     3555  abc  mem    REG  253,0   142504     96 /lib64/libncurses.so.5.7

vim     3555  abc  mem    REG  253,0    34336    890 /lib64/libacl.so.1.1.0

vim     3555  abc  mem    REG  253,0    43392    869 /lib64/libcrypt-2.12.so

vim     3555  abc  mem    REG  253,0   387880    868 /lib64/libfreebl3.so

vim     3555  abc  mem    REG  253,0  1753952 271694 /usr/lib64/libpython2.6.so.1.0

vim     3555  abc  mem    REG  253,0    17520    886 /lib64/libutil-2.12.so

vim     3555  abc  mem    REG  253,0   138280    826 /lib64/libtinfo.so.5.7

vim     3555  abc  mem    REG  253,0    20280    887 /lib64/libattr.so.1.1.0

vim     3555  abc  mem    REG  253,0   116136    889 /lib64/libnsl-2.12.so

vim     3555  abc  mem    REG  253,0    61624     42 /lib64/libnss_files-2.12.so

vim     3555  abc  mem    REG  253,0    26050 265158 /usr/lib64/gconv/gconv-modules.cache

vim     3555  abc  mem    REG  253,0   124855 528606 /usr/share/vim/vim72/lang/zh_CN/LC_MESSAGES/vim.mo

vim     3555  abc  mem    REG  253,0   135533 528604 /usr/share/vim/vim72/lang/zh_CN.UTF-8/LC_MESSAGES/vim.mo

vim     3555  abc  mem    REG  253,0 99158752 264902 /usr/lib/locale/locale-archive

vim     3555  abc    0u   CHR  136,0      0t0      3 /dev/pts/0

vim     3555  abc    1u   CHR  136,0      0t0      3 /dev/pts/0

vim     3555  abc    2u   CHR  136,0      0t0      3 /dev/pts/0

vim     3555  abc    4u   REG  253,0     4096 923589 /home/abc/.bash_profile.swp

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

Linux:如何获取打开文件和文件描述符数量的更多相关文章

  1. linux 下如何打开core dump文件开关

    dump文件可以在程序crash时,方便我们查看程序crash的地方和上下文信息.在window下,要能生成dump文件,需要自己编写相应的代码.不过现在网上可以找到相应的代码,只要把它下载后然后加到 ...

  2. linux文件描述符数量的坑

    ulimit -n  查看 单进程或线程,可打开的最大文件描述符数 通过ulimit -n 10240 设置文件描述符数: (当前shell生效,这真是个坑啊) 永久生效:(需要重启系统,也是个坑,好 ...

  3. Linux下如何打开img镜像文件

    有些镜像文件为IMG格式,在Linux如何打开呢?例如从微软dreampark下载的Windows Server 2008 R2镜像文件,使用file命令查看: $ file chs_windows_ ...

  4. [转] linux系统文件流、文件描述符与进程间关系详解

    http://blog.sina.com.cn/s/blog_67b74aea01018ycx.html linux(unix)进程与文件的关系错综复杂,本教程试图详细的阐述这个问题. 包括:     ...

  5. linux一切皆文件之tcp socket描述符(三)

    一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 二.环境准备 ...

  6. linux一切皆文件之Unix domain socket描述符(二)

    一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 3.主要用于 ...

  7. Linux下文件描述符

    http://blog.csdn.net/kumu_linux/article/details/7877770 文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket.第一个打开的 ...

  8. linux 最大文件描述符

    Linux对应用程序能打开的的最大文件描述符数量有两个层次的限制:用户级限制和系统级限制. 用户级限制是指目标用户运行的所有进程总共能打开的文件描述符数. 系统级的限制是指所有用户总共能打开的文件描述 ...

  9. linux 文件描述符

    文件描述符是什么?和文件句柄有啥区别?文件描述符是linux/unix操作系统中特有的概念.相当于windows系统中的文件句柄.一个意思不同叫法.Linux系统中, 每当进程打开一个文件时,系统就为 ...

随机推荐

  1. HDU 6214 最小割边

    双倍经验题:HDU 6214,3987 求最小割的最小边. 方案一: 首先跑最大流,这个时候割上都满载了,于是将满载的边 cap = 1,其他 inf ,再跑最大流,这个时候限定这个网络的关键边就是那 ...

  2. POJ 2182 Lost Cows 【树状数组+二分】

    题目链接:http://poj.org/problem?id=2182 Lost Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  3. require,import区别?

    遵循的模块化规范不一样 模块化规范:即为 JavaScript 提供一种模块编写.模块依赖和模块运行的方案.谁让最初的 JavaScript 是那么的裸奔呢——全局变量就是它的模块化规范. requi ...

  4. 【洛谷P1850】换教室[2016NOIP提高组]

    换教室 期望DP 状态: f[i][j][0/1]表示前i节课 提交j个申请 第i个教室不申请/申请(为了确定当前教室,方便转移) 的最小期望 方程: f[i][j][0]=min(f[i-1][j] ...

  5. Spring MVC之@RequestBody, @ResponseBody 详解(转)

    简介: @RequestBody 作用: i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对 ...

  6. checkbox 全选

    <template> <div class="hello"> <table> <tr> <th><input ty ...

  7. Linux CentOS7下安装Zookeeper-3.4.10服务(最新)

    Linux CentOS7下安装Zookeeper-3.4.10服务(最新) 2017年10月27日 01:25:26 极速-蜗牛 阅读数:1933   版权声明:本文为博主原创文章,未经博主允许不得 ...

  8. 魔板 Magic Squares(广搜,状态转化)

    题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜 ...

  9. C++最接近整数的浮点运算

    Function return ceil 不小于给定值的最接近整数值 floor 不大于给定值的最接近整数 trunc (C++11) 绝对值不大于给定值的最接近整数 round(C++11) 最接近 ...

  10. C.Sum 2017 ACM-ICPC 亚洲区(西安赛区)网络赛

    题目来源:Sum 限制:1000ms 32768K Define the function S(x) for xx is a positive integer. S(x) equals to the ...