Instalar cgconfig en Ubuntu 16.04

13

Quiero crear algunos grupos de control usando cgroup.

Hasta ahora he hecho lo siguiente:

  1. Instalé algunos paquetes:

    sudo apt-get install cgroup-bin cgroup-lite cgroup-tools cgroupfs-mount libcgroup1
    
  2. Luego creé el /etc/cgconfig.confarchivo con el siguiente contenido:

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

    de acuerdo con la guía aquí , suponiendo que el archivo de configuración reside en la misma ubicación y usa la misma sintaxis en Ubuntu, como en CentOS.

  3. Entonces, de acuerdo con esa guía, necesito iniciar el cgconfig service. Lo intenté con:

    sudo service cgconfig restart
    

    ¡Pero no! Falta un archivo !:

    Failed to restart cgconfig.service: Unit cgconfig.service not found.
    
  4. Después de preguntarme y buscar, intenté:

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

¡Parece que simplemente no tengo ningún servicio cgconfig en mi sistema!

Lo busqué usando:

sudo aptitude search cgconfig

Sin embargo, no cgconfigse encuentra.

¿Cómo puedo instalar cgconfigen mi Ubuntu 16.04?

Zelphir Kaltstahl
fuente

Respuestas:

15

OK, logré hacer lo mismo que tú, pero con algunos cambios:

1) Instalé las mismas utilidades:

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

2) Edité archivos conf como este:

/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

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

Ese es un ejemplo, use su nombre de usuario en lugar de [usuario]. Puede agregar las aplicaciones que necesita limitar y definir si desea que estén limitadas por CPU, memoria o ambas.

Edité la GRUB_CMDLINE_LINUX_DEFAULTlínea en /etc/default/grub:

GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1"

Actualizándolo:

sudo update-grub

3) Y finalmente reiniciar para aplicar los cambios.

Y así es como tengo esto funcionando. Antes de esto, tenía OOM frecuentes con multitarea, con navegador de cromo, clementina, texto sublime y otras aplicaciones que usan muchos recursos, ahora funcionan sin problemas y puedo realizar múltiples tareas mejor.

Realmente espero que esto pueda ayudar a otros.

Actualmente utiliza Ubuntu 16.04 LTS con Intel Dual Core 2.6 Ghz y 4 Gb. RAM.

Rdrk
fuente
1
Esto se siente como el enfoque correcto, pero en lugar de usar cgrules.conf, encuentro que cgexec es mejor. Además, creo que querías nombrar el archivo cgconfig.confy no cgconf.conf. Si systemd está haciendo su trabajo, no creo que necesite la mountsección en este archivo.
Mark
Edité esta respuesta siguiendo la recomendación de Mark, la probé y funciona bien.
Rdrk
@ Mark, estaría interesado en su solución cgexec.
Jonathan
9

Me enfrenté al mismo problema. Parece que no hay un servicio integrado en las distribuciones actuales de Ubuntu para cargar archivos de configuración de cgroup.

Encontrará algunos scripts de inicio de ejemplo (¿rotos?) En / usr / share / doc / cgroup-tools / examples / cgconfig y / usr / share / doc / cgroup-tools / examples / cgred .

Para cargar manualmente los archivos de configuración, puede usar

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

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

Como solución de un hombre pobre, escribí un script de inicio que carga ambos archivos al iniciar el 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 $?

Guarde este archivo en /etc/init.d/cgconf e instálelo usando

# 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.
fuente