[FUG-BR] tuning de rede - FreeBSD 7.3

kmkz bleh jsibsd em gmail.com
Quarta Fevereiro 23 12:18:30 BRT 2011


Bom dia pessoal.

Tenho um servidor FreeBSD 7.3 com 8 placas de rede com chipset Intel e
Broadcom. Este é o servidor gateway da minha rede no qual rodo:

pf
named (base)
snmp
openbgp

Possuo três sessões BGP Full e uma Partial.

O que acontece é que estou tendo uma performance muito ruim com relação a
placa Broadcom. Possuo um CMTS ligado diretamente na placa sem switch no
meio, e estou tendo perda de pacote até o CMTS. Já realizei troca de cabo e
não resolveu.

gw# ifconfig bce0
bce0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500

options=1bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4>
        ether 1c:c1:de:08:de:90
        inet 10.20.0.1 netmask 0xfffffffc broadcast 10.20.0.3
        media: Ethernet 1000baseTX <full-duplex>
        status: active

Verificando com 'top -S' o uso de interrupção na bce0 é bastante alto. O
tráfego nesta placa passa dos 100Mbps na maior parte do tempo então
consequentemente vai consumir mais cpu. Porém, através de uma sysctl abaixo
consegui fazer com que esse uso fosse reduzido, mas continuo perdendo pacote
até o CMTS:

net.isr.direct=0

No momento o 'top -S' me mostra o seguinte:

  PID USERNAME  THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
   13 root        1 171 ki31     0K     8K CPU1    1  45.3H 96.48% idle:
cpu1
   12 root        1 171 ki31     0K     8K RUN     2  43.0H 90.77% idle:
cpu2
   14 root        1 171 ki31     0K     8K RUN     0  40.0H 77.20% idle:
cpu0
   11 root        1 171 ki31     0K     8K RUN     3  38.1H 73.00% idle:
cpu3
   15 root        1 -44    -     0K     8K WAIT    3  19.8H 52.49% swi1: net
   29 root        1 -68    -     0K     8K WAIT    2 151:40  5.57% irq257:
bce0
   40 root        1 -68    -     0K     8K WAIT    2  85:46  2.10% irq265:
em3

Se eu ativo a sysctl acima, tenho o seguinte:

  PID USERNAME  THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
   11 root        1 171 ki31     0K     8K CPU3    3  38.2H 92.87% idle:
cpu3
   13 root        1 171 ki31     0K     8K CPU1    1  45.4H 84.38% idle:
cpu1
   14 root        1 171 ki31     0K     8K RUN     0  40.1H 79.39% idle:
cpu0
   12 root        1 171 ki31     0K     8K CPU2    2  43.1H 62.35% idle:
cpu2
   29 root        1 -68    -     0K     8K WAIT    2 151:55 25.59% irq257:
bce0
   40 root        1 -68    -     0K     8K WAIT    2  85:55 21.58% irq265:
em3

Abaixo, resultado com netstat na interface:

gw# netstat -I bce0 -w 1
            input         (bce0)           output
   packets  errs      bytes    packets  errs      bytes colls
     15311     0    4469692      20459     0   17440474     0
     15631     0    4589699      21200     0   18848188     0
     15608     0    4497235      20683     0   17818101     0
     15529     0    4446912      20156     0   17090265     0
     14414     0    4071791      17597     0   14750674     0
     14713     0    4270162      18578     0   15301508     0
     15030     0    4332616      18052     0   15021321     0
     13900     0    4053945      17033     0   13895997     0
     14095     0    4051387      18936     0   16074572     0
     15515     0    4518106      20720     0   17377395     0
     15606     0    4468322      20386     0   17128122     0
     15494     0    4611991      20409     0   17379323     0
     15375     0    4584624      20574     0   17758892     0
     15610     0    4435950      21340     0   18658094     0
     15277     0    4573331      20444     0   17695037     0

Segue algumas sysctls no qual alterei os valores:

kern.ipc.nmbclusters=65536
kern.ipc.nsfbufs=10240
kern.ipc.maxsockbuf=8388608
net.inet.tcp.rfc1323=1
net.inet.tcp.sendspace=131072
net.inet.tcp.recvspace=131072
kern.random.sys.harvest.ethernet=0
kern.random.sys.harvest.interrupt=0
kern.ipc.somaxconn=1024
net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1
net.link.ether.inet.log_arp_wrong_iface=0

