Wenn ich Prozesse habe, die viel Speicher verbrauchen, oder wenn viele CPU-gebundene Prozesse laufen, ist es oft schwierig, sich überhaupt beim System anzumelden. Ich möchte das verhindern und dafür sorgen, dass das System immer reaktionsfähig bleibt. Gibt es eine Möglichkeit, dies zu erreichen?
Erläuternde Bearbeitung:
Ich spreche von zwei verschiedenen Situationen, in denen bei mir die gleichen Symptome auftreten:
Sehr hohe Speicherauslastung. Ein einzelner Prozess verbraucht fast oder mehr der verfügbaren 64 GB RAM. Wenn das System fast zu 100 % ausgelastet ist, reagieren Programme nicht mehr.
Sehr hohe CPU-Auslastung, Planungsprobleme. 10.000 ausführbare Prozesse verursachen das gleiche Problem. Beachten Sie, dass dies kein Problem einer 100 %igen CPU-Auslastung ist. Wenn ich alle bis auf 200 dieser Prozesse mit kill -STOP beende, bleiben alle 32 CPUs bei 100 % Auslastung, aber das System ist viel besser nutzbar.
Und zur Frage, was ich als „das System“ betrachte. Ich verstehe, dass es keinen konzeptionellen Unterschied zwischen einem Shell-Prozess und einem meiner anderen Benutzerprozesse gibt, aber es geht nur darum, sie unterschiedlich zu machen. Es gibt Optionen wie „Niceness“, die genau das tun. Aber wie oben erwähnt, hat „Niceness“ das Problem nicht gelöst, zumindest nicht im Fall (2.).
Ich habe die vollständige Kontrolle über diese Systeme und konnte in allen Fällen Jobs mit kill -STOP oder einfach Cc stoppen.Was ich beheben möchte, ist, dass dies unglaublich schwierig und bei Verwendung einer GUI manchmal unmöglich wird, da Eingaben unglaublich langsam oder gar nicht verarbeitet werden. Ich möchte dies allgemein beheben und nicht Änderungen an bestimmten Jobs vornehmen.
Dinge, die ich versucht habe:
Bei vielen laufenden Prozessen, die ich gerade habe, habe ich einfach alle laufenden Prozesse auf +5 gesetzt, aber das hat anscheinend nicht geholfen. Ebenso wenig, sie auf Niceness 19 zu setzen.
Wie in einer der Antworten vorgeschlagen. Ich habe versucht, die Scheduler-Richtlinie auf IDLE zu ändern, indem ich
sudo schedtool -D $(pgrep -u myuser progname -d " ")
und mitsudo sh -c 'for pid in $(pgrep -u myuser progname); do chrt -i -p 0 $pid; done;'
Dies scheint die Situation etwas zu verbessern.
Antwort1
Das Problem besteht darin, dass Ihr Speicher überlastet ist und das Betriebssystem infolgedessen Festplattencaches freigeben und Programme und deren Daten in den Swap-Speicher auslagern muss.
Swap ist eine Methode, um ein System am Laufen zu halten, wenn die physischen Speichergrenzen erreicht sind. Auf einem leicht ausgelasteten System kann dies bedeuten, dass das System weiter funktioniert und Dinge ausgelagert werden, wenn es zu Engpässen kommt, und dann bei Bedarf mit nur geringen Auswirkungen wieder eingelagert werden.
Die meisten Betriebssysteme spülen Programme und Codes auf der Basis „am wenigsten kürzlich verwendet“ in den Swap-Speicher. Es ist schwierig, Annahmen über die „Priorität“ des Speichers zu treffen, da sich die Speicherauslastung ändert und die „Priorität“ ein rutschiger Abhang subjektiver Urteile darüber ist, was wichtiger ist. Was für ein System wichtiger ist, ist für ein anderes weniger wichtig. Befehlszeilenprogramme sind einfach andere Programme und es ist unmöglich, sie von anderen Programmen zu unterscheiden, die vom Benutzer ausgeführt werden.
Da Sie ein stark ausgelastetes System mit vielen Prozessen haben, die viel Speicher beanspruchen, stoßen Sie auf ein Konfliktproblem. In dem Moment, in dem das Betriebssystem versucht, etwas auf die Festplatte auszulagern, um Speicher freizugeben, hat ein anderer Prozess bereits andere Auslagerungen angefordert, die wieder zurückgeholt werden müssen. Jede Anforderung, etwas zurück zu holen, schiebt etwas anderes aus.
Wie könnte ein System unter 10.000 Prozessen bestimmen, was Vorrang vor „System“-Befehlszeilenprogrammanforderungen haben sollte, die wie jede andere Programmanforderung aussehen?
Das andere Problem sind die Suchzeiten der Festplatte. Bei alten Festplatten beträgt die Zeit, die zum Bewegen des Laufwerkskopfs und zum Starten eines Lese- oder Schreibvorgangs benötigt wird, etwa 9,5 Millisekunden. Bei vielen gleichzeitigen Anfragen für verschiedene Bereiche kann diese Suchzeit alles andere dominieren und die tatsächlich nutzbare Zeit und Bandbreite auf überraschend kleine Werte reduzieren. Eine SSD kann helfen, aber wenn Sie nur über begrenzten Speicher verfügen, kann sie nur begrenzt helfen.
Ähnliche Engpässe können überall im System auftreten und unterschiedliche Symptome aufweisen. Das Betriebssystem kann eine große Anzahl gleichzeitiger Programme verwalten, ist aber selbst immer noch „nur“ ein Programm und benötigt neben allem anderen Zeit. Die Verwendung von Auslagerungsdateien ist nur einer der extremsten Engpässe.
Es ist keine gute Idee, ein System auf diese Weise zu überfluten und einfach zu erwarten, dass es „damit klarkommt“.
Wenn Sie ständig mehr Speicher verwenden, als Sie haben, müssen Sie mehr Speicher kaufen. Wenn Tausende von Prozessen um Festplattenzeit konkurrieren, um Daten zu lesen oder zu schreiben, müssen Sie die Last auf mehrere Maschinen oder Laufwerke verteilen.
In Ihrer anderen Situation mit 10.000 aktiven Prozessen besteht Ihr Problem sowohl aus Konflikten als auch aus unrealistischen Erwartungen.
Ein Problem ist, dass „Nettigkeit“ nicht unbedingt immer eine niedrigere Priorität hat. Es hängt vom Scheduler des Betriebssystems ab und das Hinzufügen von immer mehr Prozessen kann sich tatsächlich negativ auf ein faires und nützliches System auswirken, da Sie letztendlich die Zeit reduzieren, die einem bestimmten Prozess zugewiesen wird.
Sehen Sie sich diese Frage von unserer Unix-Schwesterseite anWie funktioniert Nice?die den Completely Fair Scheduler beschreibt:
Das CFS hat eine Ziellatenz für die Planungsdauer. Kleinere Ziellatenzen führen zu besserer Interaktivität, aber mit abnehmender Ziellatenz steigt der Switching-Overhead und verringert somit den Gesamtdurchsatz.
...
Betrachten wir nun zwei Prozesse, einen mit einer Niceness von 0 (Standard), den anderen mit einer Niceness von 5. Der proportionale Unterschied zwischen den entsprechenden Gewichtungen beträgt ungefähr 1/3, was bedeutet, dass der Prozess mit der höheren Priorität ein Zeitfenster von ungefähr 15 Millisekunden erhält, während der Prozess mit der niedrigeren Priorität ein Zeitfenster von 5 Millisekunden erhält.
Unter diesem Scheduler bedeutet Nettigkeit, dass Ihre 10.000 Prozessesollenweniger Zeit bekommen, aber aufgrund der schieren Anzahl von ihnen erreichen Sie möglicherweise die untere Grenze des Zeitscheibenwerts für eine „faire“ Planung und das bedeutet, dass niemand eine ausreichend große Zeitscheibe bekommt. Sie könnten sogar eine Grenze erreichen, bei der das Ziehen von Aufgaben auf oder von den CPUs zeitlich dominiert.
Dies ist praktisch dasselbe wie Festplattenkonflikte. Sie zwingen Ihr System dazu, mehr Zeit mit dem Wechseln zwischen Prozessen zu verbringen, als nützliche Zeit mit der Arbeit an einem bestimmten Prozess zu verbringen.
Mehr Informationen zum Scheduler finden Sie unterhttp://man7.org/linux/man-pages/man7/sched.7.html
Durch die Verwendung einer sinnvolleren Anzahl von Prozessen (100 bis 200) wird eine angemessene Zeitaufteilung zwischen Betriebssystemaufgaben und Ihren Prozessen erreicht.
Anstatt 10.000 Aufgaben auf einmal zu beginnen, sollten Sie neue beginnen, wenn alte abgeschlossen sind.