Limites no número de descritores de arquivos

34

Estou tentando instalar 389-ds, e isso me dá este aviso:

WARNING: There are only 1024 file descriptors (hard limit) available, which limit the number of simultaneous connections.

Entendo sobre descritores de arquivos, mas não entendo sobre limites flexíveis e flexíveis.

Quando corro cat /proc/sys/fs/file-max, volto 590432. Isso deve significar que eu posso abrir até 590432 arquivos (ou seja, ter até 590432 descritores de arquivos.

Mas quando corro ulimit, isso me dá resultados diferentes:

$ ulimit
unlimited

$ ulimit -Hn    # Hard limit
4096

$ ulimit -Sn    # Soft limit
1024

Mas quais são os limites físicos / físicos ulimite como eles se relacionam com o número armazenado em /proc/sys/fs/file-max?

Rafael Adel
fonte

Respostas:

39

De acordo com a documentação do kernel , /proc/sys/file-maxé o número máximo total total de descritores de arquivo que o kernel alocará antes de ser bloqueado. Este é o limite do kernel, não o usuário atual. Assim, você pode abrir o 590432, desde que esteja sozinho em um sistema inativo (modo de usuário único, sem daemons em execução).

Observe que a documentação está desatualizada: o arquivo está proc/sys/fs/file-maxhá muito tempo. Obrigado a Martin Jambon por apontar isso.

A diferença entre os limites suave e rígido é respondida aqui, no SE . Você pode aumentar ou diminuir um limite flexível como um usuário comum, desde que não ultrapasse o limite máximo. Você também pode diminuir um limite rígido (mas não pode aumentá-lo novamente para esse processo). Como superusuário, você pode aumentar e diminuir os limites rígido e flexível. O esquema de limite duplo é usado para impor políticas de sistema, mas também permite que usuários comuns definam limites temporários para eles mesmos e depois os alterem.

Observe que, se você tentar reduzir um limite rígido abaixo do limite flexível (e você não for o superusuário), EINVALretornará (Argumento inválido).

Portanto, no seu caso particular, ulimit(que é o mesmo que ulimit -Sf) diz que você não tem um limite flexível para o tamanho dos arquivos gravados pelo shell e seus subprocessos . (essa é provavelmente uma boa ideia na maioria dos casos)

Sua outra invocação, ulimit -Hnrelata o -nlimite (número máximo de descritores de arquivos abertos), não o -flimite, e é por isso que o limite flexível parece mais alto que o limite rígido. Se você entrar, ulimit -Hfvocê também terá 'ilimitado'.

Alexios
fonte
14
No Linux 4.4.0, o caminho file-max é /proc/sys/fs/file-max.
Martin Jambon
por favor, o limite rígido tem como ulimit -Hn alvo o próprio limite do sistema para atribuir recursos de descritor de arquivo?
Webwoman 19/09/18
2
@ Webman: não, não. ulimitafeta apenas os limites do processo atual . Os limites do processo atual também estão relacionados aos processos filhos, mas cada processo tem uma contagem separada. Por exemplo ulimit -Hn 10, com , você pode ter apenas 10 descritores de arquivos abertos a qualquer momento. Cada processo filho que você cria também pode ter até 10 descritores de arquivo. Somente o superusuário pode aumentar um limite depois de definido. Se você definir um valor muito baixo, sua única opção pode ser matar o processo do shell e iniciar um novo.
Alexios #
0

A chamada do sistema "select" é uma das muitas decisões terríveis de desmembramento do unix que faz com que até o Windows95 ainda pareça tão bom em comparação.

Deveria ter sido banido há 20 anos e então agora podemos ter a capacidade de manipular arquivos ilimitados sem problemas.

Você pode aumentar o número de descritores de arquivo facilmente com a configuração do kernel e o ulimit, mas lembre-se de que, se alguma biblioteca usar a chamada "select" do sistema, seu programa ficará instável (corrupção de memória) e falhará.

O Select só pode manipular descritores de arquivos de 0 a 1023 e, se você alimentar um com um valor mais alto, ele será cutucado aleatoriamente na memória e o select nunca repetirá o descritor como funcionando. Infelizmente, muitas bibliotecas usam select.

Lothar
fonte
Seu comentário é um aviso útil, mas, em vez de tomar um tom estridente, teria sido muito mais útil ter citado a fd_set(3)página de manual e de que o limite vem FD_SETSIZE. E o melhor teria sido uma sugestão de uma chamada de substituição poll(3), como nesta resposta
Davor Cubranic em 26/11