Valor padrão de / proc / sys / fs / file-max

7

Estou ciente de que / proc / sys / fs / file-max define o número máximo de descritores de arquivos abertos e pode ser definido em tempo de execução ou durante a inicialização.

No entanto: qual é o valor padrão? Verificar 10 servidores em minha empresa me dá sete valores diferentes, que parecem aleatórios.

A documentação do kernel apenas menciona que o valor pode ser alterado - mas não como o valor padrão é calculado.

Alguém sabe como o valor padrão é determinado?

    
por taranion 25.08.2015 / 11:51

1 resposta

11

O file-max limit que você vê em proc fs é um valor em struct em "./include/linux/fs.h" a estrutura é:

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

Agora, em ./fs/file_table.c , o files_stat_struct é usado:

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

Agora, no arquivo anterior, "./fs/file_table.c" terá a função que fará o trabalho 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);
}

Do que eu posso ver no files_init e procurando a macro max_t , Se 10% da memória para arquivos for maior que 8192, esses valores serão usados, a menos que 8192.

files_init é usado quando o kernel é executado e você precisa ver o sinalizador SLAB_PANIC quando kmem_cache_create é chamado para criar o cache geral do slab de arquivo.

Agora você precisa procurar ./kernel/sysctl.c

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

O arquivo-max é 10% da memória, se o seu sistema tiver um tamanho de memória diferente, eu acho que é normal.

    
por 25.08.2015 / 12:37