Zainstaluj cgconfig w Ubuntu 16.04

13

Chcę utworzyć niektóre grupy kontrolne za pomocą cgroup.

Do tej pory zrobiłem następujące:

  1. Zainstalowałem kilka pakietów:

    sudo apt-get install cgroup-bin cgroup-lite cgroup-tools cgroupfs-mount libcgroup1
    
  2. Następnie utworzyłem /etc/cgconfig.confplik o następującej treści:

    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;
      }
    }
    

    zgodnie z przewodnikiem tutaj , zakładając, że plik konfiguracyjny znajduje się w tej samej lokalizacji i używa tej samej składni na Ubuntu, jak na CentOS.

  3. Następnie zgodnie z tym przewodnikiem muszę rozpocząć cgconfig service. Próbowałem z:

    sudo service cgconfig restart
    

    Ale nie! Brakuje pliku !:

    Failed to restart cgconfig.service: Unit cgconfig.service not found.
    
  4. Po zastanowieniu i rozglądaniu się, próbowałem:

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

Wygląda więc na to, że po prostu nie mam żadnej usługi cgconfig w moim systemie!

Szukałem go za pomocą:

sudo aptitude search cgconfig

Jednak nie cgconfigmożna go znaleźć.

Jak mogę zainstalować cgconfigna moim Ubuntu 16.04?

Zelphir Kaltstahl
źródło

Odpowiedzi:

15

OK, udało mi się zrobić to samo co ty, ale z pewnymi zmianami:

1) Zainstalowałem te same narzędzia:

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

2) Edytowałem pliki conf takie jak to:

/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

I /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

To jest przykład, użyj swojej nazwy użytkownika zamiast [użytkownik]. Możesz dodać aplikacje, które chcesz ograniczyć, i określić, czy chcesz, aby były ograniczone procesor, pamięć lub oba.

Edytowałem GRUB_CMDLINE_LINUX_DEFAULTlinię w /etc/default/grub:

GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1"

Aktualizacja:

sudo update-grub

3) I wreszcie zrestartowanie w celu zastosowania zmian.

I tak to działa. Wcześniej miałem częste OOMy z wielozadaniowością - z przeglądarką chromową, klementyną, wysublimowanym tekstem i innymi aplikacjami używającymi dużej ilości zasobów - teraz działają one płynnie i mogę lepiej wykonywać wiele zadań jednocześnie.

Naprawdę mam nadzieję, że może to pomóc innym.

Obecnie używa Ubuntu 16.04 LTS z Intel Dual Core 2.6 Ghz i 4 Gb. BARAN.

Rdrk
źródło
1
To wydaje się właściwe podejście, ale zamiast używać cgrules.conf, uważam, że cgexec jest lepszy. Myślę też, że chciałeś nazwać ten plik, cgconfig.confa nie cgconf.conf. Jeśli systemd wykonuje swoją pracę, nie sądzę, że potrzebujesz mountsekcji w tym pliku.
Mark
Zredagowałem tę odpowiedź zgodnie z zaleceniami Marka, przetestowałem ją i działa dobrze.
Rdrk
@ Mark, byłbym zainteresowany twoim rozwiązaniem cgexec.
Jonathan
9

Napotkałem ten sam problem. Wygląda na to, że w obecnych dystrybucjach Ubuntu nie ma wbudowanej usługi do ładowania plików konfiguracyjnych cgroup.

Niektóre (zepsute?) Przykładowe skrypty inicjujące można znaleźć w / usr / share / doc / cgroup-tools / przykladach / cgconfig i / usr / share / doc / cgroup-tools / przykladach / cgred .

Aby ręcznie załadować pliki konfiguracyjne, których możesz użyć

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

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

Jako rozwiązanie dla biednego człowieka napisałem sobie skrypt inicjujący, który ładuje oba pliki podczas uruchamiania systemu.

#!/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 $?

Zapisz ten plik na /etc/init.d/cgconf i zainstaluj go za pomocą

# 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
Sebastian T.
źródło