Neighbour table overflow

rbilbao en inzignia.cl rbilbao en inzignia.cl
Lun Oct 4 16:19:43 CLT 2004


El Mon, Oct 04, 2004 at 02:15:27PM -0400, Marco Bravo escribio:
> en gc_thresh1,2 y 3 tengo valores de 128, 512 y 1024 respectivamente..

sip, ese es el default

> 
> Lo que leo acerca de gc_thresh es q si aumento los valores solo 
> incrementaria el buffer para almacenar cache de ruteo?

nopes, como veras de net/core/neighbour.c :

static struct neighbour *neigh_alloc(struct neigh_table *tbl)
{
        struct neighbour *n = NULL;
        unsigned long now = jiffies;
                
        if (tbl->entries > tbl->gc_thresh3 ||
            (tbl->entries > tbl->gc_thresh2 &&
               now - tbl->last_flush > 5 * HZ)) {
            if (!neigh_forced_gc(tbl) &&
                tbl->entries > tbl->gc_thresh3)
              goto out;
         }
   .....
   ....
   ..
   .
   
}

ademas en  net/ipv4/route.c :

...
..

static int rt_garbage_collect(void){

	...
	...
	...
	
	 /* Calculate number of entries, which we want to expire now. */
    goal = atomic_read(&ipv4_dst_ops.entries) -
          (ip_rt_gc_elasticity << rt_hash_log);
   if (goal <= 0) {
       if (equilibrium < ipv4_dst_ops.gc_thresh)
           equilibrium = ipv4_dst_ops.gc_thresh;
                                                      
	                                                                         
	                                
	...
	...
	..
	
}

y en  net/ipv4/arp.c :


...
        .gc_interval =  30 * HZ,
        .gc_thresh1 =   128,
        .gc_thresh2 =   512,
        .gc_thresh3 =   1024,
        
....

	                               
	                                                                
o sea, los valores permiten un balance entre el tamanno de la tabla,
la frecuencia y la cantidad de nodos que se limpian en cada "pasada".


** en resumen :

gc_thresh1 = minimo 
gc_thresh2 = balance, o cuando debe comenzar a preocuparse
gc_thresh3 = maximo permitido

**  ademas puedes modificar el valor de :

gc_stale_time = tiempo de vida de cada entrada en la tabla

** y de :

gc_interval = cada cuanto debe correr el garbage_collector (GC)  en la 
tabla.


** cuidado eso si que si tienes una tabla muy grande, con mucho trafico
a distintos hosts y un GC muy seguido podrias hacer que el kernel entrara
en un loop (algo asi como un auto DoS ;-D )


suerte y que ojala te sirva, pero trata de determinar porque se te llenaron
las tablas arp (algun virus o troyano quizas? ).


slds
mundo






Más información sobre la lista de distribución Linux