CPU Affinity, uma brincadeira de criança.
Posted by gondim | Posted in Dicas, FreeBSD | Posted on 16-04-2012
Tags:affinity, cpu, FreeBSD
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.