wo sind die voreingestellten ulimit werte eingestellt? (Linux, Centos)

34

Ich habe zwei CentOS 5-Server mit nahezu identischen Spezifikationen. Wenn ich mich anmelde und tue ulimit -u, bekomme ich auf einem Computer unlimitedund auf dem anderen 77824.

Wenn ich einen Cron laufen lasse wie:

* * * * * ulimit -u > ulimit.txt

Ich erhalte die gleichen Ergebnisse ( unlimited, 77824).

Ich versuche festzustellen, wo diese eingestellt sind, damit ich sie ändern kann. Sie sind nicht in jedem meiner Profile eingestellt ( .bashrc, /etc/profileusw.). Diese würden sowieso nicht cron betreffen) oder in /etc/security/limits.conf(was leer ist).

Ich habe Google durchsucht und bin sogar so weit gegangen grep -Ir 77824 /, aber es ist noch nichts aufgetaucht. Ich verstehe nicht, wie diese Maschinen mit unterschiedlichen Grenzwerten voreingestellt worden sein könnten.

Ich frage mich eigentlich nicht für diese Maschinen, sondern für eine andere (CentOS 6) Maschine, die ein Limit von hat 1024, das viel zu klein ist. Ich muss Cron-Jobs mit einem höheren Limit ausführen und die einzige Möglichkeit, wie ich dies festlegen kann, ist der Cron-Job selbst. Das ist in Ordnung, aber ich würde es lieber systemweit einstellen, damit es nicht so abgedreht ist.

Vielen Dank für jede Hilfe. Dies scheint einfach zu sein (NICHT).


EDIT - Gelöst

Ok, ich habe das herausgefunden. Es scheint ein Problem mit CentOS 6 oder vielleicht meiner Maschinenkonfiguration zu sein. In der CentOS 5-Konfiguration kann ich Folgendes einstellen /etc/security/limits.conf:

* - nproc unlimited

und das würde effektiv die Konten und Cron-Limits aktualisieren. Dies funktioniert jedoch in meiner CentOS 6-Box nicht. Stattdessen muss ich Folgendes tun:

myname1 - nproc unlimited
myname2 - nproc unlimited
...

Und die Dinge funktionieren wie erwartet. Möglicherweise funktioniert die UID-Angabe auch, aber der Platzhalter (*) ist hier definitiv NICHT vorhanden. Seltsamerweise funktionieren Platzhalter für das nofileLimit.

Ich würde immer noch gerne wissen, woher die Standardwerte tatsächlich stammen, da diese Datei standardmäßig leer ist und ich nicht sehen konnte, warum ich für die beiden CentOS-Boxen, die identische Hardware hatten und vom selben Anbieter stammten, unterschiedliche Standardwerte hatte .

nomercysir
quelle
3
Hast du irgendetwas drin /etc/security/limits.d/?
Patrick
Nein, dieses
Verzeichnis
1
Sie können die Antwort nach einer bestimmten Wartezeit als tatsächliche Antwort veröffentlichen.
sysadmin1138
2
Ich habe das mal irgendwo nachgeschlagen. Die Standardeinstellungen werden vom Kernel festgelegt. Teils hart codiert, teils abhängig vom verfügbaren RAM. Ich denke, ich fand das auf Oracle Metalink im Zusammenhang mit der Einrichtung von SLES10 für Oracle-DB 11.2
Nils
1
Könnte diese Frage als gelöst markiert werden?

Antworten:

45

Diese "Standard" -Limits werden angewendet von:

  • der Linux-Kernel beim Booten (zum initProzess),
  • Vererbung von den Grenzen des übergeordneten Prozesses (zum fork(2)Zeitpunkt),
  • PAM beim Öffnen der Benutzersitzung (kann Kernel / geerbte Werte ersetzen),
  • der Prozess selbst (kann PAM & Kernel / geerbte Werte ersetzen, siehe setrlimit(2)).

Normale Benutzerprozesse können keine harten Grenzen setzen.

Der Linux-Kernel

