0%

Linux打开文件的上限分析


作者: 耗子007


Linux打开文件的上限,主要受文件句柄上限和文件描述符上限的限制。

  • 文件句柄: A file handle is a pointer to an actual data structure
  • 文件描述符: A file descriptor is a just an abstract key for accessing the file

因此,文件句柄和文件描述符是不一样的。

相关函数简介

函数getdtablesize,获取文件描述符表格的大小。

1
2
3
4
5
6
7
8
getdtablesize() returns the maximum number of files a process can
have open, one more than the largest possible value for a file
descriptor.
系统调用如下:
SYSCALL_DEFINE0(getdtablesize)
{
return sysctl_nr_open;
}

文件描述符上限相关

文件描述符上限可以同ulimit进行设置,如下:

1
ulimit -n 64000

获取当前文件描述符的上限,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# cat /proc/self/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size unlimited unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 1048576 1048576 processes

Max open files 64000 64000 files

Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 10546 10546 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us

如上所示,Max open files为我们设置的64000。

文件句柄相关

系统使用的文件句柄的统计数据放在/proc/sys/fs/file-nr文件中,该文件包含三部分:

  • 已分配的文件句柄数
  • 分配但未使用的文件句柄数
  • 最大的文件句柄数

例如:

1
2
# cat /proc/sys/fs/file-nr
896 0 267456

上述的数据,在内核中是保存在结构体files_stat_struct的变量files_stat中,该值在files_init函数中初始化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/* And dynamically-tunable limits and defaults: */
struct files_stat_struct {
unsigned long nr_files; /* read only */
unsigned long nr_free_files; /* read only */
unsigned long max_files; /* tunable */
};

/* sysctl tunables... */
struct files_stat_struct files_stat = {
.max_files = NR_FILE /* This constant is 8192 */
};

void __init files_init(unsigned long mempages)
{
unsigned long n;

filp_cachep = kmem_cache_create("filp", sizeof(struct file), 0,
SLAB_HWCACHE_ALIGN | SLAB_PANIC, NULL);

/*
* One file with associated inode and dcache is very roughly 1K.
* Per default don't use more than 10% of our memory for files.
*/

n = (mempages * (PAGE_SIZE / 1024)) / 10;
files_stat.max_files = max_t(unsigned long, n, NR_FILE);
files_defer_init();
lg_lock_init(files_lglock);
percpu_counter_init(&nr_files, 0);
}

从函数files_init中可以知道,文件句柄的最大值等于NR_FILE或者10%的内存。因此,文件句柄的上限取决于系统的内存大小。

参考文章:

[1] http://serverfault.com/questions/716578/default-value-of-proc-sys-fs-file-max
[2] http://www.linuxvox.com/2015/12/what-are-file-max-and-file-nr-linux-kernel-parameters/