fork: retry: Die Ressource ist zur Zeit nicht verfügbar [gelöst] [Systemd Prozess Limit Ursache]

Debian macht sich hervorragend als Web- und Mailserver. Schau auch in den " Tipps und Tricks"-Bereich.
Antworten
Benutzeravatar
xcomm
Beiträge: 794
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

fork: retry: Die Ressource ist zur Zeit nicht verfügbar [gelöst] [Systemd Prozess Limit Ursache]

Beitrag von xcomm » 14.02.2024 22:51:41

Hi Gemeinde,

das System wurde vor ca. 2 Wochen auf das aktuelle Debian Stable upgraded, seitdem läuft es nach 2-3 Tagen in den Fehler in das Fork Limit.
Auf dem System laufen ein Haufen Scripte, welche Bestände und Bestellungen importieren abgleichen etc..

Ich sehe leider nicht richtig woran es liegt.

Code: Alles auswählen

ps -eLf | wc -l 
5522

sysctl fs.file-nr
fs.file-nr = 120064	0	21474836470

sar -r 1 10
Linux 5.10.0-27-amd64 (boark) 	02/14/24 	_x86_64_	(8 CPU)

22:25:57    kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
22:25:58       451832  43838040   4181512      8.48   7181900  35230360   7803888      9.42  11333952  34502348       584

lsof -u root 2>/dev/null | wc -l
130992
An welchem Rad sollte ich drehen können? Wo sitzt das blöde Limit?

Danke im Voraus
Zuletzt geändert von xcomm am 19.03.2024 20:28:08, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von Meillo » 14.02.2024 22:57:53

Vielleicht:

Code: Alles auswählen

ulimit -a | grep processes
?
Use ed once in a while!

Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von heisenberg » 14.02.2024 23:08:33

Ich finde das recht ungewöhnlich. Vielleicht lieber eher mal schauen, ob das System am Rad dreht, bevor Du selbst anfängst, an irgendwelchen Rädchen zu drehen.

D. h. mal schauen, ob da übermäßig viele Prozesse laufen, die da nicht laufen sollten. etc.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
MSfree
Beiträge: 10777
Registriert: 25.09.2007 19:59:30

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von MSfree » 15.02.2024 08:56:35

Schau mal, ob da Prozesse hängen, die nicht ordnungsgemäß beendet wurden und sich im Zombie-Zustand befinden. Sollte das der Fall sein, hast du massive Fehler in deiner Skriptsammlung, denn Zombies sollten auf dem System nicht entstehen:

Code: Alles auswählen

ps augx | grep Z
Zombies entstehen immer dann, wenn sich ein Parentprozeß beendet und der Childprozeß weiterläuft, ohne daß ein Reparent auf den init/systemd-Prozeß stattfindet. Dann ist keine Instanz vorhanden, die das SIGCHLD fängt, was dann zu einem Zombie führt.

Irgnedwann ist die maximale Anzahl Prozesse erreicht und du mußt das System neu starten.

tobo
Beiträge: 1997
Registriert: 10.12.2008 10:51:41

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von tobo » 15.02.2024 09:52:45

MSfree hat geschrieben: ↑ zum Beitrag ↑
15.02.2024 08:56:35
Zombies entstehen immer dann, wenn sich ein Parentprozeß beendet und der Childprozeß weiterläuft, [...]
Ein Zombie-Prozess ensteht dann, wenn das Kind (nicht ordnungsgemäß) beendet wurde und mit einem Eintrag in der Prozesstabelle verbleibt. Das Kind ist tot, der Vater reitet weiter...
https://de.wikipedia.org/wiki/Zombie-Prozess

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von Meillo » 15.02.2024 10:05:18

tobo hat recht. Ein Zombie ist ein beendeter Prozess, dessen Returncode (vereinfacht gesagt) noch nicht abgeholt worden ist. (Darum auch der Name: Der Prozess ist schon tot aber noch nicht ganz.)

