Valor predeterminado de / proc / sys / fs / file-max

9

Soy consciente de que / proc / sys / fs / file-max define el número máximo de descriptores de archivo abiertos y se puede configurar en tiempo de ejecución o durante el arranque.

Sin embargo: ¿cuál es su valor predeterminado? Verificar 10 servidores en mi empresa me da 7 valores diferentes, que parecen aleatorios.

La documentación del kernel sigue mencionando que el valor se puede cambiar, pero no cómo se calcula el valor predeterminado.

¿Alguien de ustedes sabe cómo se determina el valor predeterminado?

taranion
fuente

Respuestas:

13

El file-maxlímite que ve debajo proc fses un valor en struct en "./include/linux/fs.h"la estructura es:

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

Ahora en ./fs/file_table.cel files_stat_structse comienza a utilizar:

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

Ahora en el archivo anterior "./fs/file_table.c"tendrá la función que hará el trabajo real

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

Por lo que puedo ver en files_inity mirando la macro max_t, si el 10% de la memoria para archivos es más de 8192, se utilizarán esos valores, a menos que 8192.

files_init se usa cuando el kernel comienza a ejecutarse y necesita ver el indicador SLAB_PANIC cuando kmem_cache_createse llama para crear la caché de losa de archivos generales.

Ahora necesitas mirar ./kernel/sysctl.c

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

El archivo máximo es el 10% de la memoria. Si su sistema tiene un tamaño de memoria diferente, creo que es normal.

c4f4t0r
fuente