You are on page 1of 3

Gerenciamento de recursos com cgroups | REDES

Gerenciamento de recursos com cgroups

Esteja no

REDES
comando
O novo cgroups oferece uma abordagem administrativa
para a restrio do uso de recursos. uma ferramenta
muito importante para uso em sistemas virtualizados.
por Ralf Spenneberg

H
alguns anos atrs, dei aulas voc restrinja os recursos usados por que voc verifique se a hierarquia foi
de Linux em um fornecedor um cliente virtual ou d preferncia criada corretamente (listagem 2). Voc
de servios de tecnologia de para que algumas mquinas utilizem pode ento criar seu grupo de controle
larga escala. Os administradores da determinados recursos. O cgroups com o comando cgcreate:
empresa tinham muita experincia permite que o administrador defina
cgcreate -g blkio:/dd
com variantes comerciais do Unix, esses parmetros para subsistemas es-
como HP-UX, e me perguntaram pecficos para esses processos e todos O comando na listagem 3 diz quais
como poderiam implementar ge- os seus processos-filhos. Um subsis- parmetros esto disponveis para o
renciamento de recursos e controles tema poderia ser um controlador de subsistema Block I/O.
no Linux. Como um administrador recursos que gerencie a quantidade O kernel 2.6.36 tambm supor-
poderia restringir a suada quantidade de memria RAM disponvel. ta as opes blkio.throttle.*. Isso
de memria RAM disponvel para um Para usar o cgroups, primeiro significa que voc pode restringir o
nico processo ou grupo de processos? necessrio definir uma hierar- mximo de largura de banda de E/S
Preciso admitir que naquele tem- quia na qual os grupos sero geren- para operaes de leitura e escrita
po o Linux no oferecia esse recurso. ciados. Para tanto, edite o arquivo por um grupo de processo.
Mas em 2006, Rohit Seth iniciou o /etc/cgconfig.conf, cujo exemplo Para testar isso, voc precisa dos
desenvolvimento desse recurso, de pode ser observado na listagem 1. nmeros mximos e mnimos do dis-
forma que administradores do kernel Se esse arquivo no existir, ins- positivo no qual esto sendo aplicadas
2.6.24 pudessem us-lo. Originalmente talar o pacote @cgroup. O aplicativo as restries. Se for /dev/sda1, voc
chamado de process containers control cria uma hierarquia separada para pode verificar os valores mnimo e
groups (cgroups para abreviar) [1], a cada subsistema e ento possvel mximo com um simples ls:
ferramenta pode restringir, enumerar definir seu cgroups em seguida. A
(para propsitos de cobrana) e isolar hierarquia /cgroup/cpu permite que # ls -l /dev/sda1
brw-rw-. 1 root disk 8, 1 10.
recursos (como memria RAM, CPU voc administre compartilhamento Oct 08:32 /dev/sda1
e entrada e sada de dados I/O). de CPU enquanto /cgroup/net_cls
Embora muitos administradores cuida do desempenho da entrada e Aqui, veja que esses nmeros so 8
no precisem usar esse recurso em sada (E/S) de dados da rede. e 1. Para restringir a largura de banda
um servidor padro, o cgroups Ao iniciar o daemon cgconfig, criam- do grupo de controle para 1 mbps,
muito interessante em ambientes -se os diretrios e monta-se o sistema de execute o comando cg-set ou sim-
baseados em KVM, pois permite que arquivos cgroups. O lssybsys permite plesmente use o comando:

Linux Magazine #92 | Julho de 2012 69


REDES | Gerenciamento de recursos com cgroups