Wenn ein Prozess nicht beabsichtigt, die Returninformation seiner Kinder abzuholen kann er sie mittels Double-Fork und Beenden des Zwischenprozesses an den Init-Prozess ``reparenten'' -- init hat als eine Aufgabe, die Returncodes aller seiner Kindprozesse staendig abzufragen. Dadurch werden Zombies beerdigt.
Use ed once in a while!

Benutzeravatar
MSfree
Beiträge: 10777
Registriert: 25.09.2007 19:59:30

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von MSfree » 15.02.2024 10:22:14

Meillo hat geschrieben: ↑ zum Beitrag ↑
15.02.2024 10:05:18
Ein Zombie ist ein beendeter Prozess, dessen Returncode (vereinfacht gesagt) noch nicht abgeholt worden ist.
Das ist das, was ich meinte, wenn keiner da ist, das SIGCHLD zu fangen, bzw. wenn der Programmierer schlicht vergißt, einen Signalcatcher für SIGCHLD zu implementieren. Das "Abholen" des SIGCHLD ist im Prinzip das Ding mit dem Returncode.

Tatsache ist aber, daß Zombies durch Programmierfehler entstehen.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von Meillo » 15.02.2024 10:30:48

Der Fehler war hier:
MSfree hat geschrieben: ↑ zum Beitrag ↑
15.02.2024 08:56:35
Zombies entstehen immer dann, wenn sich ein Parentprozeß beendet und der Childprozeß weiterläuft, ohne daß ein Reparent auf den init/systemd-Prozeß stattfindet.
Wenn sich der Parent beenden wuerde, dann wuerde das Kind auf den Init-Prozess reparentet werden. Damit wuerden etwaige Zombies zur Ruhe gebettet werden.

Zombies sind es nur dann wenn der Parent noch lebt aber die Returncodes der beendeten Kindprozesses nicht abholt. Die beendeten Kindprozesse sind dann die Zombies.


Nochmal mehr Erklaerung (fuer diejenigen, die hier interessiert mitlesen):

SIGCHLD ist der Hinweis, an den Parent, dass ein Kind beendet hat und der Parent nun dessen Returncode abfragen sollte (mittels wait(2) und Co.). Der Parent muss das Signal SIGCHLD nicht behandeln, er kann auch einfach periodisch wait() aufrufen. Kurzfristig ist der Zombiestatus auch nicht schlimm, bloss sollten die Zombies halt *irgendwann* mal weggeraeumt werden, weil sie sonst -- wie du ganz richtig sagst -- Prozess-Slots blockieren.

Double-Fork hilft dann, wenn der Parent keine Lust hat, die Returncodes der beendeten Kinder abzufragen (weil sie ihn nicht interessieren). Dann kann er ein Hilfskind erzeugen, das wiederum seinerseits das eigentliche Kind (= Enkel) erzeugt. Danach beendet sich das Hilfskind direkt und der Parent kann direkt dessen Returncode abfragen, um es zur Ruhe zu betten. Der eigentliche Kindprozess (Enkel) hat dann keinen Parent mehr und wird automatisch von Init adoptiert. Falls er irgendwann spaeter mal beendet, bettet Init ihn zur Ruhe. Der Parent ist von dieser Last befreit und Zombies werden verhindert.

Hier nochmal eine offizielle Beschreibung:
Manpage wait(2) hat geschrieben: NOTES
A child that terminates, but has not been waited for
becomes a "zombie". The kernel maintains a minimal set
of information about the zombie process (PID, termination
status, resource usage information) in order to allow the
parent to later perform a wait to obtain information
about the child. As long as a zombie is not removed from
the system via a wait, it will consume a slot in the ker‐
nel process table, and if this table fills, it will not
be possible to create further processes. If a parent
process terminates, then its "zombie" children (if any)
are adopted by init(8), which automatically performs a
wait to remove the zombies.
Use ed once in a while!

Benutzeravatar
MSfree
Beiträge: 10777
Registriert: 25.09.2007 19:59:30

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von MSfree » 15.02.2024 11:28:37

