Installieren Sie cgconfig in Ubuntu 16.04

13

Ich möchte einige Kontrollgruppen mit erstellen cgroup.

Bisher habe ich folgendes gemacht:

  1. Ich habe einige Pakete installiert:

    sudo apt-get install cgroup-bin cgroup-lite cgroup-tools cgroupfs-mount libcgroup1
    
  2. Dann habe ich die /etc/cgconfig.confDatei mit folgendem Inhalt erstellt:

    mount {
      cpuset  = /cgroup/cpuset;
      cpu     = /cgroup/cpu;
      cpuacct = /cgroup/cpuacct;
      memory  = /cgroup/memory;
      devices = /cgroup/devices;
      freezer = /cgroup/freezer;
      net_cls = /cgroup/net_cls;
      ns      = /cgroup/ns;
      blkio   = /cgroup/blkio;
    }
    
    group limitcpu{
      cpu {
        cpu.shares = 400;
      }
    }
    
    group limitmem{
      memory {
        memory.limit_in_bytes = 512m;
      }
    }
    
    group limitio{
      blkio {
        blkio.throttle.read_bps_device = "252:0         2097152";
      }
    }
    
    group browsers{
      cpu {
        cpu.shares = 200;
      }
      memory {
        memory.limit_in_bytes = 128m;
      }
    }
    

    nach der Führung hier , unter der Annahme, dass die Konfigurationsdatei befindet sich an der gleichen Stelle und die gleiche Syntax auf Ubuntu verwendet, wie es auf CentOS verwendet.

  3. Dann muss ich laut dieser Anleitung das starten cgconfig service. Ich habe versucht mit:

    sudo service cgconfig restart
    

    Aber oh nein! Eine Datei fehlt !:

    Failed to restart cgconfig.service: Unit cgconfig.service not found.
    
  4. Nach einigem Nachdenken und Suchen versuchte ich:

    ● cgconfig.service
       Loaded: not-found (Reason: No such file or directory)
       Active: inactive (dead)
    

Es scheint also, dass ich einfach keinen cgconfig-Dienst auf meinem System habe!

Ich habe danach gesucht mit:

sudo aptitude search cgconfig

Es ist jedoch keine cgconfigzu finden.

Wie kann ich cgconfigauf meinem Ubuntu 16.04 installieren ?

Zelphir Kaltstahl
quelle

Antworten:

15

OK, ich habe es geschafft, dasselbe zu tun, aber mit einigen Änderungen:

1) Ich habe die gleichen Dienstprogramme installiert:

sudo apt-get install cgroup-bin cgroup-lite cgroup-tools cgroupfs-mount libcgroup1

2) Ich habe Conf-Dateien wie folgt bearbeitet:

/etc/init/cgroup-lite.conf

description "mount available cgroup filesystems"
author "Serge Hallyn <[email protected]>"

start on mounted MOUNTPOINT=/sys/fs/cgroup

pre-start script
test -x /bin/cgroups-mount || { stop; exit 0; }
test -d /sys/fs/cgroup || { stop; exit 0; }
/bin/cgroups-mount
cgconfigparser -l /etc/cgconfig.conf
end script

post-stop script
if [ -x /bin/cgroups-umount ]
then
    /bin/cgroups-umount
fi
end script

/etc/cgconfig.conf

# Since systemd is working well, this section may not be necessary.
# Uncomment if you need it
#
# mount {
# cpuacct = /cgroup/cpuacct;
# memory = /cgroup/memory;
# devices = /cgroup/devices;
# freezer = /cgroup/freezer;
# net_cls = /cgroup/net_cls;
# blkio = /cgroup/blkio;
# cpuset = /cgroup/cpuset;
# cpu = /cgroup/cpu;
# }

group limitcpu{
  cpu {
    cpu.shares = 400;
  }
}

group limitmem{
  memory {
    memory.limit_in_bytes = 512m;
  }
}

group limitio{
  blkio {
    blkio.throttle.read_bps_device = "252:0         2097152";
  }
}

group browsers {
    cpu {
#       Set the relative share of CPU resources equal to 25%
    cpu.shares = "256";
}
memory {
#       Allocate at most 512M of memory to tasks
        memory.limit_in_bytes = "512m";
#       Apply a soft limit of 512 MB to tasks
        memory.soft_limit_in_bytes = "384m";
    }
}