echo "8:1 1048576" > cgexec -g blkio:dd "dd O novo cgroups ser exibido
/cgroup/blkio/dd/blkio. if=/dev/zero of=/tmp/test" como subdiretrio e herdar as pro-
throttle.write_bps_device
priedades do grupo de controle-pai.
E ento use o comando dd para caso voc queira iniciar um processo Todos os cgroups-filhos ento com-
um teste: diretamente em um grupo especfico. petem pelos recursos atribudos para
o cgroups-pai.
dd if=/dev/zero of=/tmp/test
& pid=$! Automao Se o cgroup-pai tiver permisso
Atribuir processos a grupos manu- de escrever apenas a 1Mbps, todos
Inicialmente, execute o processo almente pode ser cansativo, alm os grupos-filhos no podero exce-
dd na raiz do cgroup, que no tem de ser passvel de erros. Faz muito der esse valor.
restries. Voc pode fazer um tes- mais sentido deixar essa tarefa para Embora os recursos sejam atri-
te usando um SIGUSR1 no processo: o daemon cgrulesengd, que o faz de budos de forma hierrquica, essas
forma automtica. Para permitir que hierarquias no funcionam para o
# kill -USR1 $pid
578804+0 records in isso acontea, o servio precisa ter controlador blkio. Todos os outros
578804+0 records out o arquivo /etc/cgrules.cong, que diz controladores so compatveis com
296347648 bytes (296 MB) a ele qual processo pertence a qual essa hierarquia.
copied, 7.00803 s, 42.3 MB/s
usurio e deve ser atribudo a qual
Para migrar esse processo para o grupo de controle. O arquivo tem Virtualizao
cgroup dd, use o comando echo: uma sintaxe bem simples: Onde faz sentido implementar o
cgroups? Alguns aplicativos especiais
# echo $pid > <usuario>[:<processo>]
/cgroups/blkio/dd/tasks <controladores> <destino> se beneficiaro do cgroups no traba-
lho dirio, mas, na maioria dos casos,
Agora, quando enviar um sinal Usando o exemplo com o co- faz mais sentido deixar que o kernel
USR1 para o dd, voc ver que a largura mando dd, a regra se pareceria com Linux gerencie sozinho esses recur-
de banda cai drasticamente porque a linha abaixo: sos em vez de estabelecer limites. No
o processo no tem a permisso de entanto, se voc implementa uma
*:dd blkio /dd
escrever com uma banda maior do soluo de virtualizao como KVM,
que 1 mbps. Em vez de restringir a O comando acima adiciona os na qual pode virtualizar diversos hs-
largura de banda mxima, possvel processos dd pertencentes a todos pedes em um nico host, a utilidade
priorizar a largura de banda entre gru- os usurios do grupo de controle de restringir, priorizar e medir o uso
pos com o uso do parmetro blkio. /dd no controlador de recursos blkio. dos recursos pode ser muito til. O
weight=. O valor padro 500, ento, cgroups oferece uma abordagem
caso voc d a um grupo o valor de Hierarquias ideal para implementar isso.
1000, ele teria o dobro de largura de At agora, passamos apenas por grupos Voc precisar gerenciar a virtu-
banda para acesso aos dispositivos do de controle individuais e isolados. No alizao por meio das bibliotecas
bloco em relao aos outros grupos. entanto, possvel criar hierarquias de Libvirt e contineres LXS, ou usar o
Em vez de usar o comando echo, grupos e adicionar mais estruturas es- QEMU/KVM. O daemon libvirtd
voc poderia atribuir processos para pecficas. Para ser mais preciso, voc cria um cgroup separado com o nome
grupos usando o comando cgclassify. pode criar cgroups adicionais dentro de do cliente para cada servidor que for
Alm disso, tamb possvel utilizar um grupo de controle, como se faz no iniciado. O grupo existe na hierarquia
o comando cgexec desta forma: comando cgreate -g blkio:/dd/user1. de libvirtd/qemu|lxc/guest para cada

Listagem 1: /etc/cgconfig.conf Listagem 2: lssubsys Listagem 3: Subsistema


01 mount { 01 # lssubsys -am Block I/O
02 cpuset = /cgroup/cpuset; 02 cpuset /cgroup/cpuset 01 # cgget -g blkio /dd
03 cpu = /cgroup/cpu; 02 /dd:
03 cpu /cgroup/cpu
04 cpuacct = /cgroup/cpuacct; 03 blkio.reset_stats=
05 memory = /cgroup/memory; 04 cpuacct /cgroup/cpuacct
05 memory /cgroup/memory 04 blkio.io_queued=Total 0
06 devices = /cgroup/devices; 05 blkio.io_merged=Total 0
07 freezer = /cgroup/freezer; 06 devices /cgroup/devices
06 blkio.io_wait_time=Total 0
08 net_cls = /cgroup/net_cls; 07 freezer /cgroup/freezer
07 blkio.io_service_time=Total 0
09 ns = /cgroup/ns; 08 net_cls /cgroup/net_cls 08 blkio.io_serviced=Total 0
10 blkio = /cgroup/blkio; 09 ns /cgroup/ns 09 blkio.io_service_bytes=Total 0
11 } 10 blkio /cgroup/blkio 10 ...

70 www.linuxmagazine.com.br
Gerenciamento de recursos com cgroups | REDES

