文件描述符的数量:在/ proc / sys / fs / file-nr和/ proc / $ pid / fd之间是不同的。

我想检查有多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来查看库),但是它们没有使用文件描述符,因此不会耗尽内核文件描述符的最大值。