Nilai default dari / proc / sys / fs / file-max

9

Saya sadar bahwa / proc / sys / fs / file-max mendefinisikan jumlah maksimum deskriptor file terbuka dan dapat diatur pada saat runtime atau saat boot.

Namun: apa nilai defaultnya? Memeriksa 10 server di perusahaan saya memberi saya 7 nilai berbeda, yang semuanya tampak acak.

Dokumentasi kernel terus menyebutkan bahwa nilainya dapat diubah - tetapi tidak bagaimana nilai standar dihitung.

Apakah ada di antara Anda yang tahu bagaimana nilai default ditentukan?

taranion
sumber

Jawaban:

13

The file-maxbatas yang Anda lihat di bawah proc fsadalah salah satu nilai dalam struct di "./include/linux/fs.h"struct adalah:

/* 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 */
};

Sekarang di ./fs/file_table.cdalam files_stat_structyaitu mulai digunakan:

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

Sekarang di file sebelumnya "./fs/file_table.c"akan memiliki fungsi yang akan membuat pekerjaan nyata

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);
}

Dari Apa yang dapat saya lihat di files_initdan mencari makro max_t, Jika 10% memori untuk file lebih dari 8192, nilai-nilai itu akan digunakan, Kecuali 8192.

files_init digunakan ketika kernel mulai dijalankan dan Anda perlu melihat flag SLAB_PANIC ketika kmem_cache_createdipanggil untuk membuat cache slab file umum.

Sekarang kamu perlu melihat ./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 adalah 10% dari memori, Jika sistem Anda memiliki ukuran memori yang berbeda, saya pikir itu normal.

c4f4t0r
sumber