/ proc/sys/fs/file-maxはオープンファイル記述子の最大数を定義し、実行時または起動中に設定できることを知っています。
ただし、そのデフォルト値は何ですか?私の会社の10台のサーバーをチェックすると、7つの異なる値が得られます。
カーネルのドキュメントでは、値を変更できることについて言及し続けていますが、デフォルト値の計算方法については触れていません。
デフォルト値の決定方法を知っている人はいますか?
file-max
の下に表示されるproc fs
の制限は、"./include/linux/fs.h"
の構造体の1つの値です。構造体は次のとおりです。
/* 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"
には、実際の仕事をする関数が含まれています
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
で確認でき、マクロmax_t
を確認すると、ファイルのメモリの10%が8192を超える場合、8192でない限り、その値が使用されます。
files_initはカーネルの実行が開始されたときに使用され、kmem_cache_create
が呼び出されて一般的なファイルスラブキャッシュを作成するときにフラグ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,
},
File-maxはメモリの10%です。システムのメモリサイズが異なる場合、それは正常だと思います。