sábado, 7 de setembro de 2013

FreeBSD - CPU Affinity

Resumo


Hoje utilizo o FreeBSD basicamente na configuração de proxy-cache. E com o aumento do tráfego das interfaces, surgiu a necessidade de começar a controlar melhor a o "balanceamento" de IRQ e processadores. E esta técnica é chamada de CPU Affinity, o que veremos como fazer no FreeBSD logo a seguir.

Introdução

Neste artigo, aprenderemos como definir em qual processador o IRQ será executado.

Para isso utilizaremos dos seguintes comandos:


Para listar as CPUs disponíveis utilizaremos:

# cpuset -g

Para descobrir as interrupções IRQ das interfaces geradas pelo FreeBSD no boot utilizaremos:

# devinfo -rv | less

Para verificar o atual consumo de procesamento dos processadores utilizaremos:

# top -P

Para fixar determinada IRQ em um processador específico utilizaremos:

# cpuset -l NUMERO-DO-PROCESSADOR -x NUMERO-DA-IRQ


Mãos-a-obra

Primeiramente, vamos listar nossas CPUs disponíveis:

# cpuset -g
pid -1 mask: 0, 1, 2, 3

Veja que no meu caso, tenho disponíveis 4 processadores (ou núcleos) identificados pelo FreeBSD. Numerados de 0 a 3 respectivamente.

Agora que já sabemos quantos processadores temos, vamos listar os IRQs das interfaces.

# devinfo -rv | less

A saída do devinfo -rv é muito extensa, como sei que minhas interfaces de rede são em0 e em1, vou procurar a linha que começa com o nome das mesmas. E logo abaixo dessa linha tenho as interrupções que as interfaces estão utilizando.

em0 pnpinfo vendor=0x8086 device=0x10d3 subvendor=0x15d9 subdevice=0x0605 class=0x020000 at slot=0 function=0
                Interrupt request lines:
                    256
                    257
                    258

em1 pnpinfo vendor=0x8086 device=0x10d3 subvendor=0x15d9 subdevice=0x0605 class=0x020000 at slot=0 function=0
                Interrupt request lines:
                    259
                    260
                    261

Podemos identificar acima que a interface em0 tem os IRQs 256 257 258 e a interface em1 tem os IRQs 259 260 261.

Agora chegamos a um momento de decisão, temos 6 IRQs para 4 processadores, para isso vamos analisar o consumo atual dos processadores executando...

# top -P
CPU 0:  2.3% user,  0.0% nice,  1.2% system,  3.5% interrupt, 93.0% idle
CPU 1:  2.3% user,  0.0% nice,  0.6% system,  0.0% interrupt, 97.1% idle
CPU 2:  4.1% user,  0.0% nice,  1.7% system,  0.0% interrupt, 94.2% idle
CPU 3:  0.6% user,  0.0% nice,  0.0% system,  0.0% interrupt, 99.4% idle


Com isso, consigo analisar que o processador 0 e o 3 estão sendo menos consumidos, assim posso definir o CPU Affinity nesses dois processadores.

# /usr/bin/cpuset -l 0 -x 256
# /usr/bin/cpuset -l 0 -x 257
# /usr/bin/cpuset -l 0 -x 258
# /usr/bin/cpuset -l 3 -x 259
# /usr/bin/cpuset -l 3 -x 260
# /usr/bin/cpuset -l 3 -x 261

Veja que eu decidi setar os IRQs 256, 257 e 258 no processador 0 e os IRQs 259, 260 e 261 no processador 3.

Feito isto, o CPU Affinity já está ativo e funcionando. Mas no seu próximo reboot essa configuração será perdida.

Para isso, basta adicionar as linhas do /usr/sbin/cpuset acima no seu rc.conf para a mudança ser feita logo no boot do sistema.

Referências

http://www.freebsd.org/cgi/man.cgi?query=devinfo&apropos=0&sektion=0&manpath=FreeBSD+9.1-RELEASE&arch=default&format=html
http://www.freebsd.org/cgi/man.cgi?query=cpuset&sektion=1&apropos=0&manpath=FreeBSD+9.1-RELEASE
http://www.freebsd.org/cgi/man.cgi?query=cpuset&sektion=2&apropos=0&manpath=FreeBSD+9.1-RELEASE
http://segfault.in/2010/09/how-to-set-cpu-affinity-for-a-process-in-freebsd/
http://forums.freebsd.org/showthread.php?t=1386
http://www.bsdinfo.com.br/2012/04/16/cpu-affinity-uma-brincadeira-de-crianca/

Sobre o Autor

Nome: Wenderson Souza
Idade: 31 anos (em 07/09/2013)
Profissão: Gerente de TI
Atuo na área de informática desde 1998.
Trabalho com distribuições Linux desde 2000 e com FreeBSD desde 2011.
Atuo na área de telecomunicações desde 2006.
e-mail: wendersonsouza at gmail.com
msn: wendersonsouza at msn.com
skype: wendersonsouza