J'ai deux serveurs CentOS 5 avec des spécifications presque identiques. Lorsque je me connecte et que je ulimit -u
, sur une machine j'obtiens unlimited
, et sur l'autre j'obtiens 77824
.
Quand je lance un cron comme:
* * * * * ulimit -u > ulimit.txt
J'obtiens les mêmes résultats (unlimited
, 77824
).
J'essaie de déterminer où ceux-ci sont définis afin de pouvoir les modifier. Ils ne sont définis dans aucun de mes profils (.bashrc
, /etc/profile
, etc.). Ceux-ci n'affecteraient pas le cron de toute façon) ni dans /etc/security/limits.conf
(qui est vide).
J'ai parcouru Google et je suis même allé jusqu'à grep -Ir 77824 /
, mais rien n'est arrivé jusqu'à présent. Je ne comprends pas comment ces machines auraient pu être prédéfinies avec des limites différentes.
Je me demande en fait non pas pour ces machines, mais pour une autre machine (CentOS 6) qui a une limite de 1024
, ce qui est beaucoup trop petit. J'ai besoin d'exécuter des tâches cron avec une limite plus élevée et la seule façon de le définir est dans la tâche cron elle-même. C'est ok, mais je préfère le définir à l'échelle du système afin qu'il ne soit pas aussi hacky.
Merci pour toute aide. Cela semble être facile (PAS).
MODIFIER - RÉSOL
Ok, j'ai compris ça. Cela semble être un problème avec CentOS 6 ou peut-être la configuration de ma machine. Sur la configuration CentOS 5, je peux définir dans /etc/security/limits.conf
:
* - nproc unlimited
et cela mettrait effectivement à jour les comptes et les limites de cron. Cependant, cela ne fonctionne pas dans ma boîte CentOS 6. Au lieu de cela, je dois faire:
myname1 - nproc unlimited
myname2 - nproc unlimited
...
Et les choses fonctionnent comme prévu. Peut-être que la spécification UID fonctionne, mais le caractère générique (*) NE FAIT PAS définitivement ici. Curieusement, les caractères génériques fonctionnent pour la limite nofile
.
J'aimerais toujours savoir d'où viennent les valeurs par défaut, car par défaut, ce fichier est vide et je ne voyais pas pourquoi j'avais des valeurs par défaut différentes pour les deux boîtiers CentOS, qui avaient un matériel identique et provenaient du même fournisseur .
Ces limites "par défaut" sont appliquées par:
init
),fork(2)
heure),setrlimit(2)
).Les processus des utilisateurs normaux ne peuvent pas augmenter les limites strictes.
Au démarrage, Linux définit des limites par défaut pour le processus init
, qui sont ensuite héritées par tous les autres processus (enfants). Pour voir ces limites: cat /proc/1/limits
.
Par exemple, la valeur par défaut du noyau pour nombre maximum de descripteurs de fichiers (ulimit -n
) Était 1024/1024 (soft, hard), et a été augmenté à 1024/4096 sous Linux 2.6.39.
La valeur par défaut nombre maximal de processus dont vous parlez se limite à environ:
Total RAM in kB / 128
pour les architectures x86 (au moins), mais les distributions modifient parfois les valeurs par défaut du noyau, donc vérifiez votre code source du noyau pour kernel/fork.c
, fork_init()
. La limite "nombre de processus" y est appelée RLIMIT_NPROC.
Habituellement, pour assurer l'authentification des utilisateurs lors de la connexion, PAM est utilisé avec certains modules (voir /etc/pam.d/login
).
Sur Debian, le module PAM responsable de la définition des limites est ici: /lib/security/pam_limits.so
.
Cette bibliothèque lira sa configuration à partir de /etc/security/limits.conf
Et /etc/security/limits.d/*.conf
, Mais même si ces fichiers sont vides, pam_limits.so peut utiliser des valeurs codées en dur que vous pouvez vérifier dans le code source.
Par exemple, sur Debian, la bibliothèque a été corrigée de sorte que par défaut, le nombre maximum de processus (nproc
) est illimité, et le nombre maximum de fichiers (nofile
) est 1024/1024:
case RLIMIT_NOFILE: pl->limits[i].limit.rlim_cur = 1024; pl->limits[i].limit.rlim_max = 1024;
Donc, vérifiez le code source du module PAM de votre CentOS (recherchez RLIMIT_NPROC).
Cependant, veuillez noter que de nombreux processus ne passeront pas par PAM (généralement, s'ils ne sont pas lancés par un utilisateur connecté, comme les démons et peut-être les tâches cron).
Sur RHEL6 (CentOS6) "processus utilisateur max" est défini par défaut sur 1024.
Vous pouvez modifier cette valeur dans le fichier:
/etc/security/limits.d/90-nproc.conf
Voir https://bugzilla.redhat.com/show_bug.cgi?id=4329 si vous souhaitez vous plaindre :)
Les informations à ce sujet sont terribles sur Internet, voici un fichier limits.conf que j'ai créé pour debian linux, montrant toutes les options possibles et leurs limites "sûres" maximales, Tweak en conséquence.
Ce sont les valeurs les plus élevées que vous pouvez définir, certaines choses sont hachées, l'activation de ces causes vous amène à l'erreur et vous ne pouvez pas vous connecter à votre console, modifiez les options commentées à vos risques et périls, mais vous ne devriez pas en avoir besoin (la valeur par défaut est illimitée sur la plupart)
J'espère que cela est utile à quelqu'un, car je n'ai pu trouver cette information nulle part, il y a 4 heures de recherche sur ce fichier.
==== FILE START =====
# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
#
#<domain> <type> <item> <value>
#
#Where:
#<domain> can be:
#- a user name
#- a group name, with @group syntax
#- the wildcard *, for default entry
#- the wildcard %, can be also used with %group syntax,
# for maxlogin limit
#- NOTE: group and wildcard limits are not applied to root.
# To apply a limit to the root user, <domain> must be
# the literal username root.
#
#<type> can have the two values:
#- "soft" for enforcing the soft limits
#- "hard" for enforcing hard limits
#
#<item> can be one of the following:
#- core - limits the core file size (KB)
#- data - max data size (KB)
#- fsize - maximum filesize (KB)
#- memlock - max locked-in-memory address space (KB)
#- nofile - max number of open files
#- rss - max resident set size (KB)
#- stack - max stack size (KB)
#- cpu - max CPU time (MIN)
#- nproc - max number of processes
#- as - address space limit (KB)
#- maxlogins - max number of logins for this user
#- maxsyslogins - max number of logins on the system
#- priority - the priority to run user process with
#- locks - max number of file locks the user can hold
#- sigpending - max number of pending signals
#- msgqueue - max memory used by POSIX message queues (bytes)
#- Nice - max Nice priority allowed to raise to values: [-20, 19]
#- rtprio - max realtime priority
#- chroot - change root to directory (Debian-specific)
#
#<domain> <type> <item> <value>
#
#* soft core 0
#root hard core 100000
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#ftp - chroot /ftp
#@student - maxlogins 4
# -- Defaults:
#(core) core file size (blocks, -c) 0 (ulimit -Hc or -Sc)
#(data) data seg size (bytes, -d) unlimited
#(priority) scheduling priority (-e) 0
#(fsize) file size (blocks, -f) unlimited
#(sigpending) pending signals (-i) 378197
#(memlock) max locked memory (kbytes, -l) 64
# max memory size (kbytes, -m) unlimited
#(nofile) open files (-n) 65536
# pipe size (512 bytes, -p) 8
#(msgqueue) POSIX message queues (bytes, -q) 819200
#(rtprio) real-time priority (-r) 0
#(stack) stack size (kbytes, -s) 8192
#(cpu) cpu time (seconds, -t) unlimited
#(nproc) max user processes (-u) 378197
# virtual memory (kbytes, -v) unlimited
#(locks) file locks (-x) unlimited
# -- root Limits:
root - core -1
root - data -1
root - fsize -1
root - memlock -1
root - nofile 999999
root - stack -1
root - cpu -1
root - nproc -1
root - priority 0
root - locks -1
root - sigpending -1
root - msgqueue -1
root - rtprio -1
root - maxlogins -1
root - maxsyslogins -1
#root - rss -1
#root - as -1
#root - Nice 0
#root - chroot -1
#All Users:
# -- Hard Limits
* hard core -1
* hard data -1
* hard fsize -1
* hard memlock -1
* hard nofile 999999
* hard stack -1
* hard cpu -1
* hard nproc -1
* hard priority 0
* hard locks -1
* hard sigpending -1
* hard msgqueue -1
* hard rtprio -1
* hard maxlogins -1
* hard maxsyslogins -1
#* hard rss -1
#* hard as -1
#* hard Nice 0
#* hard chroot -1
# -- Soft Limits
* soft core -1
* soft data -1
* soft fsize -1
* soft memlock -1
* soft nofile 999999
* soft stack -1
* soft cpu -1
* soft nproc -1
* soft priority 0
* soft locks -1
* soft sigpending -1
* soft msgqueue -1
* soft maxlogins -1
* soft maxsyslogins -1
* soft rtprio -1
#* soft rss -1
#* soft as -1
#* soft Nice 0
#* soft chroot -1
#randomuser:
# -- Soft Limits
randomuser soft core -1
randomuser soft data -1
randomuser soft fsize -1
randomuser soft memlock -1
randomuser soft nofile 999999
randomuser soft stack -1
randomuser soft cpu -1
randomuser soft nproc -1
randomuser soft priority 0
randomuser soft locks -1
randomuser soft sigpending -1
randomuser soft msgqueue -1
randomuser soft maxlogins -1
randomuser soft maxsyslogins -1
randomuser soft rtprio -1
#randomuser soft rss -1
#randomuser soft as -1
#randomuser soft Nice 0
#randomuser soft chroot -1
# End of file
Lorsque vous avez vérifié les limites, utilisiez-vous l'utilisateur root pour le faire?
Du limits.conf
page de manuel:
REMARQUE: les limites de groupe et de caractère générique ne sont pas appliquées à l'utilisateur root. Pour définir une limite pour l'utilisateur root, ce champ doit contenir la racine du nom d'utilisateur littéral.
L'utilisation de noms d'utilisateur explicites résoudrait le problème dans ce cas.
noyau/fork.c
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
Sur 64 bits, la taille du fil est 8192
grep -i total /proc/meminfo
MemTotal: 8069352 kB
Maintenant, je reçois le total en ko en division par 4
echo $((8069352/4))
2017338
Maintenant j'ai le nombre de pages
echo $((8 * 8192 / 4096)
16
Le résultat final est
echo $((2017338/16))
126083
De cette façon, vous avez obtenu le paramètre thread-max et la limite de processus utilisateur par défaut est la moitié
init_task.signal->rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;
init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2;
ulimit de la racine
ulimit -u
62932
echo $((62932*2))
125864 #we are near
Il existe une autre possibilité que la configuration de "noproc" ne fonctionne pas lors de la configuration dans /etc/security/limits.conf.
Il existe un autre fichier qui remplace votre configuration /etc/security/limits.d/90-nproc.conf.
* soft nproc 1024 root soft nproc illimité
Ici * config remplacera tout ce que vous avez défini dans le fichier de configuration précédent. Donc, idéalement, vous configurez votre paramètre dans ce fichier.
Il semble être /etc/security/limits.conf