Wie kann die Ressourcennutzung begrenzt werden, um CPU + RAM für einen bestimmten Prozess zu sparen?

25

Ich habe einen Entwickler-Server, auf dem sshdmanchmal nicht mehr funktioniert, weil der Computer keinen RAM mehr hat. Ja, der Arbeitsspeicher geht zur Neige, und ein Upgrade ist derzeit nicht möglich. Ich möchte dem Computer sagen: "Tun Sie, was immer Sie wollen, aber lassen Sie 20 MB und etwas CPU weg sshd!".

Wie geht das?

phunehehe
quelle
Sshd sollte nicht so explodieren, es ist normalerweise ein sehr gut funktionierender Daemon. Stellen Sie sicher, dass es auf den neuesten Stand gebracht ist. Was machst du damit? Leiten Sie massive Daten durch?
Marcin
2
@Marcin Ich glaube nicht, dass ich etwas Großes mache, Textbearbeitung. Selbst wenn sshdes sich gut verhält, würde es wohl hängen bleiben, wenn nicht genügend CPU / RAM zur Verfügung stünde, oder?
Phunehehe
Wenn Linux keinen Speicher mehr hat, bricht es Prozesse ab, um Speicherplatz freizugeben. Möglicherweise sehen Sie OOM in Aktion (Out-of-Memory-Killer). Ich weiß nicht, warum es sich entscheiden sollte, Ihren SSHD konsequent zu töten. Haben Sie schon einmal gesehen, dass sshd schrecklich leckt (an Größe zunimmt), bevor es explodiert, oder funktioniert es in einem Moment einwandfrei und ist im nächsten tot?
Marcin
@Marcin Wenn er OOM ist, ist das System so festgefahren, dass er einfach nicht reagieren kann, es ist kein Problem mit sshd, sondern ein Problem mit seiner Last. Leider kenne ich die Antwort darauf nicht.
Xenoterracide
@phunehehe bist du sicher, dass das problem kein speicher für ssh ist und deine last nicht durch das dach geht? gibt sshd fehler? Was ist die Last auf der Box? und was bewirkt, dass dem System der Speicher ausgeht.
Xenoterracide

Antworten:

9

Sie können wahrscheinlich so etwas erreichen, indem Sie cgroups mit dem Memory Resource Controller verwenden .

Ich vermute, Sie würden alle Ihre ressourcenintensiven Aufgaben in eine begrenzte (CPU & RAM) cgroupund sshd"außerhalb" lassen, damit es nicht eingeschränkt wird.

(Das Hinzufügen weiterer Auslagerungsdateien, auch in Form einer Auslagerungsdatei, kann jedoch eine gute Option sein.)

Matte
quelle
Ich zögere immer noch, es sieht nicht einfach aus (von Ubuntu verwöhnt).
Phunehehe
oh es ist sicherlich nicht einfach :-) Swap hinzuzufügen ist bei weitem einfacher.
Mat
@phunehehe Willkommen als Sys Admin, es ist nicht einfach. Aber jetzt muss man lernen, wie man keine einfachen Sachen macht.
Xenoterracid
6

Oh, aber cgroups sind einfach :) Installieren Sie das libcgroup-Paket. Erstellen Sie eine /etc/cgconfig.conf:

mount {
    cpu     = /cgroup/cpu_and_mem;
    cpuacct = /cgroup/cpu_and_mem;
    memory  = /cgroup/cpu_and_mem;
}

group sshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

group nosshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

Starten Sie den cgconfigProzess, der die Hierarchie und die Gruppen erstellt, und legen Sie die Grenzen fest. Wenn dies gelingt, verfügen Sie über zwei Gruppen, denen jeweils 50% der CPU zugewiesen sind, und 1 GB Arbeitsspeicher (Sie wissen nicht, wie viel Arbeitsspeicher tatsächlich zur Verfügung steht; in diesem Beispiel sind es 2 GB). Jetzt müssen Sie nur noch alle Aufgaben (dh alle auf dem System laufenden Prozesse) aus der Stammgruppe in die nosshd cgroup verschieben:

cgroup]# cat tasks >> nosshd/tasks
cgroup]# echo > tasks

Dann müssen Sie nur noch die PID des sshdProzesses abrufen und diese in die sshd-Aufgabendatei verschieben:

cgroup]# echo $PID >> sshd/tasks

Ta-da, du bist fertig. Sie können jetzt sicher sein, dass sshd immer über 50% der CPU und 1 GB Arbeitsspeicher verfügt.

mart1n
quelle
1

Verwenden Sie renicediese Option , um eine höhere Priorität für sshddie Buchhaltung zu erhalten oder die Buchhaltung zu überprüfen. (acct) -> hiermit kannst du ressourcen für benutzer einstellen, also starte sshd mit s

MSpike
quelle
Ich würde das auch ergänzen ioniceund wahrscheinlich sshd damit beginnen, es später nicht wieder aufzugeben.
Xenoterracide
1

Eine allgemeinere Lösung für das Problem der Nutzung von Anwendungsressourcen besteht darin, Ihre Anwendungen mit Docker in einem Container auszuführen . Sie können dann Container mit CPU- und Speicherbeschränkungen ausführen, die denen von cgroups ähneln.

docker run -c=10 -m=1g my-container
Sean Fujiwara
quelle