Wir haben einen Computer mit 32 Kernen, auf dem einige Benutzer Programme ausführen können. Gibt es eine Möglichkeit, die Anzahl der Kerne zu beschränken, die jeder Benutzer zu einem bestimmten Zeitpunkt verwenden kann, damit ein Benutzer nicht die gesamte CPU-Leistung monopolisiert?
17
Antworten:
Dies ist zwar möglich , aber kompliziert und mit ziemlicher Sicherheit eine schlechte Idee. Wenn zur Zeit nur ein Benutzer das Gerät verwendet, ist die Beschränkung auf N Kerne eine Verschwendung von Ressourcen. Ein weitaus besserer Ansatz wäre, alles zu betreiben mit
nice
:Dies ist ein großartiges Tool, das die Priorität eines Prozesses festlegt. Wenn also nur ein Benutzer etwas ausführt, erhält er so viel CPU-Zeit, wie er benötigt. Wenn jedoch ein anderer Benutzer seinen eigenen (auch vernünftigen) Job startet, ist er nett und teilt ihn miteinander. Auf diese Weise wird, wenn alle Benutzer Befehle mit ausführen
nice 10 command
, niemand die Ressourcen belasten (und niemand wird den Server in die Knie zwingen).Beachten Sie, dass ein hoher Nizza-Wert eine niedrige Priorität bedeutet. Dies ist ein Maß dafür, wie nett wir sein sollten und je schöner wir sind, desto mehr teilen wir.
Beachten Sie auch, dass dies nicht zur Verwaltung der Speicherzuordnung beiträgt, sondern nur die CPU-Planung beeinflusst. Wenn also mehrere Benutzer mehrere speicherintensive Prozesse starten, haben Sie immer noch ein Problem. Wenn dies ein Problem ist, sollten Sie sich mit geeigneten Warteschlangensystemen wie Drehmoment befassen .
quelle
nice
, was du beschreibst, das ist so ziemlich genau das, was du brauchst.TL; DR : Aus kurzen Recherchen geht hervor, dass es möglich ist, Befehle auf eine bestimmte Anzahl von Kernen zu beschränken. In allen Fällen müssen Sie jedoch einen Befehl verwenden, der die Beschränkung tatsächlich erzwingt.
cgroups
Linux hat,
cgroups
was häufig genau zum Zweck der Einschränkung der Ressourcen verwendet wird, die Prozessen zur Verfügung stehen. Nach einer kurzen Recherche finden Sie im Arch Wiki ein Beispiel mit der folgenden Matlab-Konfiguration (einer wissenschaftlichen Software)/etc/cgconfig.conf
:Damit eine solche Konfiguration wirksam wird, müssen Sie den Prozess über einen
cgexec
Befehl ausführen , z. B. von derselben Wiki-Seite aus:Task-Set
Eine verwandte Frage zu Ask Ubuntu und Wie beschränke ich einen Prozess auf einen CPU-Kern unter Linux? [duplicate] auf der Unix- und Linux-Site zeigt ein Beispiel für die Verwendung
taskset
zur Beschränkung der CPUs für den Prozess. In der ersten Frage wird dies erreicht, indem alle Prozesse für einen bestimmten Benutzer analysiert werdenIn der anderen Frage wird ein Prozess über sich
taskset
selbst gestartet :Fazit
Obwohl es durchaus möglich ist, Prozesse einzuschränken, scheint es nicht so einfach zu sein, dies für bestimmte Benutzer zu erreichen. Das Beispiel in einem verknüpften Ask Ubuntu-Beitrag erfordert ein konsistentes Scannen nach Prozessen, die jedem Benutzer gehören und
taskset
für jeden neuen verwendet werden. Ein weitaus vernünftigerer Ansatz wäre, CPU-intensive Anwendungen wahlweise übercgexec
oder auszuführentaskset
. Es ist auch nicht sinnvoll, alle Prozesse auf eine bestimmte Anzahl von CPUS zu beschränken, insbesondere für diejenigen, die Parallelität und Parallelität verwenden, um ihre Aufgaben schneller auszuführen. Wenn Sie sie auf eine bestimmte Anzahl von CPUs beschränken, kann dies die Verarbeitung verlangsamen. Darüber hinaus ist es, wie Terdons Antwort bereits sagte , eine Verschwendung von RessourcenDas Ausführen ausgewählter Anwendungen über
taskset
odercgexec
erfordert die Kommunikation mit Ihren Benutzern, um ihnen mitzuteilen, welche Anwendungen sie ausführen können, oder das Erstellen von Wrapper-Skripten, mit denen ausgewählte Anwendungen übertasksel
oder gestartet werdencgexec
.Darüber hinaus sollten Sie die Anzahl der Prozesse festlegen, die ein Benutzer oder eine Gruppe erzeugen kann, anstatt die Anzahl der CPUs zu begrenzen. Dies kann über die
/etc/security/limits.conf
Datei erreicht werden .Siehe auch
quelle
sched_setaffinity(2)
sagt die Affinitätsmaske erhält acrossexecve(2)
, und dass ein Kind erbt es auffork(2)
. Wenn Sie also die Shell für einen Benutzer (oder die grafische Shell für eine X-Sitzung) festlegen, wird für alle, die von dieser Shell aus gestartet werden, standardmäßig dieselbe Affinitätsmaske verwendet.