美文网首页linux
【fd】Linux文件描述符

【fd】Linux文件描述符

作者: Bogon | 来源:发表于2022-05-01 00:19 被阅读0次

    在Linux下一切资源皆文件,普通文件是文件,磁盘打印机是文件,socket 当然也是文件。

    关于Linux下系统,进程能最大能打开的文件描述符数看过好多文章,但大都没有完整,详细说明每个值表示什么意思,在实践中该怎么设置?

    如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作?

    max-file 表示系统级别的能够打开的文件句柄的数量,是对整个系统的限制,并不是针对用户的。

    ulimit -n 控制进程级别能够打开的文件句柄的数量,提供对shell及其启动的进程的可用文件句柄的控制,这是进程级别的。

    对于服务器来说,file-max和ulimit都需要设置,否则会出现文件描述符耗尽的问题。

    一般如果遇到文件句柄达到上限时,会碰到"Too many open files"或者Socket/File: Can’t open so many files等错误。

    相关的3个文件:
    /proc/sys/fs/file-max
    /proc/sys/fs/file-nr
    /etc/security/limits.conf

    /proc/sys/fs/file-max
    Linux系统级别限制所有用户进程能打开的文件描述符总数。
    max-file 表示系统级别的能够打开的文件句柄的数量,是对整个系统的限制,并不是针对用户的。

    image.png

    /etc/security/limits.conf
    用户级别的限制是通过可以通过命令ulimit命令和文件/etc/security/limits.conf

    image.png image.png

    file-max, nr_open, nofile之间的关系

    1. 针对用户打开最大文件数的限制,可以通过修改文件limits.conf来实现
    2. nofile中soft的值小于hard, 最大值由nr_open来决定
    3. file-max表示内核针对整个系统,限制能所有进程能打开的文件描述符数
    4. nofile < nr_open < file-max

    文件描述符的数量:/proc/sys/fs/file-nr和/proc/$pid/fd之间有什么不同?

    $ cat /proc/sys/fs/file-nr 
    3296    0       2259544    
    

    /proc/sys/fs/file-nr 该参数是只读的,不能修改。

    file-nr的值由3部分组成:
    1,已经分配的文件描述符数;
    2,已经分配但未使用的文件描述符数;
    3,内核最大能分配的文件描述符数

    image.png

    /proc/${pid}/fd

    众所周知,在相应进程的/proc/$pid/fd 目录下存放了此进程所有打开的fd。
    当然有些可能不是本进程自己打开的,如通过fork()从父进程继承而来的。

    lrwx------ 1 root root 64 Nov 21 09:44 133 -> /dev/sda1
    lrwx------ 1 root root 64 Nov 21 09:44 134 -> /dev/sdb1
    lrwx------ 1 root root 64 Nov 21 09:44 136 -> /dev/sdb1
    lrwx------ 1 root root 64 Nov 21 09:44 137 -> socket:[22460]
    lrwx------ 1 root root 64 Nov 21 09:44 138 -> socket:[7326842]
    lrwx------ 1 root root 64 Nov 21 09:44 139 -> socket:[7341066]
    

    那么这个socket:后面的一串数字是什么呢?其实是该socket的inode号。

    那么,知道了某个进程打开的socket的inode号后,我们可以做什么呢?
    这就涉及到/proc/net/tcp(udp对应/proc/net/udp)文件了,其中也列出了相应socket的inode号通过比对此字段,我们能在/proc/net/tcp下获得此套接口的其他信息,如对应的<本地地址:端口号,远端地址:端口号>对,窗口大小,状态等信息。
    具体字段含义详见net/ipv4/tcp_ipv4.c 中的 tcp4_seq_show 函数。

    如果socket创建了,没有被使用,那么就只会在/proc/pid/fd下面有,而不会在/proc/net/下面有相关数据。

    image.png

    目录中的每一项都是一个符号链接,指向打开的文件,数字则代表文件描述符。
    其中0 = /dev/null ,1 = stdout, 2 = stderr,用cat或tail查看即可。

    image.png

    参考

    Number of file descriptors: different between /proc/sys/fs/file-nr and /proc/$pid/fd?
    https://serverfault.com/questions/485262/number-of-file-descriptors-different-between-proc-sys-fs-file-nr-and-proc-pi

    Linux中最大文件描述符数
    https://leokongwq.github.io/2016/11/09/linux-max-fd.html

    How do linux file descriptor limits work?
    https://stackoverflow.com/questions/3991223/how-do-linux-file-descriptor-limits-work

    limits.conf(5) - Linux man page
    https://linux.die.net/man/5/limits.conf

    Why can't I tail -f /proc/$pid/fd/1?
    https://unix.stackexchange.com/questions/152773/why-cant-i-tail-f-proc-pid-fd-1

    Linux查看进程运行输出(/proc/<pid>/fd)
    https://blog.csdn.net/u014756245/article/details/120023188

    相关文章

      网友评论

        本文标题:【fd】Linux文件描述符

        本文链接:https://www.haomeiwen.com/subject/tbqyyrtx.html