Post em Destaque

Iniciando com o FreeBSD

Acreditava que seria fácil fazer uma pequena apresentação sobre FreeBSD, mas acredito que muitos que chegaram até aqui ou os que ainda estão por vir, não serão tão “marinheiros de primeira viagem”. E que nesse início de trabalho possamos contar com a ajuda de todos vocês. Muito...

Leia mais...

CPU Affinity, uma brincadeira de criança.

Posted by gondim | Posted in Dicas, FreeBSD | Posted on 16-04-2012

Tags:, ,

0

Nem sempre é uma boa ideia ter processos migrando de CPU o tempo todo, pois pode atrapalhar o desempenho de algumas aplicações no seu sistema. Aqui vou falar de um caso muito especial que é quando você tem um grande tráfego de rede tipo acima de 100Mbps. Quando temos um grande tráfego de dados nas interfaces de rede e a irq delas muda de CPU isso pode causar um load maior no sistema e até perda de pacotes na transmissão. Então nos resta fixar aquela interface de rede à uma CPU específica e faremos isso usando um recurso chamado CPU Affinity. Muitos sistemas possuem esse recurso assim como GNU/Linux e FreeBSD. Sendo que o mais intuitivo e simples que já vi, foi o do FreeBSD. Enquanto o primeiro sistema precisa usar o /proc e formas meio toscas para isso, no FreeBSD temos a ferramenta cpuset que faz o que se propõe e cujo man é muito bem documentado com exemplos. Podemos fazer CPU Affinity com process id, set id, thread id e irq. Faremos uso aqui do irq para colocarmos nossas interfaces de rede em CPUs específicas.

Vamos começar listando nossas CPUs, isso pode ser visto pelo comando: top -P ou fazendo:

# cpuset -g
pid -1 mask: 0, 1, 2, 3, 4, 5, 6, 7

Nesse meu caso temos de 0 à 7. Agora precisaremos descobrir as interrupções das interfaces de rede. Não a interrupção que vemos no dmesg mas aquela que o próprio FreeBSD gerou virtualmente.

O melhor comando que conheço para fazer a tarefa de descobrir a irq é o devinfo:

# devinfo -rv | less

Procure pela sua interface de rede, no meu caso aqui uma Intel PCI-e de nome em0 e achei esse trecho:

            em0 pnpinfo vendor=0x8086 device=0x10d3 subvendor=0x8086 subdevice=0x34da at slot=0 function=0 handle=\_SB_.PCI0.MRP1.HART
Interrupt request lines:
256
257
258

Achamos então as interrupções 256, 257 e 258 da em0. Agora vamos dizer que eu queira jogá-las em CPUs diferentes:

/usr/bin/cpuset -l 5 -x 256
/usr/bin/cpuset -l 6 -x 257
/usr/bin/cpuset -l 7 -x 258

Com os comandos acima eu disse que a irq 256 vai para a CPU 6, 257 na CPU 7 e 258 na CPU 8.

Parece até a propaganda da Oi… Simples assim rsrsr

Esses comandos você pode adicionar em um arquivo /etc/rc.local se existir, caso não exista basta criá-lo e colocar esses comandos assim:

#!/bin/sh

/usr/bin/cpuset -l 5 -x 256
/usr/bin/cpuset -l 6 -x 257
/usr/bin/cpuset -l 7 -x 258

Depois um chmod +x /etc/rc.local

Mais dúvidas… o man cpuset, como eu disse, é muito bem documentado.

Share Button