
Ich habe ein Skript, das einen großen, CPU- und speicherintensiven Prozessbaum startet. Dort unten gibt es Python und ausführbare Dateien, aber alles beginnt mit einem einzelnen Bash-Skript und Python-Unterprozessen.
Während der Ausführung wird der Rest des Systems vollständig lahmgelegt. Ich habe versucht, das Problem zu mildern
$ nice -n10 ionice -c2 ./Script.sh
, aber das reicht nicht aus – der verwendete Computer ist sehr langsam (tatsächlich handelt es sich hier um einen Entwicklungsdesktop, aber das Problem auf dem angegebenen Server wird analog dasselbe sein).
Ich vermute, dass das Problem bei Prozessen liegt, die zu viel Speicher verwenden – alles wird ausgelagert und wird träge.
Gibt es eine Möglichkeit, die Priorität eines Prozesses (und seiner rekursiven untergeordneten Prozesse) beim Zugriff auf den physischen Speicher zu senken? Ich bevorzuge, dass dies langsamer im Hintergrund geschieht und nur begrenzten Einfluss auf andere Aufgaben hat.
Antwort1
Sie können das „Tempo“ der Speichernutzung nicht begrenzen, aber Sie können die gesamte Speichernutzung über verschiedene Mechanismen begrenzen.
1) Sicherheitslimits Begrenzen Sie die Speichernutzung für Benutzer, die den Prozess über /etc/security/limits.conf ausführen. Dies funktioniert in Ihrem Fall möglicherweise nicht, wenn Sie diesen Prozess als derselbe Benutzer ausführen, der an anderen Dingen arbeitet.
Beispiel:
username hard as 1000000
2) Kontrollgruppen Sie können - mit cgroups - eine Gruppe erstellen und auch die Speichernutzung begrenzen. Erstellen Sie einfach eine cgroup wie folgt:
# cat >> /etc/cgconfig.conf << EOF
group memlimit {
memory {
memory.limit_in_bytes = 1073741824;
}
}
EOF
# cat >> /etc/cgrules.conf <<EOF
username memory memlimit/
EOF
Natürlich müssen Sie in beiden Fällen Ihr Programm so entwickeln, dass es sich von einem Fehler bei der Zuweisung von mehr Speicher erholen kann.
Falls dies nicht möglich ist, müssen Sie Ihrem System einfach mehr Speicher hinzufügen, damit Sie das Swapping vermeiden können. Sobald das Swapping beginnt, liegt es in den Händen des Kernels, und Sie können beispielsweise die Priorität von kswapd nicht senken, und selbst wenn Sie könnten, garantiert dies nicht, dass einige der von Ihnen verwendeten Programme nicht trotzdem ausgelagert werden, was zu einer noch langsameren Systemreaktion führen würde. Tun Sie das einfach nicht.
Antwort2
Das Folgende hilft Ihnen zwar nicht beim Speicherauslagern, sollte Ihnen aber hinsichtlich der IO-Auswirkungen Ihres Prozesses weiterhelfen.
Es scheint, dass Sie dies level
auch explizit festlegen sollten.
ionice -c2 -n5 ./slowscript.sh
Abhängig von Ihrem Kernel reicht C2 allein möglicherweise nicht aus.
Zitat aus der Manpage ( man ionice
)
Note that before kernel 2.6.26 a process that has not asked for an I/O priority formally uses "none" as scheduling class, but the I/O scheduler will treat such
processes as if it were in the best-effort class. The priority within the best-effort class will be dynamically derived from the CPU nice level of the process:
io_priority = (cpu_nice + 20) / 5.
For kernels after 2.6.26 with the CFQ I/O scheduler, a process that has not asked for an I/O priority inherits its CPU scheduling class. The I/O priority is
derived from the CPU nice level of the process (same as before kernel 2.6.26).
Grundsätzlich gilt: Jeder neu gestartete Prozess erhält C2 N4, wenn Sie also die IO so weit wie möglich reduzieren möchten, gehen Sie entweder nur in den Leerlauf (C3) oder in den C2 N7.