Beim Booten legt Linux Standardlimits für den initProzess fest, die dann von allen anderen (untergeordneten) Prozessen geerbt werden. Um zu sehen, diese Grenzen: cat /proc/1/limits.

Der Kernel-Standard für die maximale Anzahl von Dateideskriptoren ( ulimit -n) war beispielsweise 1024/1024 (soft, hard) und wurde in Linux 2.6.39 auf 1024/4096 angehoben.

Die standardmäßige maximale Anzahl von Prozessen, über die Sie sprechen, ist auf ungefähr begrenzt:

Total RAM in kB / 128

für x86 - Architekturen (zumindest), aber manchmal Verteilungen Standardkernel Werte ändern, so überprüfen Sie die Kernel - Quellcode für kernel/fork.c, fork_init(). Das Limit "Anzahl Prozesse" heißt dort RLIMIT_NPROC.

PAM

In der Regel wird PAM zusammen mit einigen Modulen verwendet, um die Benutzerauthentifizierung bei der Anmeldung sicherzustellen (siehe /etc/pam.d/login).

Unter Debian ist die PAM - Modul für Limite hier: /lib/security/pam_limits.so.

Diese Bibliothek liest ihre Konfiguration aus /etc/security/limits.confund /etc/security/limits.d/*.conf, aber auch wenn diese Dateien leer sind, verwendet pam_limits.so möglicherweise fest codierte Werte , die Sie im Quellcode überprüfen können.

Unter Debian wurde die Bibliothek beispielsweise so gepatcht , dass die maximale Anzahl von Prozessen ( nproc) standardmäßig unbegrenzt ist und die maximale Anzahl von Dateien ( nofile) 1024/1024 beträgt:

  case RLIMIT_NOFILE:
      pl->limits[i].limit.rlim_cur = 1024;
      pl->limits[i].limit.rlim_max = 1024;

So überprüfen Sie Ihren CentOS‘PAM - Modul Quellcode (Look für RLIMIT_NPROC).

Beachten Sie jedoch, dass viele Prozesse PAM nicht durchlaufen (normalerweise, wenn sie nicht von einem angemeldeten Benutzer gestartet werden, z. B. Daemons und möglicherweise Cron-Jobs).

Totor
quelle
Richtig, Punkt getroffen, Kommentar entfernt. Ich denke, ich würde sagen, dass für die meisten Benutzer PAM wahrscheinlich aktiviert ist. Daher würde ich empfehlen, zuerst Ihre Dateien /etc/security/limits.conf und /etc/security/limits.d/* zu überprüfen. In diesem speziellen Fall, auf den ich auch gestoßen bin, gibt es in CentOS 6 eine Beschränkung von 1024 Prozessen / Gesamtzahl der Benutzerthreads, die standardmäßig über eine Datei limits.d festgelegt wird.
Rogerdpack
@rogerdpack ja, PAM ist auf jeden Fall aktiviert, aber, wie ich in meiner Antwort sagte: "Bitte beachten Sie, dass viele Prozesse PAM nicht durchlaufen (normalerweise, wenn sie nicht von einem angemeldeten Benutzer gestartet werden, wie Daemons und vielleicht cron Arbeitsplätze)". Unsere Diskussion hat keinen Mehrwert. Wenn Sie also alle Ihre Kommentare löschen, werde ich meine löschen. Vielen Dank.
Totor
Die SuSE-Distributionen enthalten das Paket ulimit , das /etc/initscript"einen bequemen Ort zum Anpassen der Prozessgrenzen" bietet und über konfiguriert werden kann /etc/sysconfig/ulimit.
sendmoreinfo
Außerdem liest die Linux-PAM-Bibliothek die vom Kernel (dh /proc/1/limits) seit Version 1.1.4 (veröffentlicht 2011) festgelegten Grenzwerte.
sendmoreinfo
@sendmoreinfo und was macht die Linux-PAM-Bibliothek mit den vom Kernel festgelegten Einschränkungen, abgesehen davon, dass sie gelesen werden?
Totor
15

Auf RHEL6 (CentOS6) ist "max user process " standardmäßig auf 1024 eingestellt.
Sie können diesen Wert in der Datei ändern:

/etc/security/limits.d/90-nproc.conf

Siehe https://bugzilla.redhat.com/show_bug.cgi?id=432903, wenn Sie sich darüber beschweren möchten :)

Tomas
quelle
Ich bezweifle, dass dieser 1024-Wert für nproc korrekt ist und der Autor sagte, dass sein limits.d-Verzeichnis leer war, so dass der Standardwert dort offensichtlich nicht definiert ist.
Totor
Totor kann technisch nicht mit dir streiten, aber Tom, ich fand es hilfreich, also danke!
Teilweise bewölkt
3

Haben Sie bei der Überprüfung der Grenzwerte den Root-Benutzer verwendet?

Aus der limits.confManpage:

HINWEIS: Gruppen- und Platzhalterlimits werden nicht auf den Root-Benutzer angewendet. Um ein Limit für den Root-Benutzer festzulegen, muss dieses Feld den wörtlichen Benutzernamen root enthalten.

Die Verwendung expliziter Benutzernamen würde das Problem in diesem Fall beheben.

Christopher Cashell
quelle
Seien Sie vorsichtig, dies ist wahrscheinlich eine Debian-spezifische "Funktion".
Totor
Außerdem ist die limits.confDatei leer (als limits.dVerzeichnis).
Totor
3

Info dazu ist im Internet furchtbar, hier ist eine limits.conf-Datei, die ich für Debian Linux erstellt habe und die alle möglichen Optionen und ihre maximalen "sicheren" Grenzen anzeigt.

Dies sind die höchsten Werte, die Sie festlegen können. Einige Dinge sind durchgestrichen. Wenn Sie diese aktivieren, treten Fehler auf, und Sie können sich nicht bei Ihrer Konsole anmelden. Sie können die auskommentierten Optionen auf eigenes Risiko ändern. Dies sollte jedoch nicht erforderlich sein auf den meisten)

Ich hoffe, dies ist nützlich für jemanden, da ich diese Informationen nirgendwo finden konnte, es gibt 4 Stunden Recherche in dieser Datei.

==== 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
XionicFire
quelle
2

kernel / fork.c

max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);

Bei 64-Bit-Thread beträgt die Größe 8192

 grep -i total /proc/meminfo 
 MemTotal:        8069352 kB

Jetzt bekomme ich die Summe in kb geteilt durch 4

 echo $((8069352/4))
 2017338

Jetzt habe ich die Anzahl der Seiten

 echo $((8 * 8192 / 4096)
 16

Das Endergebnis ist

echo $((2017338/16))
126083

Auf diese Weise erhalten Sie den Parameter thread-max und das Standard-Benutzerprozesslimit beträgt die Hälfte

init_task.signal->rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;
init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2;

ulimit von root

ulimit -u
62932
echo $((62932*2))
125864 #we are near
c4f4t0r
quelle
1

Es scheint /etc/security/limits.conf zu sein

http://ss64.com/bash/limits.conf.html

jamesbtate
quelle
1
Das habe ich schon in meinem Beitrag erwähnt. Dies hat keine Auswirkung und es werden auch keine Werte (unbegrenzt, 77824) für die jeweiligen Computer festgelegt (diese Datei ist leer).
Nomercysir
Oh, ich habe gesehen, dass Sie die .bashrc-Datei usw. überprüft haben, aber nicht, dass Sie diese ebenfalls erwähnt haben.
Jamesbtate
1

Es gibt eine weitere Möglichkeit, dass die Konfiguration für "noproc" während der Konfiguration in /etc/security/limits.conf nicht funktioniert.

Es gibt eine weitere Datei, die Ihre Konfiguration /etc/security/limits.d/90-nproc.conf überschreibt.

* soft nproc 1024
root soft nproc unbegrenzt

Hier setzt * config alles außer Kraft, was Sie in der vorherigen Konfigurationsdatei festgelegt haben. Idealerweise konfigurieren Sie Ihre Einstellung in dieser Datei.

Suyash Jain
quelle