Monitorizar interfaces Gigabit con SNMP

Oscar Nogales

Técnico Especialista de Comunicaciones y Seguridad. 14 años de experiencia en una empresa de servicios TI me han permitido conocer diferentes entornos, equipos, configuraciones, formas de hacer las cosas y sobretodo muy buenos profesionales que me han hecho crecer como profesional de las comunicaciones y la seguridad, en un sector dinámico y de cambios constantes, donde hay que estar continuamente reciclándose.

You may also like...

20 Responses

  1. Aitor says:

    Gracia por articulo. Me ha sido de gran utilidad. Hasta ahora utlizaba contadores de 32 bits, y a veces veia que el resultado no se ajustaba a la realidad. Lo que no he entendido como has sacado los 34,35 seg.
    A ver si me lo puedes aclarar.

    Gracias.

    Un saludo.

    • Hola Aitor,

      gracias por pasarte por aquí y comentar !
      Me alegro que te haya ido bien, a mi me pasó eso exactamente: no me cuadraban las gráficas de bw de los interfaces gigabit con un uso elevado.

      Los 34,35 segundos salen de dividir el número total de bytes que el contador SNMP de 32 bits puede contar entre el gigabit por segundo:

      2 elevado 32 = 4294967296 bytes
      1 Gbit/seg = 125 MBytes/seg = 125000000 byts/seg

      Tiempo en llenar el contador: 4294967296 / 125000000 = 34,35s

  2. Alfonso says:

    Hola Oscar:

    De antemano muchas gracias por tu explicación, me ha ayudado a entender nuestros problemas al leer los datos de los firewall Check Point.
    No obstante tengo algunas dudas, que espero me puedas aclarar, te pongo en antecedentes, estamos leyendo valores negativos en algunas interfaces: Ignoring result as received negative rates: throughputIn=-6374705.06666667
    Seguramente por el tiempo del intervalo de lectura, ahora esta en 4 minutos.

    Dudas:
    En la formula indicada, ¿A y B son los valores leidos del ifHCInOctets en un intervalo de tiempo? o ¿A corresponde al de ifHCInOctets y B al de ifHCOutOctets ?. ¿A es el último valor leido o el primero?.

    Por otro lado yo estoy usando version v2c para leer, pero el resultado que obtengo viene de un contador de 32 bits:
    IF-MIB::ifOutOctets.3 = Counter32: 2397764349, ¿porque?, ¿necesitare cambiar algo en la configuración snmp de mi Check Point.

    Un saludo y mis felicitaciones por el artículo.

    Alfonso Castro

    • Hola Alfonso,

      gracias a ti por pasarte por aquí y comentar !

      Respecto a la primera duda que expones, que obtengas resultados negativos se debe a que la segunda medida es menor que la primera. Eso pasa porque el contador de bytes de SNMP ha llegado al final y ha vuelto a empezar desde 0. Como no existe un OID que sea throughput, todas las herramientas de monitorización realizan la medición de la forma que explico: se toman dos medidas separadas por un intervalo de tiempo y se saca la media de tráfico en ese tiempo. En el caso concreto de vuestro firewall, cambiad el OID de monitorización por el de 64 bits y veréis como desaparece el problema de throughput negativo, a la vez que veréis el throughput real que está gestionando el equipo.

      Respecto a la segunda pregunta, A y B son los valores leídos del mismo item en un intervalo de tiempo. No mezcles los valores IN y OUT.

      El contador de octetos de interfaz de 64 bits es un OID diferente al del 32 bits. Tienes que hacer 2 cosas:
      1. Usar v2c porque ese OID está soportado a partir de esa versión
      2. Cambia el OID que monitorizas y usa los que comento en el artículo:
      IN: .1.3.6.1.2.1.31.1.1.1.6.1.X
      OUT: .1.3.6.1.2.1.31.1.1.1.10.X

      Espero haberte ayudado, si tienes algún problema más, no dudes en pasarte nuevamente.

      Un Saludo,
      Oscar.

  3. carlos says:

    hola, gracias por tu aporte pero me gustaria pedirte ayuda para configurar en nagios y monitorear el ancho de banda de un equipo mediante snmp, tengo funcionando nagios y pnp4 y chech_mk todo ok pero no logro monitorear el ancho de banda de una interfaz de un servidor cliente por favor solo eso me faltaria si pudieras se le agradece
    saludos

    • Hola Carlos,

      primero disculpa por la tardía (muy tardía) respuesta. Tengo un niño pequeño que me ha absorvido todo el tiempo y tengo abandonado el blog.

      Para monitorizar el interfaz de red de un servidor, basta que uses el OID estándard IfInOctets y IfOutOctets. Lo que pasa que esto es un contador y te va a devolver el valor del contador, que es el número de octetos (bytes) que ha contabilizado hasta el momento. El truco para poder sacar el ancho de banda (kBps o MBps) es hacer 2 veces la medición, esperando unos 5 segundos por ejemplo entre medición y medición. Después restas los dos valores y lo dividies entre 5s y obtendras una media (de cinco segundos) del ancho de banda. Es una aproximación que se acerca bastante a la realidad y te servirá para saber el tráfico que está gestionando ese servidor.

      Espero que haya podido ayudarte, aunque tarde 🙂

      Gracias por pasarte por aquí !

  4. Yael Chavez says:

    Hola Oscar, he estado un par de días ajustando el monitoreo de un firewall en mi Zabbix, me gustaría seguir el consejo de articulo de usar de preferencia los contadores de 64 bits, sin embargo he notado que los valores entre los contadores de 32 y 64 distan mucho entre si.

    He comparado mis gráficas actuales con contadores de 32 bits contra las nativas del firewall y coinciden, por lo que me da la confianza que son los valores correctos, asi que si intento aplicar la misma formula a los contadores de 64 bits (usualmente números mayores) temo que me de valores inexactos del uso de las interfaces.

    ¿Hay una explicación para esta situación o la forma de interpretar el contador de 64 bits necesita de otra formula? Gracias de antemano por tu atención, saludos.

  5. Yael Chavez says:

    Hola Oscar, creo que ya entendí el porque de mi duda, por la naturaleza de los contadores de 64 bits que pueden almacenar números mucho mayores y que las gráficas en realidad solo hacen un delta del valor mas recientey el penultimo para sacar el calculo de uso de la interfaz. Ya cree las graficas de la misma manera que mis contadores de 32 bits y esta arrojando los valores correctos.

    Saludos

    • Hola Yael,

      me alegro que hayas podido solicionarlo. Efectivamente, funciona por deltas del valor del contador que es siempre incremental. De ahí viene el problema de las interfaces Gigabit (y sobretodo 10Gbps) y los contadores de 32bits, que entre consulta y consulta, el contador ha llegado al final y vuelve a empezar de 0.

      Gracias por tu feedback y por pasarte por aquí !

      Saludos,

  6. Jose says:

    Hola, no se puede ver la formula que mencionas, lo intenté en varios navegadores y no la muestra.

    • Hola Jose,

      pues es raro, porque yo si puedo verla en los navegadores que tengo.
      De todas formas, te la pongo a continuación:

      bps=[(A-B)/T]*8

      Es decir, restamos el valor de las dos mediciones que hemos hecho, y lo dividimos entre el tiempo transcurrido entre ambas mediciones para obterner una media y lo multiplicamos por 8 (ya que los contadores son de octetos y queremos bits).

      Investigaré porque no se ve la formula con algunos navegadores.

      Muchas gracias !

  7. Byron says:

    Hola Oscar,

    y como con esto mismo puedo medir la disponibilidad de una interface de 100Gigas?

    saludos

    • Hola Byron,

      Efectivamente para interfaces superiores a 1Gbps, hay que utilizar exclusivamente los contadores de 64 bits.

      He monitorizado interfaces 10G con carga elevada y los datos que me muestran son correctos. No he tenido la oportunidad de hacerlo con 100G pero debería funcionar sin problemas.

      Ya me contarás cuando lo pruebes 🙂

      Un Saludo y gracias por pasarte y comentar !

  8. luis says:

    Hola, tengo una duda. Estoy reviviendo un item antiguo pero ahi va.

    Estoy haciendo un script con php que revisa una serie de equipos via SNMP. Obtengo los datos pero sigo sin saber aplicar la formula.

    obtengo el dato de IN y el dato de Out. In vendria siendo A y out B?
    o bien IN1 = A ; IN2 B ?

    El intervalo de tiempo es uno determinado por mi ? es decir… Obtengo IN y Out .. espero 60 segundos…obtengo IN2 Y OUT2 y aplico la formula¡?

    bps= [(A-B)/T]*8 donde A = ?? Y B = ??

    Es decir A Y B son los valores antes o despues del intervalo de tiempo?

    • Hola Luis,

      No te preocupes en preguntar en post antiguos, están ahí para ser consultados cuando uno lo necesite. Además la monitorización SNMP es algo que nunca quedará anticuado.

      Respondiendo a tu pregunta, los valores A y B de la fórmula son las dos medidas del mismo sentido de tráfico. Es decir dos medidas de IN o dos medidas de OUT. Y lo que haces es restarlas y dividirlas entre el intervalo de tiempo que las separa, para tener una media del tráfico que ha pasado en ese sentido. Para que no te salga negativa la resta, haz que A sea la segunda muestra que tomas, así garantizarás que sea un número mayor a B, que será tu primera muestra.

      Respecto al tiempo, tú decides cuánto esperar entre muestra y muestra. No te recomiendo que sea un tiempo elevado porque vas a perder precisión en el resultado. Entre 1 y 5s son tiempos buenos para calcular.

      Por último, para que haya coherencia entre IN y OUT lo suyo es que lances simultáneamente las dos consultas, guardes en variables los valores, vuelvas a lanzar otra vez las dos consultas y por último hagas los cálculos. Así tendrás el valor real de entrada y salida en ese determinado momento. Ojo, no mezcles en la misma fórmula IN y OUT porque el valor que te salga no tendrá nada que ver con la realidad!

      Espero haberte ayudado, gracias por pasarte por el Blog y comentar.

      Saludos !

      • Luis says:

        Hola, gracias por tu respeusta. Pero sigo sin obtener resultados (que segun yo son reales). Yo estoy usando equipos ubiquiti que tienen una traffic shaper, es decir limito su velocidad de conexion, y con las diversas formulas que he aplicado siempre me entregan resultados muy mayores lo cual no debiese ser.

        De las distintas formulas que he visto me he dado cuenta que tu lo haces distinto a las otras que he visto
        por ejemplo la formula que plantea Cisco https://www.cisco.com/c/en/us/support/docs/ip/simple-network-management-protocol-snmp/8141-calculate-bandwidth-snmp.html .

        En ella indica que seria:
        Ifinoctets(1)-ifinoctets(2) *8 * 100 (Ni idea de donde sale ese 100) / intervalotiempo * ifspeed

        Esta formula no me sirve (claramente, por eso sigo consultando jaja)

        Sin embargo tu formula indica que se multiplica por 8 una vez que se realiza la division entre los valores. Lo cual cambiaria el resultado y veo que tampoco multiplicas por 100.

        Podrias guiarme un poco mas?

        Esto es lo que hago, para mi caso al ser equipos inalambricos calculo la velocidad de entrada/salida de la interfaz WLAN (Donde recibe conexion) y entrada/salida interfaz LAN (La que baja hacia el router).

        Este es el esquema..

        AP –> Antena recibe señal (estacion) –> Router LAN

        $difftime=5;
        if($ifspeed_eth != 0) {
        $interval_eth=($difftime*$ifspeed_eth);
        } else {
        $ifspeed_eth = 100000000;
        $interval_eth=($difftime*$ifspeed_eth);
        }
        echo “Este es el intervalo de tiempo $interval_eth \n”;
        if($lastin_lan$in_lan) {
        $deltain = ($max-$in_lan+$lastin_lan);
        } else {
        $deltain = 0;
        }
        $lankbps_in = (($deltain*8*100)/($interval_eth));
        $lanmbps_in = ($lankbps_in/1024); //convierto a Megabits
        if($lastout_lan$out_lan) {
        $deltaout = ($max-$out_lan+$lastout_lan);
        } else {
        $deltaout = 0;
        }
        $lankbps_out = (($deltaout*8*100)/($interval_eth));
        $lanmbps_out = ($lankbps_out/1024);

        if($ifspeed_ath != 0) {
        $interval_ath=($difftime*$ifspeed_ath);
        } else {
        $ifspeed_ath = 100000000;
        $interval_ath=($difftime*$ifspeed_ath);
        }

        if($lastin_wlan$in_wlan) {
        $deltain_wlan = ($max-$in_wlan+$lastin_wlan);
        } else {
        $deltain_wlan = 0;
        }
        $deltain_wlan = (($deltain_wlan*8*100)/($interval_ath));
        $wlankbps_in = ($deltain_wlan);
        echo “wLankbps = $wlankbps_in \n”;
        $wlanmbps_in = ($wlankbps_in/1024);
        echo “WLanmbps = $wlanmbps_in \n”;

        if($lastout_wlan$out_wlan) {
        $deltaout_wlan = ($max-$out_wlan+$lastout_wlan);
        } else {
        $deltaout_wlan = 0;
        }
        $wlankbps_out = (($deltaout_wlan*8*100)/($interval_ath));

        $wlanmbps_out = ($wlankbps_out/1024);

        //Aqui calculo el porcentaje de uso.
        $lanmbps_in = ($lanmbps_in *100);
        $lanmbps_out = ($lanmbps_out *100);
        $wlanmbps_in = ($wlanmbps_in *100);
        $wlanmbps_out = ($wlanmbps_out *100);
        $lanmbps_in = ($lanmbps_in * $bw);
        $lanmbps_in = ($lanmbps_in/100);

        Desde ya te agradezco tu tiempo y ayuda. SAludos !

        • Hola de nuevo Luis,

          es más fácil de lo que parece. Lo primero que tienes que tener en cuenta es que los contadores SNMP de las interfaces cuentan octetos, es decir Bytes. Como por lo general las medidas de velocidad se miden en BITS por segundo, tenemos que multiplicar por 8 (1 byte son 8 bits) el resultado de la formula

          Te debería dar un valor muy aproximado con la formula que comento. Si tenemos en cuenta que la diferencia de tiempo es de 5s por ejemplo: bps = [ (IfIn_t1 – IfIn_t0) / 5 ] * 8 (donde t0 y t1 son dos medidas tomadas del mismo contador separadas por 5s).

          Si el número que te sale es mil o millones, obviamente serían kbps (en caso de miles) o Mbps (en caso de millones). Pero yo no aplicaría una división para devolver kbps. Lo mejor es pasarle a la herramienta de graficas que uses: rraw, grafana o lo que sea; los datos en bps y ya se encargará de escalar correctamente.

          En la formula de Cisco creo que utiliza la velocidad del enlace porque saca un porcentaje de uso, en lugar del valor de uso que es lo que yo saco. Por eso divide por el valor de la velocidad máxima del enlace y multiplica por 100. Yo prefiero tener valores absolutos, no me interesa graficar porcentaje de uso respecto interfaz. Sobretodo porque es más fácil de comparar valores absolutos que porcentajes, por ejemplo cuando monitorizas muchos equipo y algunos tienen interfaces de gigabit y otros de 100Mbps ¿ Es lo mismo un 30% en un enlace de 100 que en uno de 1000 ? Creo que es más fácil comparar 300Mbps con 30Mbps ¿no crees?

          Yo simplificaría tu script para hacer exclusivamente los cálculos de la formula que recomiendo. Es mi opinión 🙂

          Un Saludo !

          • luis says:

            hola, primero que todo gracias por responder. Estoy aplicando tu formula pero me siguen sin cuadrar los valores.

            Por ejemplo en unas medidas obtengo estos valores que obtengo al aplicar la formula que me indcas, es decir son solo bps.

            wlan IN Wlan out Lan in Lan Out
            132109171.2 4564403.2 4420915.2 112274022.4

            pero hasta donde entiendo seria:
            MBPS KBPS BPS
            132 109 171 .2

            Lo cual significa que son 132 Mbps? el cliente solo posee 4 Mbps y es imposible que este consumiendo 132 Mbps =/ que puede estar mal?

            Gracias.

  9. jonathan says:

    Hola Oscar gran aporte muchas gracias de ante mano, queria hacer una pregunta que pluggin usas para nagios para que te devuelva la sali en bits/s

  10. David says:

    Buenas tardes,

    Estoy utilizando los OID de 64 bits pero en vez de snmpget, con snmpwalk, el problema es que a veces me esta devolviendo valores negativos, porque puede ser eso ?

    Muchas gracias!

Leave a Reply

Your email address will not be published. Required fields are marked *