Meillo hat geschrieben: ↑ zum Beitrag ↑
15.02.2024 10:30:48
Wenn sich der Parent beenden wuerde, dann wuerde das Kind auf den Init-Prozess reparentet werden. Damit wuerden etwaige Zombies zur Ruhe gebettet werden.
Ich hatte schon Zombies, nachdem der Parent abgestürzt war.

Warten wir aber mal ab, ob der OP überhaupt Zombies in der Prozeßliste hat. Mir ist nur aufgefallen, daß da 5522 Prozesse in der Liste waren. Auf viel beschäftigten Systemen wohl nicht ungewöhnlich. Im Vergleich zu meinem Heimserver, wo gerade um die 350 Prozesse laufen, ist das aber schon deutlich mehr, was mich auf die Idee mit den Zombies gebracht hat.

Benutzeravatar
xcomm
Beiträge: 794
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von xcomm » 20.02.2024 09:04:26

So sieht es aus aktuell aus, nachdem der Fall wieder erreicht ist.

Code: Alles auswählen

 w | head -1
 09:04:08 up 3 days, 19:26,  1 user,  load average: 0,92, 0,88, 0,75

Code: Alles auswählen

free
              gesamt       benutzt     frei      gemns.  Puffer/Cache verfügbar
Speicher:   49322316     5862552     1683780       27780    41775984    42831756
Swap:       33554428       88064    33466364

Code: Alles auswählen

ulimit -a
real-time non-blocking time  (microseconds, -R) unlimited
core file size              (blocks, -c) 0
data seg size               (kbytes, -d) unlimited
scheduling priority                 (-e) 0
file size                   (blocks, -f) unlimited
pending signals                     (-i) 192467
max locked memory           (kbytes, -l) 6165288
max memory size             (kbytes, -m) unlimited
open files                          (-n) 1024
pipe size                (512 bytes, -p) 8
POSIX message queues         (bytes, -q) 819200
real-time priority                  (-r) 0
stack size                  (kbytes, -s) 8192
cpu time                   (seconds, -t) unlimited
max user processes                  (-u) unlimited
virtual memory              (kbytes, -v) unlimited
file locks                          (-x) unlimited

Code: Alles auswählen

ps augx | grep Z
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     25492  0.0  0.0   7972  2512 pts/4    S+   08:58   0:00 grep --color=auto Z

Code: Alles auswählen

Feb 20 08:53:16 boark cron[24192]: sendmail: warning: fork: Resource temporarily unavailable
Feb 20 08:53:16 boark cron[24193]: sendmail: warning: fork: Resource temporarily unavailable
Feb 20 08:55:16 boark cron[24388]: /usr/sbin/sendmail: Die Ressource ist zur Zeit nicht verfügbar
Feb 20 08:55:16 boark cron[24457]: sendmail: warning: fork: Resource temporarily unavailable
Feb 20 08:56:16 boark cron[24488]: /usr/sbin/sendmail: Die Ressource ist zur Zeit nicht verfügbar

Benutzeravatar
xcomm
Beiträge: 794
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von xcomm » 22.02.2024 09:04:11

Allso leider keine Zombies.

Seht Ihr noch was? Habt Ihr noch Ideen?

Code: Alles auswählen

# ulimit -a
real-time non-blocking time  (microseconds, -R) unlimited
core file size              (blocks, -c) 0
data seg size               (kbytes, -d) unlimited
scheduling priority                 (-e) 0
file size                   (blocks, -f) unlimited
pending signals                     (-i) 192467
max locked memory           (kbytes, -l) 8192
max memory size             (kbytes, -m) unlimited
open files                          (-n) 1024
pipe size                (512 bytes, -p) 8
POSIX message queues         (bytes, -q) 819200
real-time priority                  (-r) 0
stack size                  (kbytes, -s) 8192
cpu time                   (seconds, -t) unlimited
max user processes                  (-u) unlimited
virtual memory              (kbytes, -v) unlimited
file locks                          (-x) unlimited

Benutzeravatar
xcomm
Beiträge: 794
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von xcomm » 22.02.2024 09:12:06

https://www.tecmint.com/increase-set-op ... -in-linux/

Kann es am Soft Open Files Limit liegen?

Code: Alles auswählen

