Valeur par défaut de / proc / sys / fs / file-max

9

Je suis conscient que / proc / sys / fs / file-max définit le nombre maximum de descripteurs de fichiers ouverts et peut être défini lors de l'exécution ou lors du démarrage.

Cependant: quelle est sa valeur par défaut? Vérifier 10 serveurs dans mon entreprise me donne 7 valeurs différentes, qui semblent toutes assez aléatoires.

La documentation du noyau ne cesse de mentionner que la valeur peut être modifiée - mais pas comment la valeur par défaut est calculée.

L'un de vous sait-il comment la valeur par défaut est déterminée?

taranion
la source

Réponses:

13

La file-maxlimite que vous voyez sous proc fsest une valeur dans struct dans "./include/linux/fs.h"la structure est:

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

Maintenant, dans ./fs/file_table.cle files_stat_structest utilisé:

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

Maintenant, dans le fichier précédent "./fs/file_table.c"aura la fonction qui fera le vrai travail

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

D'après ce que je peux voir dans le files_initet en regardant la macro max_t, si 10% de la mémoire pour les fichiers est supérieure à 8192, ces valeurs seront utilisées, à moins que 8192.

files_init est utilisé lorsque le noyau est exécuté et vous devez voir l'indicateur SLAB_PANIC lorsqu'il kmem_cache_createest appelé pour créer le cache général de la dalle de fichiers.

Maintenant, vous devez regarder ./kernel/sysctl.c

  {
    .procname = "file-max",
    .data   = &files_stat.max_files,
    .maxlen   = sizeof(files_stat.max_files),
    .mode   = 0644,
    .proc_handler = proc_doulongvec_minmax,
  },

Le fichier-max est de 10% de mémoire, si votre système a une taille de mémoire différente, je pense que c'est normal.

c4f4t0r
la source