Les valeurs limites.conf sont-elles appliquées par processus?

25

Je règle la nofilevaleur /etc/security/limits.confpour mon utilisateur Oracle et j'ai une question sur son comportement: nofilelimite- t -il le nombre total de fichiers que l'utilisateur peut ouvrir pour tous ses processus ou limite-t-il le nombre total de fichiers que l'utilisateur peut avoir ouvert à chacun de ses processus?

Plus précisément, pour l'utilisation suivante:

oracle                  hard    nofile                  65536
Christopher Neylan
la source

Réponses:

23

La plupart des valeurs¹ dans limits.confsont des limites qui peuvent être définies avec la ulimitcommande shell ou l' setrlimitappel système. Ce sont les propriétés d'un processus. Les limites s'appliquent indépendamment pour chaque processus. En particulier, chaque processus peut avoir jusqu'à nofileouvrir des fichiers. Il n'y a pas de limite au nombre de fichiers ouverts cumulés par les processus d'un utilisateur.

La nproclimite est un peu un cas particulier, en ce sens qu'elle résume tous les processus d'un utilisateur. Néanmoins, il s'applique toujours par processus: lorsqu'un processus appellefork pour créer un nouveau processus, l'appel est refusé si le nombre de processus appartenant à l'euid du processus est supérieur à la RLIMIT_NPROCvaleur du processus .

La limits.confpage de manuel explique que les limites s'appliquent à une session. Cela signifie que tous les processus d'une session auront tous ces mêmes limites (sauf s'ils sont modifiés par l'un de ces processus). Cela ne signifie pas qu'une somme soit faite sur les processus d'une session (ce n'est même pas quelque chose que le système d'exploitation suit - il y a une notion de session, mais c'est plus fin que cela, par exemple, chaque application X11 a tendance à se terminer dans sa propre session). La façon dont cela fonctionne est que le processus de connexion se fixe des limites, et elles sont héritées par tous les processus enfants.

¹ Les exceptions sont maxlogins, maxsysloginset chroot, qui sont appliquées dans le cadre du processus de connexion pour refuser ou influencer la connexion.

Gilles 'SO- arrête d'être méchant'
la source
Inversement, cela signifie-t-il que différentes sessions peuvent avoir différents ensembles de limites?
CMCDragonkai
1
@CMCDragonkai Oui, par exemple en cas de limit.confmodification entre les heures d'ouverture des sessions ou si différentes limites (elles doivent être plus petites à l'exception de root) sont définies .profile.
Gilles 'SO- arrête d'être méchant'
1
@laimison Si vous parcourez tous les processus en cours d'exécution et que vous les exécutez prlimit --pid $pidsur chacun, vous pouvez effectivement modifier la limite d'une session active. Notez que vous devrez peut-être le faire plusieurs fois au cas où certains processus seraient bifurqués pendant l'itération.
Gilles 'SO- arrête d'être méchant'
1
@laimison No. Supposons qu'un utilisateur ne dispose que de deux processus A et B, RLIMIT_NPROCdéfinis sur 2 dans A et sur 3 dans B. Alors B peut bifurquer un processus de plus, mais pas A.
Gilles 'SO- arrête d'être méchant'
1
@laimison Si vous définissez la limite à 2 dans le parent de B et que vous ne la modifiez pas dans B après la fourche, alors la limite de B sera 2. Si vous définissez la limite à 2 dans le parent de B mais que vous augmentez la limite dans B, ou si vous définissez la limite à 3 dans le parent de B avant de bifurquer B et la définissez à 2 après bifurquer B, B aura la limite définie à 3. La seule limite qui importe est celle du processus qui appelle fork (), pas la limite dans le parent de ce processus ou dans tout autre processus.
Gilles 'SO- arrête d'être méchant'