O ping começa com valor baixo depois sobe e o valor não cai denovo. Enquanto
este ping está alto, eu abro uma nova shell e executo outro ping. Ele começa
baixo por uns tempos, menor que 1ms, depois aumenta e iguala ao primeiro
ping executado.

64 bytes from 10.20.0.2: icmp_seq=22 ttl=255 time=0.321 ms
64 bytes from 10.20.0.2: icmp_seq=23 ttl=255 time=0.291 ms
64 bytes from 10.20.0.2: icmp_seq=24 ttl=255 time=0.305 ms
64 bytes from 10.20.0.2: icmp_seq=25 ttl=255 time=0.304 ms
64 bytes from 10.20.0.2: icmp_seq=26 ttl=255 time=0.197 ms
64 bytes from 10.20.0.2: icmp_seq=27 ttl=255 time=0.361 ms
64 bytes from 10.20.0.2: icmp_seq=28 ttl=255 time=0.277 ms
64 bytes from 10.20.0.2: icmp_seq=29 ttl=255 time=0.233 ms
64 bytes from 10.20.0.2: icmp_seq=30 ttl=255 time=10.524 ms
64 bytes from 10.20.0.2: icmp_seq=31 ttl=255 time=23.673 ms
64 bytes from 10.20.0.2: icmp_seq=32 ttl=255 time=44.541 ms
64 bytes from 10.20.0.2: icmp_seq=33 ttl=255 time=10.661 ms
64 bytes from 10.20.0.2: icmp_seq=34 ttl=255 time=6.178 ms
64 bytes from 10.20.0.2: icmp_seq=35 ttl=255 time=7.265 ms
64 bytes from 10.20.0.2: icmp_seq=36 ttl=255 time=5.732 ms
64 bytes from 10.20.0.2: icmp_seq=37 ttl=255 time=5.907 ms
64 bytes from 10.20.0.2: icmp_seq=38 ttl=255 time=8.711 ms
64 bytes from 10.20.0.2: icmp_seq=39 ttl=255 time=19.407 ms
64 bytes from 10.20.0.2: icmp_seq=40 ttl=255 time=65.276 ms

Segue resultado do 'vmstat -i':

interrupt                          total       rate
irq28: ciss0                     2050498         11
irq1: atkbd0                          10          0
irq17: atapci0+                      116          0
irq22: uhci0                           2          0
cpu0: timer                    356305937       2000
irq256: em0                    431705246       2423
irq257: bce0                  2101722530      11797
irq258: bce1                    26351598        147
irq259: em1                       697982          3
irq260: em1                       456930          2
irq261: em1                            2          0
irq262: em2                    410075391       2301
irq263: em2                    461421780       2590
irq264: em2                         4101          0
irq265: em3                   1020986798       5731
irq266: em3                   1083892349       6084
irq267: em3                       483373          2
irq268: bge0                   317083675       1779
irq269: bge1                   256196830       1438
cpu1: timer                    356297628       2000
cpu3: timer                    356297780       2000
cpu2: timer                    356297339       2000
Total                         7538327895      42315

netstat -nm:

3191/4114/7305 mbufs in use (current/cache/total)
3189/3471/6660/65536 mbuf clusters in use (current/cache/total/max)
3188/2700 mbuf+clusters out of packet secondary zone in use (current/cache)
0/119/119/12800 4k (page size) jumbo clusters in use
(current/cache/total/max)
0/0/0/6400 9k jumbo clusters in use (current/cache/total/max)
0/0/0/3200 16k jumbo clusters in use (current/cache/total/max)
7218K/8446K/15664K bytes allocated to network (current/cache/total)
0/0/0 requests for mbufs denied (mbufs/clusters/mbuf+clusters)
0/0/0 requests for jumbo clusters denied (4k/9k/16k)
0/7/10240 sfbufs in use (current/peak/max)
0 requests for sfbufs denied
0 requests for sfbufs delayed
0 requests for I/O initiated by sendfile
0 calls to protocol drain routines

Não sei mais o que fazer neste caso. Já olhei o CMTS e o problema não é lá
pois se eu pego uma estação e pingo ela diretamente no CMTS, não perco
pacote, mas se pingo no ip do servidor FreeBSD, tenho perda.
Acredito que com algum tuning - sysctl - possa resolvar ou melhorar muito o
desempenho. Alguém poderia me informar quais valores e sysctls eu devo
alterar? Se precisar de mais informações posso passar sem problema.

Desde já agradeço.


Mais detalhes sobre a lista de discussão freebsd