我想检查有多less文件描述符被实际使用:
cat /proc/sys/fs/file-nr 12750 0 753795
第一列(12750)指示自引导以来分配的文件描述符的数量。
我想知道为什么从以下命令的数字是不同的(假设这一class轮class正在返回正确的值:
for pid in $(lsof | awk '{ print $2 }' | uniq); do find /proc/$pid/fd/ -type l 2>&1 | grep -v "No"; done | wc -l
11069
lsof只列出进程 ID。 要获得关于线程的信息,你应该使用ps -eLf 。 根据该man proc :
/ proc / [pid] / task (自Linux 2.6.0-test6开始)
这是一个包含每个子目录的目录
线程在这个过程中。 每个子目录的名称是
数值线程ID( [tid] )的线程(见gettid(2) )。
在每个子目录中,都有一组文件
与/ proc / [pid]中的名称和内容相同
目录。 对于所有线程共享的属性,
任务下的每个文件的内容/ [tid]
子目录将与相应文件中的相同
在父/ proc / [pid]目录中(例如,在multithreading中
过程中,所有的任务/ [tid] / cwd文件将具有相同的
值作为父目录中的/ proc / [pid] / cwd文件,
因为一个进程中的所有线程共享一个工作
目录)。 对于每个线程不同的属性,
任务/ [tid]下的相应文件可能有所不同
值(例如,每个任务/ [tid] /状态中的各个字段
每个线程的文件可能不同)。
在multithreading的过程中,
/ proc / [pid] /任务目录不可用,如果主要
线程已经终止(通常是通过调用
pthread_exit(3) )。
我将通过运行来计算打开的文件描述符的数量:
ps -eL | awk 'NR > 1 { print $1, $2 }' | \ while read x; do \ find /proc/${x% *}/task/${x#* }/fd/ -type l; \ done | wc -l
结果是17270。
让我们来看看从boot开始分配了多less个文件描述符:
cat /proc/sys/fs/file-nr 11616 0 398855
为什么/proc/[pid]/task/[tid]/fd中的文件描述符数超过/proc/sys/fs/file-nr中分配文件句柄的数量? 我想他们是由forksubprocess创build的:
man fork :
孩子inheritance父母的打开的文件描述符的副本 。
man pthreads :
POSIX.1还要求线程共享一系列其他属性(即,这些属性是进程范围而不是每个线程): – 进程ID
父进程ID
进程组ID和会话ID
控制terminal
用户和组ID
打开文件描述符
http://www.netadmintools.com/part295.html一些未使用文件描述符的打开文件:库文件,程序本身(可执行文本)等等,如上所列。 这些文件在内核数据结构中的其他地方被考虑(例如cat / proc / PID / maps来查看库),但是它们没有使用文件描述符,因此不会耗尽内核文件描述符的最大值。