group media-players {
    cpu {
#       Set the relative share of CPU resources equal to 25%
        cpu.shares = "256";
    }
    memory {
#       Allocate at most 256M of memory to tasks
        memory.limit_in_bytes = "256m";
#       Apply a soft limit of 196 MB to tasks
        memory.soft_limit_in_bytes = "128m";
    }
}

cgconfigparser -l /etc/cgconfig.conf

Und /etc/cgrules.conf

user:process                                         subsystems   group
[user]:/usr/lib/chromium-browser/chromium-browser   cpu,memory      browsers
[user]:/usr/bin/clementine                        cpu,memory     media-players

Verwenden Sie in diesem Beispiel Ihren Benutzernamen anstelle von [Benutzer]. Sie können die Anwendungen hinzufügen, die Sie begrenzen möchten, und definieren, ob sie CPU-, Speicher- oder beides-begrenzt sein sollen.

Ich habe die GRUB_CMDLINE_LINUX_DEFAULTZeile bearbeitet in /etc/default/grub:

GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1"

Aktualisiere es:

sudo update-grub

3) Und schließlich Neustart, um die Änderungen zu übernehmen.

Und so habe ich es geschafft. Früher hatte ich häufig OOMs mit Multitasking - mit Chrom-Browser, Clementine, erhabenem Text und anderen Anwendungen, die viele Ressourcen verbrauchen - jetzt laufen sie reibungslos und ich kann besser multitasking.

Ich hoffe wirklich, dass dies anderen helfen kann.

Derzeit wird Ubuntu 16.04 LTS mit Intel Dual Core 2.6 Ghz und 4 Gb verwendet. RAM.

Rdrk
quelle
1
Dies scheint der richtige Ansatz zu sein, aber anstatt cgrules.conf zu verwenden, finde ich cgexec besser. Ich denke, Sie wollten die Datei benennen cgconfig.confund nicht cgconf.conf. Wenn systemd seine Arbeit macht, glaube ich nicht, dass Sie den mountAbschnitt in dieser Datei benötigen .
Mark
Ich habe diese Antwort nach Marks Empfehlung bearbeitet, getestet und funktioniert gut.
Rdrk
@Mark, ich würde mich für deine Lösung mit interessieren cgexec.
Jonathan
9

Ich stand vor dem gleichen Problem. Es sieht so aus, als ob es in aktuellen Ubuntu-Distributionen keinen integrierten Dienst zum Laden von Konfigurationsdateien für cgroup gibt.

Sie finden einige (defekte?) Beispiel-Init-Skripte unter / usr / share / doc / cgroup-tools / examples / cgconfig und / usr / share / doc / cgroup-tools / examples / cgred .

Zum manuellen Laden der Konfigurationsdateien, die Sie verwenden können

# Loads /etc/cgconfig.conf 
cgconfigparser -l /etc/cgconfig.conf

# Loads /etc/cgrules.conf
cgrulesengd -vvv --logfile=/var/log/cgrulesengd.log

Als Lösung für einen armen Mann habe ich mir ein Init-Skript geschrieben, das beide Dateien beim Systemstart lädt.

#!/bin/sh
### BEGIN INIT INFO
# Provides:          cgconf
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Should-Start:
# Should-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Configures CGroups
### END INIT INFO

start_service() {
  if is_running; then
    echo "cgrulesengd is running already!"
    return 1
  else
    echo "Processing /etc/cgconfig.conf..."
    cgconfigparser -l /etc/cgconfig.conf
    echo "Processing /etc/cgrules.conf..."
    cgrulesengd -vvv --logfile=/var/log/cgrulesengd.log
    return 0
  fi
}

stop_service() {
  if is_running; then
    echo "Stopping cgrulesengd..."
    pkill cgrulesengd
  else
    echo "cgrulesengd is not running!"
    return 1
  fi
}

status() {
  if pgrep cgrulesengd > /dev/null; then
    echo "cgrulesengd is running"
    return 0
  else
    echo "cgrulesengd is not running!"
    return 3
  fi
}

is_running() {
  status >/dev/null 2>&1
}

case "${1:-}" in
  start)
    start_service
    ;;
  stop)
    stop_service
    ;;
  status)
    status
    ;;
  *)
    echo "Usage: /etc/init.d/cgconf {start|stop|restart|status}"
    exit 2
    ;;
esac

exit $?

Speichern Sie diese Datei unter /etc/init.d/cgconf und installieren Sie sie mit

# make the script executable
chmod 755 /etc/init.d/cgconf

# register the service
update-rc.d cgconf defaults

# start the service
service cgconf start

# check the status
service cgconf status
Sebthom
quelle