cat /proc/sys/fs/file-max
21474836470
# ulimit -Hn
524288
# ulimit -Sn
1024
Allerdings ist das eigentlich hochgesetzt.

Code: Alles auswählen

# vi /etc/security/limits.conf 
*                hard    nofile          1655360
*                soft    nofile          1655360
Frage mich, wo die 1024 dann herkommt?

Danke

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von Meillo » 22.02.2024 09:43:40

Die Ausgabe von `ulimit` kann in dem Prozess, in dem Cron laeuft, eingeschraenkt sein und damit von dem abweichen, was dir in der root-Shell ausgegeben wird.

Old-style-maessig koennte man das so testen:

Code: Alles auswählen

cd /usr/sbin
mv cron cron.orig
cat >cron <<!
#!/bin/sh
ulimit -a >/tmp/cron-ulimit
/usr/sbin/cron.orig
!
chmod +x cron
Dann Cron neu starten und in /tmp/cron-ulimit schauen, was dort drin steht und alles wieder zurueckbauen.


Ich weisst gerade nicht, ob cron den Fehler meldet, wenn es sendmail forken will. oder ob cron nur einen Fehler von sendmail ins Log schreibt und sendmail den Fehler hat wenn dieses intern forken will. Kann diese Frage jemand beantworten?

Du koenntest dazu mal pruefen, zu was fuer einem Prozess die in der Fehlermeldung angegebene PID gehoert.

Sendmail hat sicherlich in seiner Config ressourcenlimitierende Einstellungen, also wieviele Prozesse es in soundso viel Zeit forken kann, usw. Vielleicht musst du auch dort ansetzen ...

Das mal an weiteren Gedanken.
Use ed once in a while!

Benutzeravatar
MSfree
Beiträge: 10777
Registriert: 25.09.2007 19:59:30

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von MSfree » 22.02.2024 09:47:06

xcomm hat geschrieben: ↑ zum Beitrag ↑
22.02.2024 09:12:06
Kann es am Soft Open Files Limit liegen?
Bei einem Programmstart muß die Datei, die das Executable enthält, geöffnet werden. Es ist zumindest denkbar, daß genau in dem Moment die maximale Anzahl offener Dateien erreicht ist. Mich wundert dann aber die Fehlermeldung, die nicht die maximale Dateianzahl als Fehlerursache ausgibt, sondern mit dieser fork-Meldung daherkommt.

Die maximal erlaubten 1024 offenen Dateien gelten pro Benutzer und sind ein auf 1024 voreingestellter Kernelparameter. Du kannst größere Werte in die Datei /etc/sysctl.conf eintragen, z.B.:

Code: Alles auswählen

fs.file-max=5000
Es kann sein, daß du zusätzlich die Datei /etc/security/limits.conf anpassen mußt.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von Meillo » 22.02.2024 09:54:58

MSfree hat geschrieben: ↑ zum Beitrag ↑
22.02.2024 09:47:06
xcomm hat geschrieben: ↑ zum Beitrag ↑
22.02.2024 09:12:06
Kann es am Soft Open Files Limit liegen?
Bei einem Programmstart muß die Datei, die das Executable enthält, geöffnet werden.
Hmm ... ein fork(2) dupliziert nur den Prozess. Dabei werden keine Dateien geoeffnet. Es ist eine identische Kopie des Prozesses, die nur eine andere PID und PPID hat. Erst beim exec(2) wird eine Executable-Datei gelesen ... aber dieses Lesen macht der Kernel und nicht der Prozess selbst, folglich sollte sich das auch nicht auf Open Files auswirken.

Ich glaube daher nicht, dass es daran liegt, wenn in der Fehlermeldung klar ``fork'' drin steht.
Use ed once in a while!

Benutzeravatar
xcomm
Beiträge: 794
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von xcomm » 17.03.2024 12:06:02

Code: Alles auswählen

cd /usr/sbin
mv cron cron.orig
cat >cron <<!
#!/bin/sh
ulimit -a >/tmp/cron-ulimit
/usr/sbin/cron.orig
!
chmod +x cron
Ok, habe Deinen Wrapper probiert - hier die Ausgabe:

Code: Alles auswählen

max memory size             (kbytes, -m) unlimited
open files                          (-n) 1024
pipe size                (512 bytes, -p) 8
POSIX message queues         (bytes, -q) 819200
real-time priority                  (-r) 0
stack size                  (kbytes, -s) 8192
cpu time                   (seconds, -t) unlimited
max user processes                  (-u) 192467
virtual memory              (kbytes, -v) unlimited
file locks                          (-x) unlimited

Ideen? Danke

Benutzeravatar
xcomm
Beiträge: 794
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von xcomm » 17.03.2024 20:46:43

Code: Alles auswählen

service cron status
× cron.service - Regular background program processing daemon
     Loaded: loaded (/lib/systemd/system/cron.service; enabled; preset: enabled)
     Active: failed (Result: exit-code) since Sun 2024-03-17 09:47:32 CET; 10h ago
   Duration: 203ms
       Docs: man:cron(8)
    Process: 16950 ExecStart=/usr/sbin/cron -f $EXTRA_OPTS (code=exited, status=1/FAILURE)
   Main PID: 16950 (code=exited, status=1/FAILURE)
      Tasks: 4915 (limit: 4915)
     Memory: 31.1G
        CPU: 3min 40.440s
     CGroup: /system.slice/cron.service
...


Tasks: 4915 (limit: 4915)

Benutzeravatar
xcomm
Beiträge: 794
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von xcomm » 17.03.2024 21:09:35

Ok, das Task-Limit vom systemd erhöht.

Code: Alles auswählen

systemctl stop cron

systemctl edit cron

Code: Alles auswählen

### Editing /etc/systemd/system/cron.service.d/override.conf
### Anything between here and the comment below will become the new contents of the file

[Service]
TasksMax=65000

### Lines below this comment will be discarded

Code: Alles auswählen

systemctl daemon-reload
systemctl start cron
https://neo4j.com/developer/kb/increasi ... ad-limits/

Code: Alles auswählen

systemctl status cron

× cron.service - Regular background program processing daemon
     Loaded: loaded (/lib/systemd/system/cron.service; enabled; preset: enabled)
    Drop-In: /etc/systemd/system/cron.service.d
             └─override.conf
     Active: failed (Result: exit-code) since Sun 2024-03-17 21:00:40 CET; 8min ago
   Duration: 159ms
       Docs: man:cron(8)
   Main PID: 7713 (code=exited, status=1/FAILURE)
      Tasks: 4919 (limit: 65000)
     Memory: 31.1G
        CPU: 2min 3.796s
     CGroup: /system.slice/cron.service

Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von heisenberg » 17.03.2024 22:53:29

Glückwunsch und Danke für's posten der Lösung!
Jede Rohheit hat ihren Ursprung in einer Schwäche.

ernohl
Beiträge: 1181
Registriert: 04.07.2002 08:11:56
Wohnort: HL

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von ernohl » 18.03.2024 08:18:18

heisenberg hat geschrieben: ↑ zum Beitrag ↑
17.03.2024 22:53:29
Glückwunsch und Danke für's posten der Lösung!
Ich schließe mich an.
Trotzdem würde mich das Problem weiter bewegen, bis ich eine plausible Idee hätte, warum es erst seit dem letzten Upgrade auftritt.

Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von heisenberg » 18.03.2024 12:01:33

Trotzdem würde mich das Problem weiter bewegen, bis ich eine plausible Idee hätte, warum es erst seit dem letzten Upgrade auftritt.
Die naheliegende plausible Erklärung wäre für mich, dass systemd ein Limit setzt und dass es vorher ggf. nicht via systemd ausgeführt wurde. D. h. vorher gab es kein Limit.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
xcomm
Beiträge: 794
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Re: fork: retry: Die Ressource ist zur Zeit nicht verfügbar

Beitrag von xcomm » 19.03.2024 20:26:32

Danke!

Ich fand es sehr überraschend, dass es nach all den Suchen im Netz ein Limit von Systemd war. Man sucht da normal nicht.

Antworten