controlador. A partir disso, ser poss- Se quiser cobrar pelo tempo usado O comando cgexec facilita essa
vel gerenciar e priorizar os recursos por cada cliente individualmente, use tarefa; inicia o processo no cgroup e
individualmente para cada cliente. o controlador CPUAcct. Ele conta o tem- quaisquer processos-filhos e threads
Para permitir que o cliente use po de CPU realmente usado por cada podem herdar as caractersticas
o dobro de tempo de CPU, voc cliente em nanossegundos em e arma- do grupo.
precisar modificar o controlador zena esses valores no arquivo /cgroup/
da CPU (cpu.shares). Para atingir cpuacct/libvirt/qemu/guest/cpuacct. Concluso
seu objetivo, mude somente o valor Infelizmente, somente as mais re-
padro de 1024 para 2048. Voc pode Processos centes distribuies Linux suportam
usar uma abordagem similar para a O recorte que fizemos da imple- cgroups. Recursos individuais esto
configurao de RAM ou largura de mentao do cgroup funciona com disponveis somente nos kernels
banda. Para tanto, use o controlador base em threads (tarefas enfileiradas mais recentes. Em outras palavras,
de memria ou o controlador net_cls para execuo). Cada thread em um os administradores precisam conferir
em combinao com o comando tc. processo pode ser gerenciada em quais propriedades podem usar na
Perceba que voc precisaria da va- um cgroup separado, sendo que isso distribuio que esto utilizando.
riante mais recente do Libvirt para precisa ser lembrado na hora da atri- Mas aps fazer isso, o cgroups ofe-
suportar o controlador net_cls. Esse buio dos processos para o cgroups rece inmeros recursos poderosos,
controlador diferente de todos os com o comando echo aps inici-los. principalmente para ambientes
outros controladores porque confi- Voc precisa atribuir todas as threads virtualizados, controle de proces-
gura somente uma classID e ento em execuo (/proc/pid/task/) para sos e gerenciamento de recursos
espera que o administrador gerencie o cgroups correspondente. de clientes.
a largura de banda com o comando
tc (quadro 1). Quadro 1: Gerenciamento de banda
Note que no possvel utilizar o Se um processo monitorado pelo controlador net_cls, possvel atribuir
controlador blkio com a Libvirt atu- uma classID para todos os processos no cgroup. Voc pode ento usar o tc
almente, pois ele no suporta as hie- com o grupo. Inicie ao definir a classID para o cgroup:
rarquias que o Libvirtd precisa criar. echo 0x00100001 > /cgroup/net_cls/libvirt/qemu/guest/net_cls.classid
Os desenvolvedores do kernel j esto Esse nmero hexadecimal possui dois blocos: 0xAAAABBBB, no qual os dgitos
trabalhando em uma soluo [2]. AAAA definem os maiores nmeros da classID e os dgitos BBBB definem os me-
nores nmeros. No h necessidade de preencher com zeros. Para usar a clas-
Mais informaes sID, necessrio instalar um agendador de tarefas baseado em classe (qdisc)
na placa de rede por onde saem os dados (como, por exemplo, eth0). O agen-
[1] Cgroups: http://
dador (scheduler) do qdisc decide quando enviar um pacote. Agendadores ba-
www.kernel.org/doc/
Documentation/cgroups/ seados em classe permitem que voc coloque pacotes em classes diferentes,
priorizando e restringindo essas classes posteriormente. Um agendador qdisc
[2] Hierarquias para Blkio: http:// clssico para a restrio de trfego de rede o filtro Hierarchical Token Bucket
lwn.net/Articles/413015/
(HTB), que precisa ser instalado na placa de rede. Para isso, delete quaisquer
verses de qdisc j existentes e execute o HTB, com o comando:
O autor tc qdisc del dev eth0 root 2>/dev/null
tc qdisc add dev etho root handle 10: htb default 2
Ralf Spenneberg instrutor free-
lancer de Unix/Linux, consultor, au- O prximo passo criar as classes:
tor e CEO de sua prpria empresa tc class add dev eth0 parent 10: classid 10:1 htb rate 10mbit
de treinamento. Ralf publicou diver- tc class add dev eth0 parent 10: classid 10:2 htb rate 20mbit ceil 100mbit
sos livros sobre deteco de invaso,
SELinux, firewall e VPNs. A segun- Essas duas linhas criam duas classes diferentes, sendo que a primeira tem
da edio de seu ltimo livro, VPN on uma largura de banda mxima de 10Mbps. A segunda classe pode usar mais
Linux, foi publicada recentemente. de 20Mbps, mas no mais de 100 Mbps, se nenhuma outra classe precisar
de banda larga. A opo default2, ao criar o filtro HTB, rejeita trfego no
classificado para a segunda classe.
Gostou do artigo?
go? Para avaliar a classID para o cgroup net_cls, voc precisa definir outro filtro:
Queremos ouvir sua opinio.
pinio.
Fale conosco em tc filter add dev eth0 parent 10: protocol ip prio 10 handle 1: cgroup
cartas@linuxmagazine.com.br
zine.com. De agora em diante, a classID net_cls automaticamente usada pelo kernel
Este artigo no nosso
so site:
sit para alocar pacotes para classes HTB. O cliente Libvirt pode agora usar uma
http://lnm.com.br/article/7145
articl 145 velocidade mxima de transmisso de 10Mbps.

Linux Magazine #92 | Julho de 2012 71

You might also like