文件描述符(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...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。