Назад | Перейти на главную страницу

Значение по умолчанию / proc / sys / fs / file-max

Я знаю, что / proc / sys / fs / file-max определяет максимальное количество дескрипторов открытых файлов и может быть установлено во время выполнения или во время загрузки.

Однако: каково его значение по умолчанию? Проверка 10 серверов в моей компании дает мне 7 различных значений, которые кажутся случайными.

В документации к ядру постоянно упоминается, что значение можно изменить, но не то, как рассчитывается значение по умолчанию.

Кто-нибудь из вас знает, как определяется значение по умолчанию?

В file-max предел, который вы видите под proc fs это одно значение в структуре в "./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" будет иметь функцию, которая сделает настоящую работу

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 используется при запуске ядра, и вам нужно видеть флаг SLAB_PANIC, когда kmem_cache_create вызывается для создания общего файлового блочного кеша.

Теперь тебе нужно посмотреть ./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% памяти. Если ваша система имеет другой размер памяти, я думаю, что это нормально.