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?

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.