Melhor configuração de pasta para o aplicativo que abre cerca de 1 milhão de arquivos e problemas ulimit

1

Eu tenho um aplicativo que cria arquivos 16 ^ 5 (1048576). Eu posso configurá-lo para criar todos eles na mesma pasta ou separá-los da maneira que eu quiser (com 1, 2, 3 ou 4 subpastas em cada pasta). Exemplo:

/*

ou

/a/*
.
.
.
/f/*

ou

/a/a/*
/a/b/*
.
.
.
/f/f/*

ou

/a/a/a/*
.
.
.
/f/f/f/*

ou

/a/a/a/a/*
/a/a/a/b/*
.
.
.
/f/f/f/f/*

Todos os arquivos têm menos de 4KB. Eu estou usando o Ubuntu 12.10 64bits e uma partição ext4 para armazenar isso. Qual estrutura de pastas seria a melhor estrutura para este caso? Talvez outro sistema de arquivos seja o mais adequado para este caso, alguma idéia?

De qualquer forma, estou tentando executar este algoritmo, eu deveria ser capaz de abrir 9999999 arquivos:

user@pc$ ulimit
unlimited

user@pc$ cat /proc/sys/fs/file-max
9999999

user@pc$ cat /etc/sysctl.conf
fs.file-max = 9999999

No entanto, quando eu o executo salvando tudo em uma única pasta, a chamada de fopen falha em torno de 999999 arquivos:

user@pc$ ls database/ | wc -l
999958

Estranhamente, este 999999 foi meu valor anterior para file-max em arquivos do sistema. Eu, claro, reiniciei minha máquina antes de atualizar o valor, talvez seja muito grande e, em seguida, ele mantém o último. O que pode estar errado?

    
por Frederico Schardong 02.03.2013 / 07:47

1 resposta

1

Se você olhar para proc (5) , /proc/sys/fs/file-max "define um limite para todo o sistema no número de arquivos abertos para todos os processos". Em particular, ele não diz que um único processo pode abrir muitos arquivos.

Você pode consultar o sysconf (3) , que descreve OPEN_MAX como "O número máximo de arquivos que um processo pode abrir a qualquer momento". Você pode recuperar esse valor executando getconf OPEN_MAX .

Na verdade, não sei de improviso o tamanho que você pode fazer de OPEN_MAX , e não estou inclinado a investigar mais a esta hora, mas sinta-se à vontade para experimentar e informar-nos de volta.

Incidentalmente, eu também executaria ulimit -a para mostrar todos os limites. A execução de ulimit sozinho em bash implica em ulimit -f , que mostra apenas o tamanho máximo dos arquivos gravados pelo shell e seus filhos.

P.S. Se seu aplicativo precisar manter um milhão de arquivos abertos ao mesmo tempo, sugiro que você reavalie seu design.

    
por 02.03.2013 / 08:37

Tags