GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Speichernutzung für einen einzelnen Linux-Prozess begrenzen?

Ich verwende pdftoppm um ein vom Benutzer bereitgestelltes PDF in ein 300-DPI-Bild zu konvertieren. Dies funktioniert hervorragend, außer wenn der Benutzer ein PDF mit einer sehr großen Seitengröße bereitstellt. pdftoppm weist genügend Speicher zu, um ein 300-DPI-Bild dieser Größe im Speicher zu halten, was für eine 100-Zoll-Quadratseite 100 * 300 * 100 * 300 * 4 Bytes pro Pixel =3,5 GB entspricht. Ein böswilliger Benutzer könnte mir einfach eine lächerlich große PDF-Datei geben und alle möglichen Probleme verursachen.

Was ich also tun möchte, ist eine Art harte Grenze für die Speichernutzung für einen untergeordneten Prozess festzulegen, den ich ausführen möchte – lassen Sie den Prozess einfach sterben, wenn er versucht, mehr als beispielsweise 500 MB Speicher zuzuweisen. Ist das möglich?

Ich glaube nicht, dass ulimit dafür verwendet werden kann, aber gibt es ein Ein-Prozess-Äquivalent?

Akzeptierte Antwort:

Es gibt einige Probleme mit ulimit. Hier ist eine nützliche Lektüre zum Thema:Zeit- und Speicherverbrauch eines Programms in Linux begrenzen, was zum Timeout-Tool führt, mit dem Sie einen Prozess (und seine Verzweigungen) nach Zeit oder Speicherverbrauch einsperren können.

Das Timeout-Tool erfordert Perl 5+ und /proc Dateisystem gemountet. Danach kopiert man das Tool z.B. /usr/local/bin so:

curl https://raw.githubusercontent.com/pshved/timeout/master/timeout | 
  sudo tee /usr/local/bin/timeout && sudo chmod 755 /usr/local/bin/timeout

Danach können Sie Ihren Prozess durch Speicherverbrauch wie in Ihrer Frage wie folgt „einsperren“:

timeout -m 500 pdftoppm Sample.pdf

Alternativ können Sie -t <seconds> verwenden und -x <hertz> um den Prozess jeweils durch Zeit- oder CPU-Beschränkungen einzuschränken.

Die Funktionsweise dieses Tools besteht darin, mehrmals pro Sekunde zu prüfen, ob der erzeugte Prozess seine festgelegten Grenzen nicht überzeichnet hat. Das bedeutet, dass es tatsächlich ein kleines Fenster gibt, in dem ein Prozess möglicherweise auftreten könnte überzeichnen, bevor eine Zeitüberschreitung bemerkt und den Prozess beendet.

Ein korrekterer Ansatz würde daher wahrscheinlich Cgroups beinhalten, aber das Einrichten ist viel aufwändiger, selbst wenn Sie Docker oder runC verwenden würden, die unter anderem eine benutzerfreundlichere Abstraktion um Cgroups bieten.


Linux
  1. Maximale Speicherauslastung eines Linux/Unix-Prozesses

  2. CPU-Auslastung und Speicherauslastung eines einzelnen Prozesses unter Linux abrufen?

  3. So überprüfen Sie die Heap-Größe für einen Prozess unter Linux

  4. Wie kann die Speichernutzung der Anwendung begrenzt werden?

  5. Wie wird die Speichernutzung in Linux gemeldet?

So erhalten Sie die CPU-Auslastung eines einzelnen Prozesses in Linux

Maximale Speicherauslastung eines Prozesses

Wie kann die Speichernutzung nach Anwendung in Linux begrenzt werden?

Grafische Darstellung der Prozessspeichernutzung unter Linux

Den Speicher eines Linux-Prozesses in eine Datei ausgeben

Ubuntu Linux:Auslagerungsspeicher und Speichernutzung verarbeiten