Différence entre ulimit -n et / proc / $ PID / limites

9

Sous Linux, il y a une limite de fichiers ouverts. Je peux utiliser ulimit -npour voir la limite de fichiers ouverts, qui est 1024 par défaut. Ensuite, je peux également voir la limite souple / stricte du fichier ouvert par processus en consultant / proc / $ PID / limits. Je vois soft = 1024 et hard = 4096.

Je me demande quelle est la différence entre ces deux sorties?

Aussi, faites setRlimit()-vous une getRlimit()demande à l'échelle du système ou par processus?

sdeLevelNegativeTwo
la source

Réponses:

11

ulimit -ndéfinit la limite souple par défaut; vous pouvez ajouter l' -Hoption pour afficher / définir la limite stricte.

Pour la plupart, les limites douces et dures se comportent comme ceci:

  1. Les processus de root (en fait, tout processus avec CAP_SYS_RESOURCE) peuvent augmenter ou diminuer toute limite sur n'importe quel processus.
  2. les processus de tout utilisateur peuvent abaisser toute limite sur les autres processus appartenant à cet utilisateur.
  3. les processus de tout utilisateur peuvent augmenter la limite logicielle jusqu'à la limite stricte des processus appartenant à cet utilisateur.
  4. Si un processus tente de dépasser sa limite souple, la tentative échoue.

Ainsi, les limites strictes fonctionnent comme un plafond sur les limites souples (sauf pour root, qui, comme d'habitude, peut tout faire).

Il existe une exception: une limite logicielle douce envoie un SIGXCPUsignal. Un processus peut choisir d'ignorer cela, ou de passer du temps à nettoyer, etc. Une fois la limite matérielle du processeur dépassée, le noyau envoie SIGKILL- ce qui n'est ni capturable, ni manipulable, ni ignorable. Ainsi, dans ce cas, la limite logicielle fonctionne comme un avertissement "vous n'avez plus de temps CPU - terminez et quittez rapidement, sinon!" et la limite stricte est le "ou bien".

La plupart sont par processus, mais quelques-uns (comme RLIMIT_NPROC) sont par utilisateur. La page de manuel getrlimit (2) spécifie pour chaque limite.

derobert
la source
Une autre question connexe, pourquoi parfois mon shell a ulimit -n = 1024 et un autre processus tiré depuis ce shell a une limite souple = 4096 (lecture depuis / proc / PID / limits)
sdeLevelNegativeTwo
@sdeLevelNegativeTwo Avez-vous déclenché le processus avant ou après le ulimit -n? Cela n'affecte pas les processus déjà lancés, uniquement le shell et les futurs. En dehors de cela, le processus peut augmenter sa limite souple à la limite dure. Vous pouvez donc utiliser ulimit -H -npour l'arrêter.
derobert