• [性能分析]linux文件描述符


    1、什么是文件和文件描述符

    Linux中文件可以分为4种:普通文件、目录文件、链接文件和设备文件。
    1、普通文件
    是用户日常使用最多的文件,包括文本文件、shell脚本、二进制的可执行和各种类型的数据。
    ls -lh 来查看某个文件的属性,可以看到有类似 -rw-r--r-- ,值得注意的是第一个符号是 - ,这样的文件在Linux中就是普通文件。这些文件一般是用一些相关的应用程序创建,比如图像工具、文档工具、归档工具... .... 或 cp工具等。这类文件的删除方式是用rm 命令;
    2、目录文件
    在linux中,目录也是文件,它们是包含文件名和子目录名以及指向那些文件和子目录的指针
    当我们在某个目录下执行,看到有类似 drwxr-xr-x ,这样的文件就是目录,目录在Linux是一个比较特殊的文件。注意它的第一个字符是d。创建目录的命令可以用 mkdir 命令,或cp命令,cp可以把一个目录复制为另一个目录。删除用rm 或rmdir命令。
    3、链接文件
    链接文件类似于Windows中的“快捷方式”。
    是通过ln -s 源文件名 新文件名 来创建的。
    4、设备文件
    包括两种,块设备文件,另一种是字符设备文件。字符设备(无缓冲且只能顺序存取)、块设备(有缓冲且可以随机存取)。
    块设备文件是指数据的读写,它们是以块为单位的设备,如硬盘光驱。
    字符设备主要是指串行端口的接口设备,如网卡等。

    内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。 

          习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2。尽管这种习惯并非 Unix 内核的特性,但是因为一些 shell 和很多应用程序都使用这种习惯,因此,如果内核不遵循这种习惯的话,很多应用程序将不能使用。 文件描述符的有效范围是 0 到 OPEN_MAX。

          在Windows操作系统上,文件描述符被称作文件句柄。

    2、文件描述符对性能的影响

             linux服务器内核对文件描述符的个数存在限制,默认在1024左右(视不同的服务器类型,默认设置的值不太一样),这对于不太繁忙的程序,一般是够用的,但是如果是web服务器或者性能测试用的加压服务器,这个限制是不够用的,程序会打开大量的文件,导致文件描述符不够用,进而导致无法访问新的文件。

    3、如何判断文件描述符设置存在问题

     

    通过查看当先系统使用的文件描述符,可以判断文件描述符个数是否受限

    使用cat /proc/sys/fs/file-nr

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

    5664        0        186405

    其中第一个数表示当前系统已分配使用的打开文件描述符数,第二个数为分配后已释放的(目前已不再使用),第三个数等于file-max。

    如图,大量并发请求时,当前系统已分配使用的打开文件描述符数会发生比较大的变化,默认的1024是不够的。

                           

    4、如何修改linux服务器内核的文件描述符

    (1)临时修改,可以通过ulimit命令修改

      //显示当前文件描述符

      ulimit -n

      //修改当前用户环境下的文件描述符为65536

      ulimit -HSn 65536

      使用ulimit命令的缺点:

      1,只能修改当前登录用户环境下的文件描述符,如果此用户来另外打开一个连接,此链接环境的文件描述符依然是没改前的

      2,如果系统重启,以前修改都不再生效

    (2)永久修改,通过修改nf文件

      编辑/etc/security/nf 文件,在最后加入如下两行

      *  soft    nofile  65536

      *  hard    nofile  65536

      保存退出,都不需要重启服务器,直接重新登陆用ulimit -n就能看到效果

      这样无论使用哪个用户,无论是否重启都不会失效了。

  • 相关阅读:
    JS判断输入是否为整数和数字的正则表达式
    c#字符串转换为日期,支持任意字符串
    清除sql server 登录的时候记住的账户
    关于sql 的convert 格式设置
    ArcObjects SDK(AE)10.1在vs2012安装的方法
    解决ArcGIS Engine AE 读取shapefile中文属性乱码的一条偏方
    skyline TerraBuilder 制作MPT方法与技巧(2)
    skyline TerraBuilder 制作MPT方法与技巧(1)
    Makefile之文件搜索
    Makefile学习之通配符和自动变量($@、$<、$^)
  • 原文地址:https://www.cnblogs.com/reach296/p/3915512.html
Copyright © 2020-2023  润新知