Ad Widget

Collapse

Вычисляемые значения и скорость на порту

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • dimka779
    Junior Member
    • Mar 2014
    • 22

    #1

    Вычисляемые значения и скорость на порту

    Подскажите пожалуйста, что можно сделать в следующей ситуации:
    Есть микротик, с него снимаются значения скорости в секунду и рисуются графики.
    На один из портов микротика (ether2) приходит интернет во VLAN.
    И еще через этот порт (ether2) трафик идет в соседнюю локальную сеть.
    VLAN OID - ifInOctets.30
    Ether2 OID - ifInOctets.2

    Скорость во VLAN я получаю без проблем с помощью значения ifInOctets30 и ifOutOctets30.
    А вот скорость в локальную сеть я могу получить если сделаю вычитание.
    Ether2 - VLAN = скорость в соседнюю локальную сеть.

    Я создал вычисляемое значение с помощью формулы - last("ifInOctets1")-last("ifInOctets30")
    Но в результате на график выводятся некорректные значения (петабайты, экзабайты), которые ничего общего с реальной скорость не имеют.

    Стал разбираться, с помощью MIB браузера.
    Он выдал значения
    ifInOctets.2 = 97590243
    ifInOctets30 = 554438260

    Разве такое может быть? Ведь VLAN ifInOctets30 "входит" в состав физического порта (ether2) ifInOctets.2 - как такое может быть?
  • aib
    Senior Member
    • Jan 2014
    • 1615

    #2
    Возможно, VLAN содержит трафик во всем VLAN, включая все порты, содержащие этот VLAN, а не только ether 2.
    Sincerely yours,
    Aleksey

    Comment

    • Jimson
      Senior Member
      • Jan 2008
      • 1327

      #3
      Во первых все должно работать. Другой вопрос, а правильно ли вы вообще сконфигурировали элементы данных, судя по тому что вы сравниваете между собой значения отдаваемые snmpwalk ifInOctets между разными интерфейсами, вы вообще не понимаете что такое snmp counter.

      Ваши элементы данных "ifInOctets" должны:
      1) иметь множитель 8
      2) сохраняться как "дельта в секунду"
      3) для автоматического преобразования значений units выставить в "bps" (с маленькой буквы, у нас будет bits per seconds)

      При этом ваш вычисляемый элемент данных:
      1) не должен иметь множителя
      2) должен хранить значение "как есть"
      3) units так же в "bps"

      Во вторых, ваша вычисляемая разница будет иметь погрешность, так, например, last(ifInOctets.1) на момент вычисления может быть значением полученным 4 минуты назад, а last(ifInOctets.30) получен пару секунд назад. Естественно чем меньше будет интервал опроса элементов данных тем меньше будет погрешность. Но по сути это костыли, притом так где они вообще не нужны.

      Я вам предлагаю на свиче, в который включен этот микротик, указать switchport trunk native vlan отличный от vlan локальной сети, таким образом трафик локальной сети будет получаться микротиком тоже тегированным, а следовательно будет отдельный subinterface и отдельный ifIndex.

      Comment

      • dimka779
        Junior Member
        • Mar 2014
        • 22

        #4
        Да, в том то и дело, что элементы данных сделаны корректно. Как Вы написали:
        Ваши элементы данных "ifinoctets" должны:
        1) иметь множитель 8
        2) сохраняться как "дельта в секунду"
        3) для автоматического преобразования значений units выставить в "bps" (с маленькой буквы, у нас будет bits per seconds)
        По этим отделенным элементам графики строятся и соответствуют реальным данным, тут вопросов нет. Проблема только в вычисляемом элементе.

        Вычисляемый элемент пробовал по разному делать, в том числе и:
        1) не должен иметь множителя
        2) должен хранить значение "как есть"
        3) units так же в "bps""
        Но видимо число получается отрицательным и из-за этого расчет происходит некорректно.

        Просто дело в том, что свич в который включен микротик - провйдерский (услуга "передача данных между" точками)
        Попробую тогда сказать им, чтобы сконфигурировали еще тегированный vlan для этой локальной подсети.
        Спасибо!

        Comment

        • aib
          Senior Member
          • Jan 2014
          • 1615

          #5
          Посмотрите заметочку о том, как можно трафик в VLAN мониторить.
          http://networkengineering.stackexcha...r-vlan-traffic
          Оказывается, это не так просто
          Sincerely yours,
          Aleksey

          Comment

          • Jimson
            Senior Member
            • Jan 2008
            • 1327

            #6
            Originally posted by dimka779
            Но видимо число получается отрицательным и из-за этого расчет происходит некорректно.
            Теоретически не должно такого быть, покажите "последние данные" из интерфейса забикса по этим элементам данных. Практически же, учитывая что сбор данных по этим элементам не синхронизирован между собой, такое очень даже возможно.

            Originally posted by aib
            Оказывается, это не так просто
            Это не то. Там идет речь про svi интерфейсы l3 коммутатора.

            Comment

            • dimka779
              Junior Member
              • Mar 2014
              • 22

              #7
              Кажется я понял в чем моя ошибка.
              Я думал что zabbix в вычисляемом значении берет ifInOctets.2 с уже вычисленным значением (дельта в секунду).
              А он берет абсолютное значение ifInOctets.2

              Можно ли как то в самой формуле указать значение дельты в секунду?

              Что-то типа:
              last((delta)"ifInOctets1")-last((delta)"ifInOctets30")

              Comment

              • Jimson
                Senior Member
                • Jan 2008
                • 1327

                #8
                нет нельзя
                проверьте без вычисления, просто создайте вычисляемый элемент данных где в качестве формулы будет указан last() от другого, реального, элемента данных, задайте обоим маленький интервал опроса, секунд 15
                затем сравните "последние данные" по этим двух элементам в интерфейсе забикса

                если то о чем вы щас сказали правда, то это бага, и, возможно, это бага только 2.2 версии, так как в 2.2 новый механизм кэширования lastdata

                p.s. временный и очень не экономичный workaround возможно будет использование функции avg вместо last, но обязательно проверьте то что я написал выше и если данные будут разные, то надо создавать репорт

                Comment

                • dimka779
                  Junior Member
                  • Mar 2014
                  • 22

                  #9
                  Originally posted by Jimson
                  нет нельзя
                  проверьте без вычисления, просто создайте вычисляемый элемент данных где в качестве формулы будет указан last() от другого, реального, элемента данных, задайте обоим маленький интервал опроса, секунд 15
                  затем сравните "последние данные" по этим двух элементам в интерфейсе забикса

                  если то о чем вы щас сказали правда, то это бага, и, возможно, это бага только 2.2 версии, так как в 2.2 новый механизм кэширования lastdata

                  p.s. временный и очень не экономичный workaround возможно будет использование функции avg вместо last, но обязательно проверьте то что я написал выше и если данные будут разные, то надо создавать репорт
                  Спасибо, сейчас попробую, но давайте еще раз опишу ситуацию как я ее вижу.

                  Микротик.
                  порт 2 - ifinoctets.2
                  vlan на этом порту - ifinoctets.30

                  Созданы шаблоны (может это влиять?) с элементами данных ifinoctets.2 и ifinoctets.30
                  Данные элементы настроены следующим образом:
                  1)множитель 8
                  2) сохраняться как "дельта в секунду"
                  3) для автоматического преобразования значений units выставить в "bps" (с маленькой буквы, у нас будет bits per seconds)
                  По этим шаблонам строятся графики, которые полностью соответствуют реальной скорости.

                  Затем я создаю вычисляемый элемент данных, с формулой
                  last("ifinoctets.2")-last("ifinoctets.30")
                  Настройки данного элемента:
                  1) не должен иметь множителя
                  2) должен хранить значение "как есть"
                  3) units так же в "bps""
                  На графиках я вижу данные от 0 байт до 20 экзобайт.

                  upd.
                  Создал 2 вычисляемых элемента. В формулы им записал:
                  last("ifinoctets.2")
                  и
                  last("ifinoctets.30")
                  Сами элементы назвал lifInOctets.2test и ifInOctets.30test

                  В "последние данные" показывает адекватные значения, равные реальной скорости.
                  Значения выводятся в байтах. (например при реальной скорости на порту=6 мбит, и на VLANе=1мбит - показывает числа 6100456 и 1120567 соотвественно)
                  Т.е. ifInOctects.2 почти всегда больше, чем ifInOctects.30 как и должно быть.
                  Но разница между обновлениями этих элементов - 3 секунды, и из-за этого иногда получается, что ifInOctets.30 имеет больше значение чем IfInOctets2

                  Затем создал еще один вычисляемый элемент:
                  с фомулой last("ifInOctets.2test")-last("ifInOctets.30test")
                  По поводу этого элемента - в последних данных иногда показывает нормальное число, а иногда экзабайты.

                  Понаблюдал - всё таки дело в том, если ifInOctets.30 оказывается больше, чем ifInOctets.2 - то рисуются экзабайты, хотя и разница в обновлении - 1 секунда. Видимо этого хватает.
                  Last edited by dimka779; 31-03-2014, 13:56.

                  Comment

                  • Jimson
                    Senior Member
                    • Jan 2008
                    • 1327

                    #10
                    Originally posted by dimka779
                    Создал 2 вычисляемых элемента. В формулы им записал:
                    last("ifinoctets.2")
                    и
                    last("ifinoctets.30")
                    Сами элементы назвал lifInOctets.2test и ifInOctets.30test

                    В "последние данные" показывает адекватные значения, равные реальной скорости.
                    Т.е. последние данные совпадают с "ifInOctets.2" и "ifInOctets.30" соответсвенно? Раз совпадают то все нормально, проблема в том что эти данные собираются не синхронно.

                    Originally posted by dimka779
                    с фомулой last("ifInOctets.2test")-last("ifInOctets.30test")
                    По поводу этого элемента - в последних данных иногда показывает нормальное число, а иногда экзабайты.
                    Ну отрицательное число при запихивании в uint дает больше положительное число, тут нет ничего странного.

                    В принципе гонять нетегированный трафик в транках считается плохим тоном. Тегируйте трафик принудительно, любым доступным микротику способом, и ваша задача решиться.

                    Comment

                    • dimka779
                      Junior Member
                      • Mar 2014
                      • 22

                      #11
                      Originally posted by Jimson
                      Т.е. последние данные совпадают с "ifInOctets.2" и "ifInOctets.30" соответсвенно? Раз совпадают то все нормально, проблема в том что эти данные собираются не синхронно.


                      Ну отрицательное число при запихивании в uint дает больше положительное число, тут нет ничего странного.

                      В принципе гонять нетегированный трафик в транках считается плохим тоном. Тегируйте трафик принудительно, любым доступным микротику способом, и ваша задача решиться.
                      Ок, буду пинать провайдера.
                      А напоследок, еще не подскажите, про функцию avg?
                      Т.е. нужно сделать формулу avg("ifInOctets.2test")-avg("ifInOctets.30test") ?

                      Comment

                      • aib
                        Senior Member
                        • Jan 2014
                        • 1615

                        #12
                        Примеры использования Вычисляемых величин
                        Code:
                        [B]Пример 2[/B]
                        
                        Вычисление 10-минутного усреднения количества значений обрабатываемых Zabbix'ом.
                        
                        Используйте функцию avg:
                        
                        avg("Zabbix Server:zabbix[wcache,values]",600)
                        
                        Обратите внимание, что интенсивное использование вычисляемых
                        элементов данных с большими периодами времени может 
                        повлиять на производительность Zabbix сервера.
                        Sincerely yours,
                        Aleksey

                        Comment

                        • Jimson
                          Senior Member
                          • Jan 2008
                          • 1327

                          #13
                          Originally posted by dimka779
                          Ок, буду пинать провайдера.
                          А напоследок, еще не подскажите, про функцию avg?
                          Т.е. нужно сделать формулу avg("ifInOctets.2test")-avg("ifInOctets.30test") ?
                          да, но все равно надо ставить тип вычисляемого элемента float а на графиках просто указать "минимальное значение" в нуль, иначе все равно вы так или иначе попадете на отрицательные числа.

                          ну или добавьте себе функцию fabs() в src/libs/zbxserver/expression.c
                          я себе добавлял квадратный корень, степень и заодно поправил 0/0
                          Code:
                          --- src/libs/zbxserver/expression.c.orig        2012-08-28 23:24:16.000000000 +0400
                          +++ src/libs/zbxserver/expression.c     2012-08-29 17:51:18.000000000 +0400
                          @@ -185,12 +185,13 @@
                                  }
                          
                                  /* operators with lowest priority come first */
                          -       /* HIGHEST / * - + < > # = & | LOWEST */
                          +       /* HIGHEST / ~ ^ * - + < > # = & | LOWEST */
                                  if (NULL != (p = strchr(exp, '|')) || NULL != (p = strchr(exp, '&')) ||
                                                  NULL != (p = strchr(exp, '=')) || NULL != (p = strchr(exp, '#')) ||
                                                  NULL != (p = strchr(exp, '>')) || NULL != (p = strchr(exp, '<')) ||
                                                  NULL != (p = strchr(exp, '+')) || NULL != (p = strrchr(exp, '-')) ||
                          -                       NULL != (p = strchr(exp, '*')) || NULL != (p = strrchr(exp, '/')))
                          +                       NULL != (p = strchr(exp, '*')) || NULL != (p = strrchr(exp, '/')) ||
                          +                       NULL != (p = strchr(exp, '^')) || NULL != (p = strrchr(exp, '~')))
                                  {
                                          c = *p;
                                          *p = '\0';
                          @@ -242,12 +243,35 @@
                                          case '/':
                                                  if (SUCCEED == cmp_double(value2, 0))
                                                  {
                          -                               zbx_snprintf(error, maxerrlen, "Division by zero. Cannot evaluate expression [%s]", exp);
                          -                               return FAIL;
                          +                               if (SUCCEED == cmp_double(value1, 0))
                          +                               {
                          +                                       *result = 0;
                          +                                       break;
                          +                               } else {
                          +                                       zbx_snprintf(error, maxerrlen, "Division by zero. Cannot evaluate expression [%s]", exp);
                          +                                       return FAIL;
                          +                               }
                                                  }
                          
                                                  *result = value1 / value2;
                                                  break;
                          +               case '^':
                          +                       if (value1 <= 0)
                          +                       {
                          +                               zbx_snprintf(error, maxerrlen, "Negative first argument in pow. Cannot evaluate expression [%s]", exp);
                          +                               return FAIL;
                          +                       }
                          +                       *result = pow(value1, value2);
                          +                       break;
                          +               case '~':
                          +                       if (SUCCEED != cmp_double(value1, 2))
                          +                       {
                          +                               zbx_snprintf(error, maxerrlen, "Support only square root. Cannot evaluate expression [%s]", exp);
                          +                               return FAIL;
                          +                       }
                          +
                          +                       *result = sqrt(fabs(value2));
                          +                       break;
                                  }
                          
                                  return SUCCEED;

                          Comment

                          Working...