Os valores de limits.conf são aplicados por processo?

25

Estou ajustando o nofilevalor /etc/security/limits.confpara o meu usuário oracle e tenho uma pergunta sobre seu comportamento: nofilelimita o número total de arquivos que o usuário pode abrir em todos os seus processos ou limita o número total de arquivos que o usuário pode ter aberto para cada um de seus processos?

Especificamente, para o seguinte uso:

oracle                  hard    nofile                  65536
Christopher Neylan
fonte

Respostas:

23

A maioria dos valores¹ in limits.confsão limites que podem ser definidos com o ulimitcomando shell ou a setrlimitchamada do sistema. Eles são propriedades de um processo. Os limites se aplicam independentemente para cada processo. Em particular, cada processo pode ter até nofilearquivos abertos. Não há limite para o número de arquivos abertos acumulados pelos processos de um usuário.

O nproclimite é um caso um pouco especial, pois soma todos os processos de um usuário. No entanto, ele ainda se aplica por processo: quando um processo chama forkpara criar um novo processo, a chamada é negada se o número de processos pertencentes ao euid do processo for maior que o RLIMIT_NPROCvalor do processo .

A limits.confpágina do manual explica que os limites se aplicam a uma sessão. Isso significa que todos os processos em uma sessão terão todos os mesmos limites (a menos que sejam alterados por um desses processos). Isso não significa que qualquer soma seja feita nos processos de uma sessão (isso não é algo que o sistema operacional rastreia - existe uma noção de sessão, mas é mais refinada do que isso, por exemplo, cada aplicativo X11 tende a terminar em sua própria sessão). A maneira como funciona é que o processo de login define alguns limites e são herdados por todos os processos filhos.

¹ As exceções são maxlogins, maxsysloginse chroot, que são aplicadas como parte do processo de login para negar ou influenciar o login.

Gilles 'SO- parar de ser mau'
fonte
Por outro lado, isso significa que sessões diferentes podem ter diferentes conjuntos de limites?
precisa saber é o seguinte
1
@CMCDragonkai Sim, por exemplo, se limit.confalterado entre os horários em que as sessões foram abertas ou se limites diferentes (eles teriam que ser menores, exceto para raiz), foram definidos .profile.
Gilles 'SO- stop be evil'
1
@laimison Se você iterar em todos os processos em execução e executar prlimit --pid $pidem cada um deles, poderá alterar efetivamente o limite para uma sessão ativa. Observe que você pode precisar fazer isso algumas vezes para o caso de alguns processos serem bifurcados durante a iteração.
Gilles 'SO- stop be evil' em
1
@laimison No. Suponha que um usuário tenha apenas dois processos A e B, com RLIMIT_NPROCdefinido em 2 em A e 3 em B. Então B pode bifurcar mais um processo, mas A não.
Gilles 'SO- stop be evil'
1
@laimison Se você definir o limite para 2 no pai de B e não o alterar em B após a bifurcação, o limite de B será 2. Se você definir o limite para 2 no pai de B, mas aumentar o limite em B, ou se você define o limite como 3 no pai de B antes de bifurcar B e define como 2 depois de bifurcar B, B terá o limite definido como 3. O único limite que importa é o do processo que chama fork (), não o limite no pai desse processo ou em qualquer outro processo.
Gilles 'SO- stop be evil'