我知道/ proc / sys / fs / file-max定义了打开文件描述符的最大数目,可以在运行时或启动时设置。
但是:它的默认值是多less? 检查我公司的10台服务器给了我7个不同的值,这些值都是随机的。
内核文档只是不断提到值可以改变 – 但不是如何计算默认值。
你们中有人知道默认值是如何确定的吗?
您在proc fs下看到的file-max限制是"./include/linux/fs.h"结构中的一个值,结构为:
/* 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 THIS IS OUR VALUE */ };
现在在./fs/file_table.c中开始使用files_stat_struct :
struct files_stat_struct files_stat = { .max_files = NR_FILE /* This constant is 8192 */ };
现在在前面的文件中, "./fs/file_table.c"将会有这个function,这个function将会是真正的工作
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可以看到并查看macrosmax_t ,如果文件的内存的10%多于8192,那么将使用该值,除非8192。
在内核开始执行时使用files_init,当调用kmem_cache_create来创build通用文件板caching时需要看到标志SLAB_PANIC。
现在你需要看看./kernel/sysctl.c
{ .procname = "file-max", .data = &files_stat.max_files, .maxlen = sizeof(files_stat.max_files), .mode = 0644, .proc_handler = proc_doulongvec_minmax, },
文件最大是内存的10%,如果你的系统有不同的内存大小,我认为这是正常的。