2015-04-16 15 views
15

Ich versuche, eine harte Grenze in der CPU-Nutzung für einen DD-Befehl setzen. Ich habe die folgende Einheit Datei erstelltVerwendung von CPUQuota in systemd

[Unit] 
Description=Virtual Distributed Ethernet 

[Service] 
ExecStart=/usr/bin/ddcommand 
CPUQuota=10% 

[Install] 
WantedBy=multi-user.target 

, die die folgenden einfachen Skript aufrufen

#!/bin/sh 
dd if=/dev/zero of=/dev/null bs=1024k 

Wie ich in diesem Handbuch gesehen haben: http://www.freedesktop.org/software/systemd/man/systemd.resource-control.html Die CPU-Auslastung für meine dd Dienst sollte nicht die 10 überschreiten %. Aber wenn ich den Befehl system-cgtop benutze, beträgt die Auslastung etwa 70-75%.

Irgendwelche Ideen von was mache ich falsch und wie kann ich es beheben?

P.S. Wenn ich systemctl show dd ausführen bekomme ich die folgenden Ergebnisse in Bezug auf CPU

CPUShares=18446744073709551615 
StartupCPUShares=18446744073709551615 
CPUQuotaPerSecUSec=100ms 
LimitCPU=18446744073709551615 
+0

Nicht sagen, das ist Off-Topic per se, aber Sie können mehr Glück mit diesem auf Sysadmin-fokussierte Schwester Seite [ServerFault] (http://serverfault.com/). – mattdm

+0

Danke ich werde es auch dort versuchen. – SteveGr2015

+0

Haben Sie Glück dabei? – sydraz

Antwort

-1

Impliziert "CPUAccounting = true" So sollte es

[Service] 
ExecStart=/usr/bin/ddcommand 
CPUAccounting=true 
CPUQuota=10% 
+5

* Impliziert * bedeutet, dass 'CPUAccounting = true' implizit gesetzt ist und nicht explizit gesetzt werden muss. – buschtoens

0

Alternative Möglichkeiten, um CPU-Auslastung zu begrenzen: 1. Verwenden Sie taskset Befehl. 2. Verwenden Sie Kontrollgruppen. 3. Verwenden Sie docker und begrenzen Sie die CPU-Auslastung mit cpuset. 4. Verringern Sie die Anzahl der Threads in der Anwendung. Bei diesem Ansatz ist eine gewisse Berechnung erforderlich.

1

Eine andere Sache, die Sie versuchen könnten, ist cpulimit als Daemon ausführen. Ich habe das nicht getestet; Es ist nur eine Idee.

Es ist in den ubuntu repos:

sudo apt install cpulimit 

Verwenden systemd wenn Sie möchten. Dies sollte alle Instanzen von dd auf 20% CPU begrenzen.

[Unit] 
Description=dd CPU Limiter 

[Service] 
ExecStart=/usr/bin/cpulimit -e dd -l 20 

[Install] 
WantedBy=multi-user.target 

source

-1

Die Option "CPUQuota =" ist abhängig von der Anzahl der CPUs auf dem System, da es sicherstellt, dass die ausgeführten Prozesse nie auf ONE CPU mehr als die% CPU-Zeit erhalten; und ich denke, CPU-Auslastung%, die Sie mit dem Cmd-System erhalten d -cgtop ist auf allen CPUs des Systems.

0

ich auf https://unix.stackexchange.com/questions/213903/linux-cgroups-limit-cpu-usage-in-absolute-values-which-do-not-depend-on-cpu-spe

gegeben über eine andere gültige Antwort versehentlich lief Wenn Sie eine harte Grenze für CPU-Bandbreite möchten, können Sie cpu.cfs_quota_us und cpu.cfs_period_us verwenden. Aus den CFS-Dokumenten des Kernels:

Die für eine Gruppe zulässige Bandbreite wird mithilfe eines Kontingents und einer Periode angegeben. Innerhalb jeder vorgegebenen "Periode" (Mikrosekunden) darf eine Gruppe nur bis zu "quota" Mikrosekunden CPU-Zeit verbrauchen. Wenn der CPU-Bandbreitenverbrauch einer Gruppe diesen Grenzwert (für diesen Zeitraum) überschreitet, werden die zu seiner Hierarchie gehörenden Tasks gedrosselt und dürfen erst in der nächsten Periode erneut ausgeführt werden.