Ulimit

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Limites de ressources par utilisateur
Commande ulimit
Contexte Shell (bash) + PAM (/etc/security/limits.conf)
Voir aussi /etc/security/limits.d/, PAM pam_limits

ulimit affiche et modifie les limites de ressources (fichiers ouverts, taille de core, mémoire verrouillée, nombre de processus...) appliquées à la session shell courante et à ses processus enfants. Ces limites sont fixées côté noyau par processus (soft/hard) et peuvent être configurées de façon persistante pour les sessions PAM via /etc/security/limits.conf.

Limites soft et hard

Chaque ressource a deux plafonds : la limite soft (celle réellement appliquée, modifiable à la hausse par le processus jusqu'à la limite hard) et la limite hard (le plafond absolu, que seul root peut relever). Sans option, ulimit agit sur la limite soft.

ulimit -a          # toutes les limites courantes (soft)
ulimit -Ha          # toutes les limites hard
ulimit -Sa          # toutes les limites soft (équivalent de -a)

ulimit -n           # limite courante de fichiers ouverts (soft)
ulimit -Hn           # limite hard de fichiers ouverts
ulimit -n 2048       # relever la limite soft de fichiers ouverts à 2048 (pour la session courante)

⚠️ Un changement fait avec ulimit dans un shell ne s'applique qu'à ce shell et à ses enfants — il ne modifie rien pour les autres sessions déjà ouvertes ni pour les futurs logins. Pour une modification persistante, voir /etc/security/limits.conf ci-dessous, et penser à se déconnecter/reconnecter (ou relancer le service concerné) pour que le changement soit pris en compte.

Options courantes

-a     Affiche toutes les limites actuelles
-c     Taille maximale des fichiers core générés
-d     Taille maximale du segment de données d'un processus
-e     Priorité d'ordonnancement maximale ("nice")
-f     Taille maximale des fichiers écrits par le shell et ses enfants
-i     Nombre maximal de signaux en attente
-l     Taille maximale pouvant être verrouillée en mémoire
-m     Taille maximale du resident set (sans effet sur Linux)
-n     Nombre maximal de descripteurs de fichiers ouverts
-p     Taille des pipes en blocs de 512 octets (généralement non modifiable)
-q     Nombre maximal d'octets dans les files de messages POSIX
-r     Priorité d'ordonnancement temps réel maximale
-s     Taille maximale de la pile (stack)
-t     Temps CPU maximal en secondes
-u     Nombre maximal de processus pour un même utilisateur
-v     Quantité maximale de mémoire virtuelle disponible pour le shell
-x     Nombre maximal de verrous de fichiers (file locks)

/etc/security/limits.conf

Fichier lu par PAM (pam_limits) pour fixer les limites des sessions utilisateur au login. Syntaxe : <domaine> <type> <item> <valeur>.

# domaine    type    item    valeur
*            soft    core    unlimited
*            hard    core    unlimited
myuser       soft    nofile  4096
myuser       hard    nofile  8192
@mygroup     soft    nproc   2048
  • domaine : nom d'utilisateur, @groupe, ou * (défaut, ne s'applique pas à root).
  • type : soft ou hard.
  • item : entre autres core, data, fsize, memlock, nofile, nproc, rss, stack.
  • Les fichiers dans /etc/security/limits.d/, lus par ordre alphabétique, surchargent ce fichier en cas de conflit sur le même domaine.

Cette configuration ne s'applique qu'aux connexions via PAM (login, ssh, su avec session PAM) — elle n'affecte pas les limites des services système (systemd, cf. LimitNOFILE= dans une unit) ni les sessions déjà ouvertes.

Cas fréquent : relever la limite de fichiers ouverts

Sur un serveur avec beaucoup de connexions simultanées (base de données, reverse proxy, JVM...), la limite par défaut de 1024 fichiers ouverts est vite atteinte.

ulimit -n            # vérifier la limite actuelle
# 1024

# rendre le changement persistant pour un utilisateur donné :
cat >> /etc/security/limits.conf <<'EOF'
myuser    soft    nofile    65536
myuser    hard    nofile    65536
EOF

Ne pas oublier de se déconnecter/reconnecter à la session pour voir le changement pris en compte — ulimit -n lu dans une session déjà ouverte ne reflète que la limite fixée au login de cette session.

AIX

Sous AIX, ulimit existe aussi mais la gestion des limites utilisateur passe par chuser (attributs comme data_hard, fsize_hard...) plutôt que par /etc/security/limits.conf.

ulimit -a                    # limites courantes
ulimit -d unlimited          # modifier une limite pour la session courante

# rendre une limite illimitée pour un utilisateur, de façon persistante :
chuser data_hard=-1 username

ulimit -d 64000              # ou fixer une valeur définie

ulimit -Hd                    # afficher la limite hard
ulimit -Sd                    # afficher la limite soft

Voir aussi

  • /etc/security/limits.conf et /etc/security/limits.d/ — persistance des limites via PAM
  • systemd — pour les services (directives LimitNOFILE=, LimitNPROC=... dans les unit files), non couvertes par limits.conf