Ad Widget

Collapse

Определение скорости работы интерфейса

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Bock
    Junior Member
    • Feb 2013
    • 26

    #1

    Определение скорости работы интерфейса

    Привет.
    Кто-нибудь получал скорость интерфейса НЕ через SNMP?
    Хочется полностью отказаться от SNMP, но пока что мешает то, что через net discovery невозможно получить скорость интерфейса.
  • vshturman
    Junior Member
    • May 2013
    • 6

    #2
    лично я на линуксовых машинах получаю скорость порта через `cat /sys/class/net/${IFACE}/speed`

    Но это не работает для старых ядер и некоторых типов интерфейсов (vnet, например).

    Справедливости ради замечу, что у snmp тоже часто попадаются проблемы с различными виртуальными интерфейсами.

    Comment

    • Bock
      Junior Member
      • Feb 2013
      • 26

      #3
      О, спасибо!
      У SNMP проблема, например, с bond - они их считают 10 Мбит/с и всё.

      Радость была преждевременна - на centos 5 нет такой опции
      Last edited by Bock; 18-08-2013, 11:46.

      Comment

      • vshturman
        Junior Member
        • May 2013
        • 6

        #4
        Да, поэтому я и сказал - на старых ядрах это не работает =(. На Centos шестой ветки эти файлы уже есть.

        Думаю, для CentOS 5 мождно получать скорость интерфейсов через ethtool, но оно работает от рута, поэтому придётся писать правила для sudo.

        Если кому пригодится - для новых ядер получаю скорость интерфейсов таким вот скриптом:

        Code:
        #!/bin/bash
        ##
        ## get max speed of network iface
        ##
        
        OS=$1
        IFACE=$2
        
        if [[ $OS == 'linux' ]]; then
            if echo "$IFACE" | grep -q "vnet" ; then
                SPEED=1000
            elif echo "$IFACE" | grep -q "bond" ; then
                ACSLAVE=`cat /sys/class/net/bond1/bonding/active_slave`
                SPEED=`cat /sys/class/net/${ACSLAVE}/speed || echo '0'`
            else
                SPEED=`cat /sys/class/net/${IFACE}/speed 2>/dev/null || echo '0'`
            fi
            if [[ $SPEED == '-1' ]]; then
                SPEED=0
            fi
            echo $SPEED
            exit 0
        elif [[ $OS == 'solaris' ]]; then
            echo "sorry, only linux support now =("
        else
            echo "Usage: $0 linux|solaris IFACE"
            exit 2
        fi
        В нём есть несколько условностей, неприменимых для всех:
        1. если интерфейс vnet, считаю его гигабитным (у меня в хозяйстве других нет)
        2. если интерфейс бонд, считаю, что он в режиме "active-backup" и получаю скорость с активного интерфейса. Если он не active-backup - возвращается ноль.
        3. В случае, если из файла не удаётся получить скорость, возвращается ноль.

        На заббиксе устроил триггеры таким образом, что если скорость интерфейса 0, скорость берет из переменной {$IFACE_SPEED} (задана для сервера). Тут есть неудобство - если на сервере несколько интерфейсов, не выйдет для каждого отдельно задать скорость, но для меня это не проблема, т.к. интерфейсы однотипные.

        Comment

        • Bock
          Junior Member
          • Feb 2013
          • 26

          #5
          sudo для ethtool уже есть, с помощью этого просчитываем, в up интерфейс или нет, и дуплекс заодно проверяем.
          С ethtool плохо, что он скорость будет писать как: Mbit/s, Gbit/s, а хотелось бы однотипности - то есть в bit/s, но малоосуществимо. Придётся ещё парсить вывод этого параметра.
          Мы отказались от мониторинга интерфейса bond, оставили только физику (eth).
          vnet нет у нас вообще.
          Жаль, но центос у нас составляет бОльшую часть серверов. Остаётся SNMP. грустно, блин. Казалось бы - такие банальные вещи, а появляются только спустя столько времени.

          Comment

          • vshturman
            Junior Member
            • May 2013
            • 6

            #6
            Originally posted by Bock
            С ethtool плохо, что он скорость будет писать как: Mbit/s, Gbit/s, а хотелось бы однотипности - то есть в bit/s, но малоосуществимо. Придётся ещё парсить вывод этого параметра.
            Гм.. Сейчас проверил на нескольких установках - везде ethtool пришет в Mb/s, а это как раз то, что нужно.

            Получать голую цифру можно так, например:
            Code:
            ethtool eth0 | grep 'Speed:' | sed 's/^\s*Speed:\s*\([0-9]*\).*$/\1/'

            Comment

            • Bock
              Junior Member
              • Feb 2013
              • 26

              #7
              Действительно, спасибо!

              Comment

              • Bock
                Junior Member
                • Feb 2013
                • 26

                #8
                Сейчас немного улучшим скрипт, так как в случае не подключённого интерфейса получается такое:
                [root@slave-91 zabbix]# ethtool eth0 | grep 'Speed:' | sed 's/^\s*Speed:\s*\([0-9]*\).*$/\1/'

                [root@slave-91 zabbix]# ethtool eth0 | grep 'Speed:'
                Speed: Unknown!

                Допишем через awk, что если нет чисел, то возвращать 0.

                Comment

                • Bock
                  Junior Member
                  • Feb 2013
                  • 26

                  #9
                  В итоге всем отделом сократили выражение до: ethtool eth1 | grep 'Speed:' | grep -oE '10+' || echo 0

                  Если делать через discovery:
                  Speed on interface {#IFNAME} system.run["sudo ethtool {#IFNAME} | grep 'Speed:' | grep -oE '10+' || echo 0"]

                  Не забудьте дать sudo для ethtool пользователю заббикс в этом случае.

                  Comment

                  • Bock
                    Junior Member
                    • Feb 2013
                    • 26

                    #10
                    Ещё больше сократили: ethtool eth0 | grep -oP '(?<=Speed: )\d+' || echo 0

                    Comment

                    Working...