Post em Destaque

jnettop – ferramenta X9 de consumo de banda

Hoje venho apenas passar uma dica muito legal para os momentos em que percebemos certas lentidões de acesso. Usei essa ferramenta em outros sistemas e logicamente continuo usando no FreeBSD. Quando queremos descobrir, dentro da nossa rede, quem está consumindo mais banda de acesso, a ferramenta que...

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

Uma outra maneira organizada de configurar interfaces de rede

Posted by gondim | Posted in Dicas | Posted on 14-04-2012

Tags:,

1

Muita gente está acostumada à usar o /etc/rc.conf para diversas configurações no FreeBSD, como hostname, serviços de rede e tudo mais que estiver em /etc/defaults/rc.conf, inclusive as configurações das interfaces de rede.

Normalmente um exemplo simples de /etc/rc.conf:

defaultrouter=”186.xxx.48.1″
hostname=”zeus.dominio.com.br”
ifconfig_igb0=”inet 186.xxx.48.15  netmask 255.255.255.224″
keymap=”br275.iso.acc”

Reparem que existe a linha com o parâmetro ‘ifconfig_igb0‘ onde configuramos o IP da nossa interface de rede cujo driver é o igb aqui no nosso exemplo. Uma curiosidade bem legal que você pode fazer um man if_<driver_interface_rede> que você verá um manual do driver daquela interface. Ex: man if_em, man if_re, man if_rl e por aí vai.

Quando você tem uma interface de rede no servidor é mais fácil e rápido configurar no rc.conf mas a coisa fica mais chata quando temos mais interfaces e rotas para serem gerenciadas de forma limpa e clara. Imaginem ainda ter que configurar um link aggregation (lagg) e dentro desse lagg ainda ter que configurar vlans. É por essas e outras que usamos o /etc/start_if.<interface> e dentro dele colocamos toda a configuração que necessitamos como digitaríamos na linha de comando.

Vamos ver um exemplo simples: comentamos ou removemos a linha ifconfig_igb0 do rc.conf e criamos o arquivo /etc/start_if.igb0 com o conteúdo abaixo como no exemplo:

/sbin/ifconfig igb0 186.xxx.48.15/27
/sbin/route add -host 186.xxx.54.69 186.xxx.48.2
/sbin/route add -net 186.xxx.48.32/27 186.xxx.48.2

Basta fazer um reboot e testar sua nova configuração. 🙂

Agora vamos ver uma mais sofisticada com lagg entre as interfaces em2 e em3 e ainda vlans dentro da lagg:

/etc/start_if.em2:

/sbin/ifconfig lagg1 create
/sbin/ifconfig em2 up

/etc/start_if.em3:

/sbin/ifconfig em3 up
/sbin/ifconfig lagg1 laggproto lacp laggport em2 laggport em3 10.10.10.10 netmask 255.255.255.255
/sbin/ifconfig vlan0 create
/sbin/ifconfig vlan1 create
/sbin/ifconfig vlan2 create
/sbin/ifconfig vlan3 create
/sbin/ifconfig vlan0 186.xxx.48.1/27 vlan 3081 vlandev lagg1
/sbin/ifconfig vlan1 177.xxx.240.254/27 vlan 3082 vlandev lagg1
/sbin/ifconfig vlan2 186.xxx.54.1/27 vlan 2126 vlandev lagg1
/sbin/ifconfig vlan3 186.xxx.61.1/27 vlan 3088 vlandev lagg1

Nos exemplos acima fiz uma lagg nas interfaces em2 e em3 com o nome de lagg1. Uma vez criada a lagg, configurei as vlans que falam com cada cidade que tenho no meu router.

O objetivo não é aprender lagg ou vlan mas mostrar que usando esse formato de configuração fica mais claro e fácil de gerenciar uma estrutura mais complexa da sua empresa.

É isso e até a próxima.

Share Button