Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
Guia de Gerenciamento de Recursos
Gerenciando recursos de sistema no Red Hat Enterprise Linux 6
Edição 1
Resumo
Capítulo 1. Introdução ao Grupos de Controle (Cgroups)
cgconfig
(“control group config ”) pode ser configurado para iniciar no momento do boot e restabelecer seus cgroups pré definidos, fazendo-os persistentes através de reboots.
1.1. Como os Grupos de Controle são Organizados
O Modelo de Processo do Linux
init
, que é executado pelo kernel no momento de boot e inicia todos os outros processos (que por sua vez iniciam seus próprios processos filhos). Por causa que todos os processos descendem de um pai único, o modelo de processamento do Linux é uma hierarquia única, ou árvore.
init
herdam o ambiente (tal como a variável PATH) [1] e outros certos atributos (tal como abrir arquivos descritores) de seu processo pai.
O Modelo Cgroup
- eles seguem uma hierarquia, e
- Os cgroups filhos herdam certos atributos de seus cgroups pais.
Subsistemas Disponíveis no Red Hat Enterprise Linux
blkio
— este subsistema define limites de acesso de entrada/saída para e a partir de dispositivos de bloco tais como drives físicos (disco, estado sólido, USB, etc).cpu
— este subsistema usa o agendador para fornecer acesso às tarefas de cgroups para o CPU.cpuacct
— este subsistema gera relatórios automáticos nos recursos de CPU usados pelas tarefas em um cgroup.cpuset
— este subsistema atribui CPUs individuais (em sistema multicore) e nós de memória para atribuir em um cgroup.devices
— este subsistema permite ou nega acesso aos dispositivos por tarefas em um cgroup.freezer
— este subsistema suspende ou retoma tarefas em um cgroup.memory
— este subsistema define limites no uso de memória pelas tarefas em um cgroup e gera relatórios automáticos nos recursos de memória usados por essas tarefas.net_cls
— este subsistema marca os pacotes de rede com um identificador de classe (classid) que permite que o controlador de tráfego do Linux (tc) identifique os pacotes que originam de um cgroup em particular.ns
— o subsistema do namespace.
Nota
1.2. Relacionamento Entre Subsistemas, Hierarquias, Grupos de Controle e Tarefas
Qualquer subsistema único (tal como cpu
) pode ser conectado no máximo a uma hierarquia.
cpu
nunca pode ser anexado à duas hierarquias diferentes.
Uma hierarquia única pode ter um ou mais subsistemas anexados a ele.
cpu
e memory
(ou qualquer número de subsistemas) podem ser anexados a uma única hierarquia, desde que cada uma não está anexada a qualquer outra hierarquia.
Cada vez que uma nova hierarquia é criada nos sistemas, todas as tarefas no sistema são inicialmente membros do cgroup padrão desta hierarquia, que é conhecido como root cgroup. Para qualquer hierarquia única que você criar, cada tarefa do sistema pode ser um membro de exatamente um cgroup nessa hierarquia. Uma tarefa única pode estar em múltiplos cgroups, desde que cada um desses cgroups está em uma hierarquia diferente. Tão logo que uma tarefa é feita um membro de um segundo cgroup na mesma hierarquia é removido do primeiro cgroup dessa hierarquia. Nunca uma tarefa estará em dois cgroups diferentes na mesma hierarquia.
cpu
e memory
estiverem anexados à uma hierarquia chamada cpu_and_mem
, e o subsistema net_cls
estiver anexado a uma hierarquia chamada net
, então um processo em execução httpd
poderia ser um membro de qualquer um cgroup no cpu_and_mem
, e qualquer um cgroup no net
.
cpu_and_mem
de que o processo httpd
é um membro, poderá restringir seu tempo de CPU para a metade desse tempo alocado para outros processos e limitar seu uso de memória para um máximo de 1024
MB. Além disso, o cgroup em net
de que é um membro poderá limitar sua taxa de transmissão para 30
megabytes por segundo.
Qualquer processo (tarefa) no sistema que se divide cria um processo filho (tarefa). A tarefa filho automaticamente se torna membro de todos os cgroups de que seu pai é membro. A tarefa filho pode então ser movida para cgroups diferentes conforme necessitado, mas inicialmente sempre herda os cgroups (o "ambiente" dos cgroups na terminologia do processo) das tarefas de seu pai.
httpd
que é um membro do cgroup chamado half_cpu_1gb_max
na hierarquia cpu_and_mem
e um membro do cgroup trans_rate_30
na hierarquia net
. Quando o processo httpd
se divide, seu processo filho automaticamente se torna um membro do cgroup half_cpu_1gb_max
e do cgroup trans_rate_30
. Ele herda os mesmos cgroups exatos que as tarefas de seu pai pertencem.
1.3. Implicações para o Gerenciamento de Recursos
- Pelo motivo que uma tarefa pode pertencer a somente um cgroup único em qualquer hierarquia, há somente uma maneira que uma tarefa pode ser limitada ou afetada por qualquer subsistema único. Isto é lógico: um recurso, não uma limitação.
- Você pode agrupar diversos subsistemas juntos para que então eles afetem todas as tarefas em uma hierarquia única. Por causa que os cgroups nessa hierarquia possuem diferentes parâmetros definidos, estas tarefas serão afetadas diferentemente.
- Pode ser necessário as vezes refazer uma hierarquia. Um exemplo seria remover um subsistema de uma hierarquia que possui diversos subsistemas anexados, e anexando-os a uma nova e separada hierarquia.
- Reciprocamente, se a necessidade para dividir subsistemas entre hierarquias separadas é reduzido, você pode remover uma hierarquia e anexar seus subsistemas a um já existente.
- A estrutura permite um uso de cgroup simples, tal como definir poucos parâmetros para tarefas especificas em uma hierarquia única, tal como uma com apenas os subsistemas de cpu e memória anexados.
- A estrutura também pode permitir uma configuração altamente específica: cada tarefa (processo) em um sistema pode ser um membro de cada hierarquia, cada qual possui um subsistema único anexado. Tal configuração daria ao administrador de sistemas controle absoluto sobre todos os parâmetros para cada tarefa única.
Capítulo 2. Usando Grupos de Controle
Nota
~]# yum install libcgroup
2.1. O Serviço cgconfig
cgconfig
instalado com o pacote libcgroup fornece uma maneira conveniente para criar hierarquias, anexar subsistemas à hierarquias e gerenciar cgroups com essas hierarquias. Nós recomendamos que você use o cgconfig para gerenciar hierarquias e cgroups no seu sistema.
cgconfig
não é iniciado por padrão no Red Hat Enterprise Linux 6. Quando você inicia o serviço com chkconfig
, ele lê o arquivo de configuração — /etc/cgconfig.conf
. Os cgroups são portanto recriados de sessão para sessão e se tornam persistentes. Dependendo dos conteúdos do arquivo de configuração, o cgconfig pode criar hierarquias, montar sistemas de arquivos necessários, criar cgroups e definir parâmetros de subsistemas para cada grupo.
/etc/cgconfig.conf
instalado com o pacote libcgroup cria e monta uma hierarquia individual para cada subsistema e anexa os subsistemas à estas hierarquias.
cgconfig
(com o comando service cgconfig stop
), ele desmonta todas as hierarquias que montou.
2.1.1. O Arquivo cgconfig.conf
/etc/cgconfig.conf
contém dois tipos principais de entrada — mount e group. As entradas do Mount criam e montam hierarquias como sistemas de arquivos virtuais, e anexam subsistemas àquelas hierarquias. Entradas Mount são definidas usando a seguinte sintaxe:
mount { <controller> = <path>; … }
Exemplo 2.1. Criando entradas mount
cpuset
:
mount { cpuset = /cgroup/cpu; }
~]#mkdir /cgroup/cpu
~]#mount -t cgroup -o cpu cpu /cgroup/cpu
group <name> {
[<permissions>]
<controller> {
<param name> = <param value>;
…
}
…
}
permissions
é opcional. Para definir permissões para uma entrada de grupo, use a seguinte sintaxe:
perm { task { uid = <task user>; gid = <task group>; } admin { uid = <admin name>; gid = <admin group>; } }
Exemplo 2.2. Criando uma entrada group
sqladmin
para adicionar tarefas ao cgroup e ao usuário root
para modificar parâmetros de subsistemas:
group daemons/sql { perm { task { uid = root; gid = sqladmin; } admin { uid = root; gid = root; } } cpu { cpu.shares = 100; } }
~]#mkdir -p /cgroup/cpu/daemons/sql
~]#chown root:root /cgroup/cpu/daemons/sql/*
~]#chown root:sqladmin /cgroup/cpu/daemons/sql/tasks
~]#echo 100 > /cgroup/cpu/daemons/sql/cpu.shares
Nota
cgconfig
para as mudanças no /etc/cgconfig.conf
terem efeito:
~]# service cgconfig restart
/etc/cgconfig.conf
. Os simbolos hash ('#
') no início de cada linha comentam aquela linha e a torna invisível ao serviço cgconfig.
2.2. Criando uma Hierarquia e Anexando Subsistemas
Atenção
cgconfig
) estes comandos falharão a menos que você primeiro desmonte hierarquias existentes, que afetarão a operação do sistema. Não experimente estas instruções em sistemas em produção.
mount
do arquivo /etc/cgconfig.conf
como root. Entradas na seção mount
possuem o seguinte formato:
subsystem = /cgroup/hierarchy;
cgconfig
iniciar da próxima vez, ele criará a hierarquia e anexará subsistemas a ele.
cpu_and_mem
e anexa os subsistemas cpu
, cpuset
, cpuacct
, e memory
a ele.
mount { cpuset = /cgroup/cpu_and_mem; cpu = /cgroup/cpu_and_mem; cpuacct = /cgroup/cpu_and_mem; memory = /cgroup/cpu_and_mem; }
Método alternativo
~]# mkdir /cgroup/name
~]# mkdir /cgroup/cpu_and_mem
mount
para montar a hierarquia e simultâneamente anexar um ou mais subsistema. Por exemplo:
~]# mount -t cgroup -o subsystems name /cgroup/name
Exemplo 2.3. Usando o comando mount para anexar subsistemas
/cgroup/cpu_and_mem
já existe, que servirá como o ponto de montagem para a hierarquia que foi criamos. Anexaremos os subsistemas cpu
, cpuset
e memory
a uma hierarquia que chamamos cpu_and_mem
, e mount
a hierarquia cpu_and_mem
em /cgroup/cpu_and_mem
:
~]# mount -t cgroup -o cpu,cpuset,memory cpu_and_mem /cgroup/cpu_and_mem
lssubsys
[3]:
~]# lssubsys -am
cpu,cpuset,memory /cgroup/cpu_and_mem
net_cls
ns
cpuacct
devices
freezer
blkio
- os subsistemas
cpu
,cpuset
andmemory
estão anexados à hierarquia montada em/cgroup/cpu_and_mem
, e - os subsistemas
net_cls
,ns
,cpuacct
,devices
,freezer
eblkio
não estão ainda anexados a qualquer hierarquia, conforme ilustrado pela falta de um ponto de montagem correspondente.
2.3. Anexando e Desanexando Subsistemas de uma Hierarquia Existente
mount
do arquivo /etc/cgconfig.conf
como root, usando a mesma sintaxe descrita em Seção 2.2, “Criando uma Hierarquia e Anexando Subsistemas”. Quando cgconfig
iniciar da próxima vez, ele reorganizará o subsistema de acordo às hierarquias que você especificar.
Método alternativo
mount
, junto com a opção remount
.
Exemplo 2.4. Remontando uma hierarquia para adicionar um subsistema
lssubsys
mostra os subsistemas cpu
, cpuset
, e memory
anexados à hierarquia cpu_and_mem
:
~]# lssubsys -am
cpu,cpuset,memory /cgroup/cpu_and_mem
net_cls
ns
cpuacct
devices
freezer
blkio
cpu_and_mem
, usando a opção remount
e incluindo o cpuacct
na lista de subsistemas:
~]# mount -t cgroup -o remount,cpu,cpuset,cpuacct,memory cpu_and_mem /cgroup/cpu_and_mem
lssubsys
agora mostra o cpuacct
anexado à hierarquia cpu_and_mem
:
~]# lssubsys -am
cpu,cpuacct,cpuset,memory /cgroup/cpu_and_mem
net_cls
ns
devices
freezer
blkio
cpuacct
, simplesmente remonte-o omita-o:
~]# mount -t cgroup -o remount,cpu,cpuset,memory cpu_and_mem /cgroup/cpu_and_mem
2.4. Desmontando uma Hierarquia
umount
:
~]# umount /cgroup/name
~]# umount /cgroup/cpu_and_mem
cgclear
que pode desativar uma hierarquia mesmo quando ela não está vazia — consulte Seção 2.11, “Descarregando Grupos de Controles”.
2.5. Criando Grupos de Controle
cgcreate
para criar cgroups. A sintaxe para o cgcreate
é: cgcreate -t
uid:gid -a
uid:gid -g subsystems:path
, onde:
-t
(opcional) — especifica um usuário (por ID, uid) e um grupo (por ID de grupo) para ter propriedade do pseudofiletasks
para este cgroup. Este usuário pode adicionar ou remover tarefas a partir do cgroup.Nota
Note que a única maneira para remover uma tarefa a partir de um cgroup é move-lo para um cgroup diferente. Para mover uma tarefa, o usuário deve ter acesso de escrita ao cgroup de destino; acesso de escrita ao cgroup fonte não é importante nesse caso.-a
(opcional) — especifica um usuário (por ID de usuário, uid) e um grupo (por ID de grupo, gid) para possuir todos os pseudofiles a não ser otasks
para este cgroup. Este usuário pode modificar o acesso que as tarefas neste cgroup possuem para recursos de sistema.-g
— especifica a hierarquia na qual o cgroup deve ser criado, como uma lista separada por vírgulas dos subsistemas com essas hierarquias. Se os subsistemas nesta lista estão em hierarquias diferentes, o grupo é criado em cada uma dessas hierarquias. A lista de hierarquias é seguida por dois pontos e o caminho ao grupo filho relativo à hierarquia. Não inclua o ponto de montagem da hierarquia no caminho.Por exemplo, o cgroup localizado no diretório/cgroup/cpu_and_mem/lab1/
é chamada apenaslab1
— seu caminho já está unicamente determinado porque não há, no máximo, uma hierarquia para um determinado subsistema. Note que também o grupo é controlado por todos os subsistemas que existem nas hierarquias na qual o cgroup é criado, mesmo que estes subsistemas não foram especificados no comandocgcreate
— consulte Exemplo 2.5, “uso do cgcreate”.
Exemplo 2.5. uso do cgcreate
cpu
e memory
são montados juntos à hierarquia cpu_and_mem
e o controlador net_cls
é montado em uma hierarquia separada chamada net
. Agora, executaremos:
~]# cgcreate -g cpu,net_cls:/test-subgroup
cgcreate
cria dois grupos chamados test-subgroup
, um na hierarquia cpu_and_mem
e um na hierarquia net
. O grupo test-subgroup
na hierarquia cpu_and_mem
é controlado pelo subsistema memory
, mesmo que nós não especificamos ele no comando cgcreate
.
Método alternativo
mkdir
:
~]# mkdir /cgroup/hierarchy/name/child_name
~]# mkdir /cgroup/cpuset/lab1/group1
2.6. Removendo Grupos de Controle
cgdelete
, que possui uma sintaxe similar ao cgcreate
. Execute: cgdelete subsystems:path
, onde:
- subsystems é uma lista separada por vírgulas de subsistemas.
- path é o caminho para o cgroup relativo ao root da hierarquia.
~]# cgdelete cpu,net_cls:/test-subgroup
cgdelete
pode também remover recursivamente todos os subgrupos com a opção -r
.
2.7. Definindo Parâmetros
cgset
de uma conta de usuário com permissão para modificar o cgroup relevante. Por exemplo, se o /cgroup/cpuset/group1
existe, especifique os CPUs aos quais este grupo tem acesso com o seguinte comando:
cpuset]# cgset -r cpuset.cpus=0-1 group1
cgset
é: cgset -r
parameter=value path_to_cgroup
, onde:
- parameter é o parâmetro a ser definido, que corresponde ao arquivo no diretório ao cgroup dado.
- value é o valor para o parâmetro
- O path_to_cgroup é o caminho para o cgroup relativo ao root da hierarquia. Por exemplo, para definir o parâmetro ao grupo root (se o
/cgroup/cpuacct/
existe), execute:cpuacct]#
cgset -r cpuacct.usage=0 /
Alternativamente, por causa que o.
é relativo ao grupo root (que é, o próprio grupo root) você pode também executar:cpuacct]#
cgset -r cpuacct.usage=0 .
Note, entretanto que a/
é a sintaxe preferida.Nota
Somente um número pequeno de parâmetros podem ser definidos para o grupo root (tal como o parâmetrocpuacct.usage
mostrado nos exemplos acima). Isto é porque um grupo root possui propriedade sobre todos os recursos existentes, portanto, não faria sentido limitar todos os processos existentes definindo certos parâmetros, por exemplo o parâmetrocpuset.cpu
.Para definir o parâmetro dogroup1
, que é um subgroup de grupo root, execute:cpuacct]#
cgset -r cpuacct.usage=0 group1
A barra no final do nome do grupo (por exemplocpuacct.usage=0 group1/
) é opcional.
cgset
pode depender de valores maiores ajustados em uma determinada hierarquia. Por exemplo, se o group1
é limitado para usar somente o CPU 0 em um sistema, você não pode definir o group1/subgroup1
para usar os CPUs 0 e 1 ou usar somente o CPU 1.
cgset
para copiar os parâmetros de um cgroup para outro cgroup existente. Por exemplo:
~]# cgset --copy-from group1/ group2/
cgset
é: cgset --copy-from
path_to_source_cgroup path_to_target_cgroup
, onde:
- path_to_source_cgroup é o caminho ao cgroup cujos parâmetros devem ser copiados, relativos ao grupo root da hierarquia.
- path_to_target_cgroup é o caminho ao cgroup de destino, relativo ao grupo root da hierarquia
Método alternativo
echo
. Por exemplo, este comando insere o valor 0-1
ao pseudofile cpuset.cpus
do cgroup group1
:
~]# echo 0-1 > /cgroup/cpuset/group1/cpuset.cpus
2.8. Movendo um Processo para um Grupo de Controle
cgclassify
:
~]# cgclassify -g cpu,memory:group1 1701
cgclassify
é: cgclassify -g
subsystems:path_to_cgroup pidlist
, onde:
- subsystems é uma lista separada por vírgula de subsistemas ou
*
para iniciar o processo nas hierarquias associadas com todos os subsistemas disponíveis. Note que se os cgroups do mesmo nome existirem um múltiplas hierarquias, a opção-g
move os processos em cada um desses grupos. Certifique-se que o cgroup exista dentro de cada uma das hierarquias cujos subsistemas você especifica aqui. - path_to_cgroup é o caminho para o cgrupo dentro de sua hierarquia
- pidlist é uma lista separada por espaços do process identifier (PIDs)
--sticky
antes do pid para manter qualquer processo filho no mesmo cgroup. Se você não definir esta opção e o daemon cgred estiver rodando, os processos filhos serão alocados aos cgroups baseados nas configurações encontradas em /etc/cgrules.conf
. O próprio processo, no entanto, ficará no grupo de controle no qual você iniciou.
cgclassify
, você poderá mover diversos processos simultaneamente. Por exemplo, este comando muda os processos com PIDs 1701
e 1138
para o cgroup group1/
:
~]# cgclassify -g cpu,memory:group1 1701 1138
Método alternativo
tasks
do cgroup. Por exemplo, para mover um processo com o PID 1701
para um cgroup em /cgroup/lab1/group1/
:
~]# echo 1701 > /cgroup/lab1/group1/tasks
2.8.1. O Daemon cgred
/etc/cgrules.conf
. Entradas no arquivo /etc/cgrules.conf
podem tomar uma ou duas formas:
- user hierarchies control_group
- user:command hierarchies control_group
maria devices /usergroup/staff
maria
acessará o subsistema de dispositivos de acordo com os parâmetros especificados no cgroup /usergroup/staff
. Para associar comandos específicos aos cgroups específicos, adicione o parâmetro command como se segue:
maria:ftp devices /usergroup/staff/ftp
maria
usa o comando ftp
, o processo é automaticamente movido ao cgroup /usergroup/staff/ftp
na hierarquia que contém o subsistema devices
. Note, entretanto, que o daemon move o processo ao cgroup somente depois que a condição apropriada é cumprida. Portanto, o processo ftp
poderá rodar por um curto período no grupo incorreto. Além disso, se o processo rapidamente gera filhos enquanto no grupo incorreto, estes filhos não poderão ser movidos.
/etc/cgrules.conf
podem incluir a seguinte nota extra:
@
— quando pré-fixado para user, indica um grupo ao invés de um usuário individual. Por exemplo,@admins
são usuários no grupoadmins
.*
— representa "todos". Por exemplo,*
no camposubsystem
representa todos os subsistemas.%
— representa um item igual ao item na linha acima. Por exemplo:@adminstaff devices /admingroup @labstaff % %
2.9. Iniciando um Processo em um Grupo de Controle
Importante
cpuset
, os parâmetros cpuset.cpus
e cpuset.mems
devem ser definidos para esse cgroup.
cgexec
. Por exemplo, este comando inicia o navegador lynx dentro do cgroup group1
, sujeito às limitações impostas nesse grupo pelo subsistema cpu
:
~]# cgexec -g cpu:group1 lynx http://www.redhat.com
cgexec
is: cgexec -g
subsystems:path_to_cgroup command arguments
, onde:
- subsystems é uma lista de subsistemas separada por vírgulas, ou
*
para iniciar o processo nas hierarquias associadas com todos os subsistemas disponíveis. Note que, como acontece com ocgset
descrito na Seção 2.7, “Definindo Parâmetros”, se os cgroups do mesmo nome existem em múltiplas hierarquias, a opção-g
cria processos em cada um desses grupos. Certifique-se que o cgroup existe dentro de cada das hierarquias cujos subsistemas você especifica aqui. - path_to_cgroup é o caminho para o cgroup relativo à hierarquia.
- command é o comando para executar
- arguments são quaisquer argumentos para o comando
--sticky
antes de command para manter qualquer processo filho no mesmo cgroup. Se você não definir esta opção e o daemon do cgred estiver em execução, os processos filhos serão alocados aos cgroups baseados em configurações encontradas em /etc/cgrules.conf
. O próprio processo, no entanto, ficará no grupo de controle no qual você o iniciou.
Método alternativo
~]#echo $$ > /cgroup/lab1/group1/tasks
lynx
group1
. Portanto, uma maneira melhor ainda seria:
~]# sh -c "echo \$$ > /cgroup/lab1/group1/tasks && lynx"
2.9.1. Iniciando um Serviço em um Grupo de Controle
- usar um arquivo
/etc/sysconfig/servicename
- usar a função
daemon()
do/etc/init.d/functions
para iniciar o serviço
/etc/sysconfig
para incluir uma entrada na forma de CGROUP_DAEMON="subsystem:control_group"
onde subsystem é um subsistema associado à hierarquia específica e control_group é um cgroup nesta hierarquia. Por exemplo:
CGROUP_DAEMON="cpuset:daemons/sql"
2.10. Obtendo informações sobre os Grupos de Controle
2.10.1. Encontrando um Processo
~]$ ps -O cgroup
~]$ cat /proc/PID/cgroup
2.10.2. Encontrando um Subsistema
~]$ cat /proc/cgroups
~]$ lssubsys -m subsystems
lssubsys -m
retorna somente o ponto de montagem de nível superior para cada hierarquia.
2.10.3. Encontrando Hierarquias
/cgroup
. Assumindo que este é o caso de seu sistema, liste ou navegue pelo conteúdo desse diretório para obter uma lista de hierarquias. Se a tree (árvore) estiver instalada no seu sistema, execute-a para obter uma visão geral de todas as hierarquias dos cgroups dentro dela:
~]$ tree /cgroup/
2.10.4. Encontrando Grupos de Controles
~]$ lscgroup
controller:path
. Por exemplo:
~]$ lscgroup cpuset:adminusers
adminusers
na hierarquia a qual o subsistema cpuset
é anexado.
2.10.5. Exibindo Parâmetros dos Grupos de Controles
~]$ cgget -r parameter list_of_cgroups
~]$ cgget -r cpuset.cpus -r memory.limit_in_bytes lab1 lab2
cpuset.cpus
e memory.limit_in_bytes
para cgroups lab1
e lab2
.
~]$ cgget -g cpuset /
2.11. Descarregando Grupos de Controles
Atenção
cgclear
destrói todos os cgroups em todas hierarquias. Se você não possuir estas hierarquias armazenadas em um arquivo de configuração, você não conseguirá reconstruí-las imediatamente.
cgclear
.
Nota
mount
para criar cgroups (ao contrário de cria-los usando o serviço cgconfig
) resulta na criação de uma entrada no arquivo /etc/mtab
(a tabela de sistemas de arquivos montada). Esta mudança é também refletida no arquivo /proc/mounts
. Entretanto, o descarregamento dos cgroups com o comando cgclear
, junto com os outros comandos cgconfig, usa uma interface do kernel direta que não reflete suas mudanças no arquivo /etc/mtab
e somente escreve a nova informação no arquivo /proc/mounts
. Dessa maneira, depois de descarregar os cgroups com o comando cgclear
, os cgroups desmontados podem ainda estar visíveis no arquivo /etc/mtab
e consequentemente, exibido quando o comando mount
é executado. É recomendável consultar o arquivo /proc/mounts
para uma lista precisa de todos os cgroups montados.
2.12. Recursos Adicionais
As páginas man libcgroup
man 1 cgclassify
— o comandocgclassify
é usado para mover tarefas em execução para um ou mais cgroups.man 1 cgclear
— o comandocgclear
é usado para deletar todos os cgroups em uma hierarquia.man 5 cgconfig.conf
— cgroups são definidos no arquivocgconfig.conf
.man 8 cgconfigparser
— o comandocgconfigparser
analisa o arquivocgconfig.conf
e monta hierarquias.man 1 cgcreate
— o comandocgcreate
cria novos grupos nas hierarquias.man 1 cgdelete
— o comandocgdelete
remove determinados cgroups.man 1 cgexec
— o comandocgexec
executa tarefas em cgroups especificados.man 1 cgget
— o comandocgget
exibe parâmetros do cgroup.man 5 cgred.conf
—cgred.conf
é o arquivo de configuração para o serviçocgred
.man 5 cgrules.conf
—cgrules.conf
contém as regras usadas para determinar quando as tarefas pertencem a certos cgroups.man 8 cgrulesengd
— o serviçocgrulesengd
distribui tarefas aos cgroups.man 1 cgset
— o comandocgset
define parâmetros para um cgroup.man 1 lscgroup
— o comandolscgroup
lista os cgroups em uma hierarquia.man 1 lssubsys
— o comando lista as hierarquias contendo os subsistemas especificados.
lssubsys
é um dos utilitários fornecidos pelo pacote libcgroup. Você deve instalar o libcgroup para usa-lo: consulte o Capítulo 2, Usando Grupos de Controle se você não consegue executar o comando lssubsys
.
Capítulo 3. Subsistemas e Parâmetros Ajustáveis
cgroups.txt
na documentação do kernel, instalado no seu sistema em /usr/share/doc/kernel-doc-kernel-version/Documentation/cgroups/
(fornecido pelo pacote kernel-doc). A última versão da documentação do cgroups é também disponível on line em http://www.kernel.org/doc/Documentation/cgroups/cgroups.txt. Note, entretanto que os recursos na última documentação podem não corresponder com aqueles disponíveis no kernel instalado no seu sistema.
cpuset.cpus
é um pseudofile que especifica quais CPUs um cgroup é permitido acessar. Se o /cgroup/cpuset/webserver
é um cgroup para o servidor web que roda um sistema, executamos o seguinte comando:
~]# echo 0,2 > /cgroup/cpuset/webserver/cpuset.cpus
0,2
é escrito no pseudofile cpuset.cpus
e portanto limita quaisquer tarefas de quais os PIDs são listados no /cgroup/cpuset/webserver/tasks
para usar somente a CPU 0 e CPU 2 no sistema.
3.1. blkio
blkio
) controla e monitora o acesso a E/S em dispositivos de bloco por tarefas nos cgroups. Escrever valores em algum desses pseudofiles limita o acesso ou largura de banda e a leitura de valores de alguns desses pseudofiles fornece informações sobre operações de E/S.
- blkio.weight
- especifica a proporção relativa (weight) do acesso do bloco E/S disponível por padrão a um cgroup, na abrangência de
100
a1000
. Este valor é sobrescrito por dispositivos especificos pelo parâmetroblkio.weight_device
. Por exemplo, para atribuir o peso padrão de500
para um cgroup para o acesso aos dispositivos de bloco, execute:echo 500 > blkio.weight
- blkio.weight_device
- especifica a proporção relativa de acesso de E/S (weight) em dispositivos especificos disponíveis a um cgroup, na abrangencia de
100
a1000
. O valor deste parâmetro sobrescreve o valor do parâmetroblkio.weight
para dispositivos especificados. O valores têm o formato maior:menor peso onde o maior e menor são tipos de dispositivos e números de nós especificados no Dispositivos Alocados do Linux, caso contrário conhecido como Lista de Dispositivos Linux e disponíveis a partir de http://www.kernel.org/doc/Documentation/devices.txt. Por exemplo, para atribuir um peso de500
a um cgroup para acessar o/dev/sda
, rode:echo 8:0 500 > blkio.weight_device
Na anotação Dispositivos Alocados do Linux,8:0
representa/dev/sda
. - blkio.time
- reporta o tempo que um cgroup teve acesso E/S a dispositivos especificos. As entradas possuem três campos: major, minor, e time. Major e minor são tipos de dispositivos e números de nós especificados no Dispositivos Alocados do Linux, e time é o período de tempo em milisegundos (ms).
- blkio.sectors
- reporta o número de setores transferidos para ou a partir de dispositivos especificos por um cgroup. As entradas possuem três campos: major, minor, e sectors. Major e minor são os tipos de dispositivos e números de nós especificos no Dispositivos Alocados do Linux, e sectors é o número de setores do disco.
- blkio.io_service_bytes
- reporta o número de bytes transferidos para ou a partir de dispositivos especificos por um cgroup. As entradas têm quatro campos: major, minor, operation, e bytes. Major e minor são tipos de dispositivos e números de nós especificados no Dispositivos Alocados do Linux, operation representa o tipo de operação (
leitura
,escrita
,sync
, ouasync
) e bytes é o número de bytes transferidos. - blkio.io_serviced
- reporta o número de operações de E/S realizadas em dispositivos específicos por um cgroup. As entradas têm quatro campos: major, minor, operation, e bytes. Major e minor são tipos de dispositivos e números de nó especificados no Dispositivos Alocados do Linux, operation representa o tipo de operação (
leitura
,escrita
,sync
, ouasync
) e number representa o número de operações. - blkio.io_service_time
- reporta
- blkio.io_wait_time
- reporta o tempo total das operações de E/S em dispositivos especificos que um cgroup gastou esperando por um serviço nas filas do agendador. Quando você interpretar este relatório, observe:
- O tempo reportado pode ser maior do que o tempo total decorrido, por causa que o tempo reportado é o total cumulativo de todas as operações de E/S para o cgroup em vez do tempo que o próprio cgroup gastou esperando por operações de E/S. Para encontrar o tempo que o cgroup como um todo gastou esperando, uso o
blkio.group_wait_time
. - Se um dispositivo tiver um
queue_depth
> 1, o tempo reportado somente inclui o tempo até que o pedido seja despachado ao dispositivo, não qualquer tempo gasto esperando por um serviço enquanto o dispositivo re ordena os pedidos.
Entradas que possuem quatro campos: major, minor, operation, e bytes. Major e minor são tipos de dispositivos e números de nós especificados no Linux Allocated Devices, operation representa o tipo de operação (leitura
,escrita
,sync
, ouasync
e time é o período de tempo em nanosegundos (ns). O tempo é reportado em nanosegundos em vez de uma unidade maior entao este relatório é significativo mesmo para dispositivos de estado sólido. - blkio.io_merged
- reporta o número de pedidos da BIOS juntados em pedidos de operações de E/S por um cgroup. As entradas possuem dois campos: number e operation. Number é o número de pedidos, e operation representa o tipo de operação (
read
,write
,sync
, ouasync
). - blkio.io_queued
- reporta o número de pedidos enfileirados para operações E/S por um cgroup. As entradas têm dois campos: number e operation. Number é o número de pedidos operation representa o tipo de operação (
read
,write
,sync
, ouasync
). - blkio.avg_queue_size
- reporta o tamanho médio da fila para operações de E/S por um cgroup, sobre período de tempo inteiro para a existência do grupo. O tamanho da fila é amostrado toda vez que uma fila para este cgroup obter um timeslice. Observe que este relatório está disponível somente se
CONFIG_DEBUG_BLK_CGROUP=y
é definido no sistema. - blkio.group_wait_time
- reporta o tempo total (em nanosegundos — ns) que um cgroup gastou esperando por um timeslice para uma de suas filas. O relatório é atualizado toda vez que uma fila deste cgroup obtem um timeslice, então se você ler este pseudofile enquanto o cgroup estiver esperando por um timeslice, o relatório não irá conter o tempo gasto em espera para a operação atualmente enfileirada. Observe que este relatório está disponível somente se o
CONFIG_DEBUG_BLK_CGROUP=y
estiver definido no sistema. - blkio.empty_time
- reporta o tempo total (em nanosegundos — ns) que um cgroup gastou sem qualquer pedidos pendentes. O relatório é atualizado toda vez que uma fila para este cgroup tiver um pedido pendente, então se você ler este pseudofile enquanto o cgroup não tiver pedidos pendentes, o relatório não conterá o tempo gasto no estado vazio. Observe que este relatório está disponível somente se o
CONFIG_DEBUG_BLK_CGROUP=y
estiver definido no sistema. - blkio.idle_time
- reporta o tempo total (em nanosegundos — ns) que o agendador gastou em tempo ocioso por um cgroup em antecipação de um pedido melhor do que os pedidos que já estão em outras fila ou de outros grupos. O relatório é atualizado toda vez que um grupo não está mais em ociosidade, então se você ler este pseudofile enquanto o grupo não está mais em ociosidade, o relatório não conterá o tempo gasto no estado atual de ociosidade. Observe que este relatório está somente disponível so o
CONFIG_DEBUG_BLK_CGROUP=y
estiver definido no sistema. - blkio.dequeue
- relaciona o número de vezes de pedidos para operações de E/S por um cgroup que estavam desenfileirados por dispositivos específicos. As entradas têm três campos: major, minor, e number. Major e minor são tipos de dispositivos e números de nós especificados nos Dispositivos Alocados do Linux, e o number é o número de pedidos que o grupo estava desenfileirados. Note que este relatório é disponível somente se o
CONFIG_DEBUG_BLK_CGROUP=y
estiver definido no sistema. - blkio.reset_stats
- reinicia as estatísticas gravadas nos outros pseudofiles. Escreve um número inteiro para este arquivo para reiniciar as estatísticas para este cgroup.
3.2. cpu
cpu
agenda o acesso de CPU para os cgroups. Acesso aos recursos da CPU podem ser agendados de acordo com os seguintes parâmetros, cada um em um pseudofile separado, dentro de um sistema de arquivo virtual do cgroup:
- cpu.shares
- contém um valor inteiro que especifica uma parte relativa do tempo disponível da CPU para tarefas em um cgroup. Por exemplo, tarefas em dois cgroups que possuem o
cpu.shares
definido para1
receberão tempo de CPU igual, mas as tarefas em um cgroup que possuirem umcpu.shares
definido para2
receberão duas vezes mais tempo de CPU de tarefas em um cgroup do que onde ocpu.shares
estiver definido para1
. - cpu.rt_runtime_us
- especifica um tempo de período em microsegundos (µs, representado aqui como "us") para o mais longo período contínuo das quais as tarefas em um cgroup têm acesso aos recursos de CPU. Ao estabelecer este limite, você evitará que as tarefas em um cgroup monopolizem o tempo de CPU. Se as tarefas em um cgroup precisam acessar os recursos da CPU por 4 segundos a cada 5 segundos, defina o
cpu.rt_runtime_us
para4000000
ecpu.rt_period_us
to5000000
. - cpu.rt_period_us
- especifica um tempo de período em microsegundos (µs, representado aqui como "us") para qual a frequência que um cgroup de controle à um recurso de CPU deve ser realocado. Se as tarefas em um cgroup precisam acessar os recursos da CPU por 4 segundos a cada 5 segundos, defina o
cpu.rt_runtime_us
para4000000
ecpu.rt_period_us
to5000000
.
3.3. cpuacct
cpuacct
gera relatórios automáticos nos recursos de CPU usados pelas tarefas em um cgroup, incluindo tarefas em grupos filhos. Três relatórios estão disponíveis:
- cpuacct.stat
- reporta o número de ciclos de CPU (nas unidades definidas por
USER_HZ
no sistema) consumida por tarefas neste cgroup e seus filhos em ambos modos de usuários e modo (kernel) de sistema. - cpuacct.usage
- reporta o total de tempo de CPU (em nanosegundos) consumidos por todas as tarefas neste cgroup (incluindo tarefas abaixo da hierarquia)
- cpuacct.usage_percpu
- reporta o tempo de CPU (em nanosegundos) consumidos em cada CPU por todas as tarefas neste cgroup (incluindo tarefas menores na hierarquia).
3.4. cpuset
cpuset
atribui CPUs individuais e nós de memória para cgroups. Cada cpuset pode ser especificada de acordo com os seguintes parâmetros, cada um em um pseudofile separado, dentro de um sistema de arquivo virtual de cgroup:
Importante
cpuset
, os parâmetros cpuset.cpus
e cpuset.mems
devem estar definidos para o cgroup.
- cpuset.cpus (obrigatório)
- especifica as CPUs cujas tarefas deste cgroup possuem acesso. Esta é uma lista separada por vírgulas em formato ASCII, com hífens ("
-
") que representam classes. Por exemplo,0-2,16
representa CPUs 0, 1, 2 e 16. - cpuset.mems (obrigatório)
- especifica os nós de memória cujas tarefas neste cgroup possuem acesso. Esta é uma lista separada por vírgulas em formato ASCII, com hífens ("
-
") que representam classes. Por exemplo,0-2,16
representa nós de memória 0,1,2 e 16. - cpuset.memory_migrate
- contém uma sinalização (
0
ou1
) que especifica se a página na memória deve migrar para um novo nó se os valores emcpuset.mems
mudarem. Por padrão, a migração de memória é desabilitada (0
) e a página fica no nó para o qual eles foram alocados originalmente, até mesmo se este nó não for mais um dos nós agora especificados emcpuset.mems
. Se habilitado (1
), o sistema irá migrar páginas para nós de memória dentro dos novos parâmetros especificados pelocpuset.mems
, mantendo sua colocação relativa se possível, por exemplo, páginas no segundo nó na lista especificada inicialmente pelocpuset.mems
será alocada ao segundo nó na lista agora especificada porcpuset.mems
, se este local estiver disponível. - cpuset.cpu_exclusive
- contém um sinalizador (
0
ou1
) que especifica se outras cpusets além desta e seus pais e filhos podem compartilhar as CPUs especificadas para este cpuset. Por padrão o (0
), CPUs não são alocadas exclusivamente à uma cpuset. - cpuset.mem_exclusive
- contém uma sinalização (
0
ou1
) que especifica se outra cpuset pode compartilhar os nós de memória especificaods para este cpuset. Por padrão (0
), os nós de memória não são alocados exclusivamente à uma cpuset. Ao reservar os nós de memória ao uso exclusivo de uma cpuset (1
) é funcionalmente o mesmo que habilitar uma hardwall de memória com ocpuset.mem_hardwall
. - cpuset.mem_hardwall
- contém uma sinalização (
0
ou1
) que especifica se alocações de kernel de página de memória e dados de buffer devem ser restringidos à nós de memórias especificados por esta cpuset. Por padrão (0
), os dados de buffer e página são compartilhados com os processos que pertencem aos usuários múltiplos. Com o hardwall habilitado (1
) cada alocação de usuário de tarefa pode ser mantido separadamente. - cpuset.memory_pressure
- um arquivo de somente leitura que contém uma média de execução de pressão de memória criada por processos neste cpuset. O valor neste pseudofile é automaticamente atualizado quando o
cpuset.memory_pressure_enabled
é habilitado, caso contrário o psedudofile conterá o valor0
. - cpuset.memory_pressure_enabled
- contém uma sinalização (
0
ou1
) que especifica se o sistema deve computar a pressão de memória criada pelos processos neste cgroup. Os valores computados são apresentados emcpuset.memory_pressure
e representam a taxa na qual os processos tentam liberar a memória em uso, reportada como um valor inteiro de tentativas para requerer memória por segundo, multiplicada por 1000. - cpuset.memory_spread_page
- contém uma sinalização (
0
ou1
) que especifica se os buffers de sistema de arquivo devem ser espalhados de maneira igual entre os nós de memória alocados à este cpuset. Por padrão (0
), nenhuma tentativa é feita para espalhar páginas de memória para estes buffers de forma igual, e os buffers são colocados no mesmo nó no qual o processo que o criou estiver rodando. - cpuset.memory_spread_slab
- contém uma sinalização (
0
ou1
) que especifica se o slab do kernel agrupamento de operações de entrada/saída do arquivo, deve ser distribuído igualmente entre as cpuset. Por padrão (0
), não é feita nenhuma tentativa de distribuir caches de slab do kernel igualmente, e os caches de slab são colocados no mesmo nó no qual o processo que o criou estiver rodando. - cpuset.sched_load_balance
- contém uma sinalização (
0
ou1
) que especifica se o kernel irá balancear as cargas nas CPUs neste cpuset. Por default (1
), o kernel balanceia cargas movendo processos de CPUs sobrecarregadas para CPUs menos usadas.Observe, entretanto que definir este sinalizador em um cgroup não possui efeito se o balanceador de carga estiver ativado ou em qualquer cgroup pai, já que o balanceador de carga já está sendo usado em um nível maior. Portanto para desativar o balanceador de carga em um cgroup, desative o balanceador de carga também em cada um de seus pais na hierarquia. Neste caso, você deve também considerar se o balanceador de carga deve estar ativado para quaisquer irmãos no cgroup em questão. - cpuset.sched_relax_domain_level
- contém um inteiro entre
-1
e um valor positivo pequeno, o qual representa a largura da classe da CPUs nos quais o kernel deve tentar balancear cargas. Este valor não é nulo secpuset.sched_load_balance
estiver desabilitada.O efeito preciso deste valor varia de acordo com a arquitetura do sistema, mas os valores seguintes são típicos:Valores de cpuset.sched_relax_domain_levelValor Efeito -1
Usa o valor padrão do sistema para carregar balanceamento 0
Não realiza balanceamento de carga imediata, balanceia cargas somente periódicamente. 1
Balanceia cargas imediatamente em todas as opções no mesmo núcleo. 2
Balanceia cargas imediatamente em núcleos do mesmo pacote 3
Balanceia cargas imediatamente em CPUs do mesmo nó ou blade 4
Balanceia cargas imediatamente em diversas CPUs em arquiteturas com acesso de memória não uniforme (NUMA) 5
Balanceia cargas imediatamente em todas as CPUs em arquiteturas com NUMA.
3.5. devices
devices
permite ou nega acesso aos dispositivos por tarefas em um cgroup.
Importante
devices
) é considerado uma Amostra de Tecnologia no Red Hat Enterprise Linux 6.
- devices.allow
- especifica dispositivos para as quais tarefas em um cgroup possuem acesso. Cada entrada possui quatro campos: type, major, minor, e access. Os valores usados nos campos type, major, e minor correspondem aos tipos de dispositivos e números de nós especificados em Linux Allocated Devices (Dispositivos Alocados do Linux), ou conhecidos como Linux Devices List (Lista de Dispositivos Linux) e disponíveis em http://www.kernel.org/doc/Documentation/devices.txt.
- tipo
- type pode ter um dos seguintes três valores:
a
— se aplica à todos os dispositivos, ambos dispositivos de carácter e dispositivos de blocob
- especifica um dispositivo de blococ
- especifica um dispositivo de carácter.
- maior, menor
- major and minor são números de nós de dispositivos especificados pelo Linux Allocated Devices. Os números major e minor são separados por uma vírgula. Por exemplo,
8
é o número maior (major) que especifica os drives de disco SCSI, e o número menor (minor)1
especifica a primeira partição no primeiro drive de disco do SCSI, portanto o8:1
especifica totalmente esta partição, correspondente ao local de sistema de arquivo do/dev/sda1
.*
substitui todos os nós de dispositivos maiores e menores, por exemplo9:*
(todos os dipositivos do RAID) ou*:*
(todos os dispositivos). - access
- access é a sequência de uma ou mais das seguintes letras:
r
— permite tarefas para ler a partir de um dispositivo especificadow
— permite tarefas para gravar em um dispositivo especificadom
— permite tarefas para criar arquivos de dispositivos que ainda não existem
Por exemplo, quando o access é especificado comor
, as tarefas podem ler somente a partir de dispositivo especificado, mas quando o access é especificado comorw
, ele pode ler ou gravar no dispositivo.
- devices.deny
- especifica dispositivos cujas tarefas em um cgroup não pode acessar. A sintáxe de entradas é idêntica à
devices.allow
. - devices.list
- reporta os dispositivos para os quais os controles de acesso foram definidos para tarefas neste cgroup.
3.6. freezer
freezer
suspende ou retoma tarefas em um cgroup.
- freezer.state
freezer.state
possui três valores possíveis:FROZEN
— tarefas no cgroup são suspendidas.FREEZING
— o sistema está no processo de suspender tarefas no cgroup.THAWED
— tarefas no cgroup foram retomadas.
- Mova o processo para um cgroup em uma hierarquia que possui o subsistema
freezer
anexado a ela. - Congele (freeze) o determinado cgroup para suspender o processo contido nele.
FROZEN
e THAWED
podem ser gravados em freezer.state
, FREEZING
não pode ser gravado, somente lido.
3.7. memory
memory
gera relatórios automáticos sobre recursos de memórias usados pelas tarefas em um cgroups e define limites em uso de memória por estas tarefas:
- memory.stat
- reporta um ampla classe de estatísticas de memória, conforme descrito na tabela:
Tabela 3.1. Valores reportados pela memory.stat
Estatística Descrição cache
cache de página, incluindo tmpfs
(shmem
), em bytesrss
anônimo e cache de troca, não inclui o tmpfs
(shmem
), em bytesmapped_file
tamanho dos arquivos mapeados da memória mapeada, incluindo tmpfs
(shmem
), em bytespgpgin
números de páginas paginadas na memória pgpgout
número de páginas paginadas fora da memória swap
o uso de troca (swap), em bytes active_anon
anônimo e cache de troca (swap) na lista dos usados recentemente (LRU) ativa, incluindo tmpfs
(shmem
), em bytesinactive_anon
anônimo e cache de troca na lista LRU inativa, incluindo o tmpfs
(shmem
), em bytesactive_file
memória de back up de arquivo na lista LRU ativa, em bytes inactive_file
memória de back up de arquivo na lista LRU inativa, em bytes unevictable
memória que não pode ser recuperada, em bytes hierarchical_memory_limit
limite de memória para a hierarquia que contem o cgroup memory
, em byteshierarchical_memsw_limit
memória mais o limite de troca para a hierarquia que contém o cgroup memory
, em bytesAdicionalmente, cada um destes arquivos que não são ohierarchical_memory_limit
e ohierarchical_memsw_limit
possui um duplicado pré fixadototal_
que reporta não somente no cgroup mas também em todos os filhos. Por exemplo, oswap
reporta o uso de troca por um cgroup e ototal_swap
reporta o uso de troca total por um cgroup e todos seus filhos.Quando você interpretar os valores reportados pelomemory.stat
, observe que várias estatísticas são inter relacionadas:active_anon
+inactive_anon
= anonymous memory + file cache fortmpfs
+ swap cachePortanto oactive_anon
+inactive_anon
≠rss
, porque orss
não inclui otmpfs
.active_file
+inactive_file
= cache - size oftmpfs
- memory.usage_in_bytes
- reporta uso de memória atual total pelos processos nos cgroups (em bytes).
- memory.memsw.usage_in_bytes
- reporta a soma do uso atual de memória mais o espaço de troca usado por processos no cgroup (em bytes).
- memory.max_usage_in_bytes
- reporta o máximo de memória usada por processos nos cgroups (em bytes)
- memory.memsw.max_usage_in_bytes
- reporta a quantidade máxima de memória e de espaço troca usados pelos processos no cgroup (em bytes).
- memory.limit_in_bytes
- define a quantia máxima de memória de sistema (incluindo arquivo de cache). Se nenhuma unidade é especificada, o valor é interpretado como bytes. Entretanto, é possível usar sufixos para representar unidades maiores —
k
ouK
para kilobytes,m
ouM
para Megabytes, eg
ouG
para Gigabytes.Você não usar omemory.limit_in_bytes
para limitar o cgroup root; você pode somente aplicar valores nos cgroups abaixo na hierarquia.Digite-1
para omemory.limit_in_bytes
para remover quaisquer limites existentes. - memory.memsw.limit_in_bytes
- define a quantia máxima para a soma de memória e uso de troca. Se nenhuma unidade for especificada, o valor é interpretado como bytes. No entanto, é possível usar sufixos para representar unidades maiores —
k
ouK
para kilobytes,m
ouM
para Megabytes, eg
ouG
para Gigabytes.Você não pode usar omemory.memsw.limit_in_bytes
para limitar o cgrupo root; você pode somente aplicar valores a grupos abaixo na hierarquia.Digite-1
para omemory.memsw.limit_in_bytes
para remover quaisquer limites existentes. - memory.failcnt
- reporta o número de vezes que o limite de memória excedeu o valor definido no
memory.limit_in_bytes
. - memory.memsw.failcnt
- reporta o número de vezes que a memória mais limite de espaço de troca alcançou o valor definido no
memory.memsw.limit_in_bytes
. - memory.force_empty
- quando definido para
0
, esvazia a memória de todas as páginas usadas pelas tarefas neste cgroup. Esta interface pode ser usada somente quando o cgroup não possuir nenhuma tarefa. Se a memória não puder ser liberada, ela é movida para um cgroup pai se possível. Use omemory.force_empty
antes de remover um cgroup para evitar páginas de cache fora de uso para o seu cgroup pai. - memory.swappiness
- define a tendência do kernel para permutar memória de processo usada por tarefas neste cgroup ao invés de requerer páginas do cache de páginas. Esta é a mesma tendência, calculada da mesma forma, que o conjunto em
/proc/sys/vm/swappiness
para o sistema como um todo. O valor padrão é60
. Valores mais baixos do que este diminuirão a tendência do kernel de permutar a memória do processo, e valores maiores que60
aumentam a tendência do kernel de permutar a memória do processo e valores maiores que100
permitem ao kernel permutar páginas que são parte do espaço de endereço dos processos neste cgroup.Observe que o valor0
não previne memória de processo a ser permutada; a permuta ainda acontece quando há escassez de memória do sistema porque o gerenciador lógico de memória virtual global não lê o valor do cgroup. Para bloquear páginas completamente, use omlock()
em vez de grupos.Você não pode mudar a permuta dos seguintes grupos:- o cgroup root, que usa a permuta definida em
/proc/sys/vm/swappiness
. - um cgroup que tem um grupo filho abaixo dele.
- memory.use_hierarchy
- contém um sinalizador (
0
ou1
) que especifica se o uso de memória deve ser contado por toda uma hierarquia de cgroups. Se ativado (1
) o subsistema de memória requererá memória do processo filho que exceda seu limite de memória. Por padrão (o
), o subsistema não requer memória para uma tarefa de um filho.
3.8. net_cls
net_cls
marca os pacotes de rede com um identificador de classe (classid) que permite que o controlador de trafego do Linux (tc) identifique os pacotes que originam de um cgroup em particular. O controlador de trafego pode ser configurado para atribuir prioridades diferentes à pacotes de cgroups diferentes.
- net_cls.classid
net_cls.classid
contém um valor único em formato hexadecimal que indica um controle de trafego handle. Por exemplo,0x100001
representa o handle escrito tradicionalmente como10:1
no formato usado pelo iproute2.O formato desses handles é:0xAAAABBBB
, onde o AAAA é o número maior in hexadecimal e BBBB é o número menor em hexadecimal. você pode omitir os zeros à esquerda;0x10001
é o mesmo que0x00010001
, e representa1:1
.
net_cls
adiciona aos pacotes de rede.
3.9. ns
ns
fornece uma maneira para o grupo processar em namespaces separados. Dentro de um determinado namespace, os processos podem interagir um com outro mas são isolados dos processos rodando em outros namespaces. Estes namespaces separados são as vezes referidos como containers quando usados para virtualização de nível de sistema operacional.
3.10. Recursos Adicionais
Documentação de Subsistemas Específicas do Kernel
/usr/share/doc/kernel-doc-<kernel_version>/Documentation/cgroups/
(fornecido pelo pacote kernel-doc).
blkio
subsystem —blkio-controller.txt
cpuacct
subsystem —cpuacct.txt
cpuset
subsystem —cpusets.txt
devices
subsystem —devices.txt
freezer
subsystem —freezer-subsystem.txt
memory
subsystem —memory.txt
Apêndice A. Histórico de Revisão
Histórico de Revisões | ||||||
---|---|---|---|---|---|---|
Revisão 1-4.400 | 2013-10-31 | Rüdiger Landmann | ||||
| ||||||
Revisão 1-4 | 2012-07-18 | Anthony Towns | ||||
| ||||||
Revisão 1.0-5 | Thu May 19 2011 | Martin Prpič | ||||
| ||||||
Revisão 1.0-4 | Tue Mar 1 2011 | Martin Prpič | ||||
| ||||||
Revisão 1.0-3 | Wed Nov 17 2010 | Rüdiger Landmann | ||||
| ||||||
Revisão 1.0-2 | Thu Nov 11 2010 | Rüdiger Landmann | ||||
| ||||||
Revisão 1.0-1 | Wed Nov 10 2010 | Rüdiger Landmann | ||||
| ||||||
Revisão 1.0-0 | Tue Nov 9 2010 | Rüdiger Landmann | ||||
|