Installa cgconfig in Ubuntu 16.04


13

Voglio creare alcuni gruppi di controllo usando cgroup.

Finora ho fatto quanto segue:

  1. Ho installato alcuni pacchetti:

    sudo apt-get install cgroup-bin cgroup-lite cgroup-tools cgroupfs-mount libcgroup1
    
  2. Quindi ho creato il /etc/cgconfig.conffile con il seguente contenuto:

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

    secondo la guida qui , supponendo, che il file di configurazione risieda nella stessa posizione e usi la stessa sintassi su Ubuntu, come usa su CentOS.

  3. Quindi, secondo quella guida, devo iniziare cgconfig service. Ho provato con:

    sudo service cgconfig restart
    

    Ma oh no! Manca un file !:

    Failed to restart cgconfig.service: Unit cgconfig.service not found.
    
  4. Dopo alcune domande e ricerche, ho provato:

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

Quindi sembra che semplicemente non stia avendo alcun servizio cgconfig sul mio sistema!

L'ho cercato usando:

sudo aptitude search cgconfig

Tuttavia, non cgconfigè necessario trovare.

Come posso installare cgconfigsul mio Ubuntu 16.04?

Risposte:


15

OK, sono riuscito a fare lo stesso che hai fatto, ma con alcune modifiche:

1) Ho installato le stesse utility:

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

2) Ho modificato i file conf in questo modo:

/etc/init/cgroup-lite.conf

description "mount available cgroup filesystems"
author "Serge Hallyn <serge.hallyn@canonical.com>"

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

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

Questo è un esempio, usa il tuo nome utente invece di [utente]. È possibile aggiungere le applicazioni necessarie per limitare e definire se si desidera che siano CPU, memoria o entrambi limitati.

Ho modificato la GRUB_CMDLINE_LINUX_DEFAULTriga in /etc/default/grub:

GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1"

Aggiornamento:

sudo update-grub

3) E infine il riavvio per applicare le modifiche.

Ed è così che ho funzionato. Prima di questo avevo avuto OOM frequenti con il multitasking - con browser al cromo, clementine, testo sublime e altre applicazioni che utilizzavano molte risorse -, ora funzionano senza problemi e posso eseguire il multitasking meglio.

Spero davvero che questo possa aiutare gli altri.

Attualmente sto usando Ubuntu 16.04 LTS con Intel Dual Core 2.6 Ghz e 4 Gb. RAM.


1
Sembra l'approccio giusto, ma invece di usare cgrules.conf, trovo che cgexec sia migliore. Inoltre, penso che tu intendessi nominare il file cgconfig.confe non cgconf.conf. Se systemd sta facendo il suo lavoro, non penso che tu abbia bisogno della mountsezione in questo file.
Segna il

Ho modificato questa risposta seguendo la raccomandazione di Mark, l'ho testata e funziona bene.
Rdrk,

@Mark, sarei interessato alla tua soluzione con cgexec.
Jonathan,

9

Ho affrontato lo stesso problema. Sembra che non ci sia un servizio integrato nelle attuali distribuzioni Ubuntu per caricare i file di configurazione di cgroup.

Troverai alcuni script (spezzati?) Di esempio in / usr / share / doc / cgroup-tools / esempi / cgconfig e / usr / share / doc / cgroup-tools / esempi / cgred .

Per caricare manualmente i file di configurazione che è possibile utilizzare

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

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

Come soluzione per un uomo povero, mi sono scritto uno script init che carica entrambi i file all'avvio del sistema.

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

Salvare questo file su /etc/init.d/cgconf e installarlo utilizzando

# 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.