Capítulo 3. Subsistemas e Parâmetros Ajustáveis
Subsistemas são módulos do kernel que estão atentos aos cgroups. Geralmente, são controladores de recursos que alocam diferentes níveis de recursos de sistema à diferentes cgroups. No entanto, os subsistemas podem ser programados por qualquer outra interação com o kernel onde existe a necessidade de tratar diferentes grupos de processos de maneiras diferentes. O application programming interface (API), para desenvolver os novos subsistemas, é documentado em
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.
Os state objects (objetos de estado) que contém os parâmetros de subsistemas para um cgroup, são representados como pseudofiles dentro de sistema de arquivos virtuais do cgroup. Estes pseudofiles podem ser manipulados pelo terminal ou suas chamadas de sistema equivalentes. Por exemplo o
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
O valor
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
O subsistema Bloco E/S (
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.