Linux FS

文件描述符(file descrition)
文件句柄数(file handle)

每个进程都有一个打开的文件表(fdtable)。表中的每一项是struct file类型,包含了打开文件的一些属性比如偏移量,读写访问模式等,这是真正意义上的文件句柄。

文件描述符是一个整数。代表fdtable中的索引位置(下标),指向具体的struct file(文件句柄)。

文件描述符(fd)

在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。

最大文件描述符限额 cat /proc/sys/fs/nr_open

设置最大文件描述符
vi /etc/security/limits.conf

  • soft nofile 999999
  • hard nofile 999999

ulimit -a 查看文件描述符

查看某个进程的文件描述符

终端进程1800640,打开了15个文件,占用了5个文件描述符
一个文件即使被打开,也可能没有文件描述符,比如当前工作目录,内存映射文件和可执行文本文件

查看当前文件打开数
lsof -P -n |wc -l

统计排序
lsof -P -n |awk '{print $2}'| sort -n | uniq -c | sort -nr |head -10

统计某个进程打开的文件数
lsof -p pid |wc -l

文件句柄数

设置最大句柄数
vi /etc/sysctl.conf

fs.file-max = 10240

这个参数的默认值和内存大小有关系,可以使用公式:file-max ≈ 内存大小(KB)/ 10

cat /proc/sys/fs/file-max 查看最大打开文件句柄数

cat /proc/sys/fs/file-nr 查看 当前已使用句柄 已分配未使用句柄 最大句柄数

哪些地方会分配文件句柄

open系统调用打开文件(path_openat内核函数)

打开一个目录(dentry_open函数)

共享内存attach (do_shmat函数)

socket套接字(sock_alloc_file函数)

管道(create_pipe_files函数)

epoll/inotify/signalfd等功能用到的匿名inode文件系统(anon_inode_getfile函数)

参考来源:
https://juejin.im/entry/5b56f...
https://blog.csdn.net/u013256...
https://blog.csdn.net/qq_2935...

你可能感兴趣的