Mevcut ağ kullanımını nasıl belirlemeliyim?


9

Bir web sitesinde Debian kutusunun bir arabiriminin geçerli ağ kullanımını (bant genişliği kullanımı) görüntülemek istiyorum. Çok ayrıntılı veya kesin olması gerekmez, sadece "52 Mbit / s" gibi basit bir sayıdır.

Tipik ağ bant genişliği monitörleri, iftopböyle bir değeri almamın bir yolunu vermiyor.

En iyi nasıl alabilirim?

Örneğin, sanırım /proc/net/devbirkaç dakikada bir ayrıştırabilirim . Bu olsa da bunu yapmak için gerçekten en iyi yolu olup olmadığından emin değilim.

Yanıtlar:


10

Bence ifstat size yardımcı olacak:

[root @ localhost ~] # ifstat -i eth0 -q 1 1
       eth0
 KB / s cinsinden KB / s çıkış
 3390,26 69,69

7

Bunu yapmanın en iyi yolu muhtemelen ayrıştırmaktır /proc/net/dev( /proctaşınabilir olmayan uyarılmalıdır ). İşte bashhızlı bir şekilde bir araya getirdim, bunu hesaplayabilen bir komut dosyası:

#!/bin/bash

_die() {
    printf '%s\n' "$@"
    exit 1
}

_interface=$1

[[ ${_interface} ]] || _die 'Usage: ifspeed [interface]'
grep -q "^ *${_interface}:" /proc/net/dev || _die "Interface ${_interface} not found in /proc/net/dev"

_interface_bytes_in_old=$(awk "/^ *${_interface}:/"' { if ($1 ~ /.*:[0-9][0-9]*/) { sub(/^.*:/, "") ; print $1 } else { print $2 } }' /proc/net/dev)
_interface_bytes_out_old=$(awk "/^ *${_interface}:/"' { if ($1 ~ /.*:[0-9][0-9]*/) { print $9 } else { print $10 } }' /proc/net/dev)

while sleep 1; do
    _interface_bytes_in_new=$(awk "/^ *${_interface}:/"' { if ($1 ~ /.*:[0-9][0-9]*/) { sub(/^.*:/, "") ; print $1 } else { print $2 } }' /proc/net/dev)
    _interface_bytes_out_new=$(awk "/^ *${_interface}:/"' { if ($1 ~ /.*:[0-9][0-9]*/) { print $9 } else { print $10 } }' /proc/net/dev)

    printf '%s: %s\n' 'Bytes in/sec'  "$(( _interface_bytes_in_new - _interface_bytes_in_old ))" \
                      'Bytes out/sec' "$(( _interface_bytes_out_new - _interface_bytes_out_old ))"

    # printf '%s: %s\n' 'Kilobytes in/sec'  "$(( ( _interface_bytes_in_new - _interface_bytes_in_old ) / 1024 ))" \
    #                   'Kilobytes out/sec' "$(( ( _interface_bytes_out_new - _interface_bytes_out_old ) / 1024 ))"

    # printf '%s: %s\n' 'Megabits in/sec'  "$(( ( _interface_bytes_in_new - _interface_bytes_in_old ) / 131072 ))" \
    #                   'Megabits out/sec' "$(( ( _interface_bytes_out_new - _interface_bytes_out_old ) / 131072 ))"

    _interface_bytes_in_old=${_interface_bytes_in_new}
    _interface_bytes_out_old=${_interface_bytes_out_new}
done

sleepWhile döngüsündeki işlemleri yapmak için gereken süreyi dikkate almadığını aklınızda bulundurun , bu yüzden (çok az) yanlıştır. 600mhz coppermine'imde, döngü 0.011 saniye sürer - çoğu amaç için ihmal edilebilir bir yanlışlık. Kilobayt / megabit çıkışlarını (yorumlanmış) kullanırken de aklınızda bulundurun, bash sadece tamsayı aritmetiğini anlar.


Bunun seçilen cevap olması gerektiğini düşünüyorum. Diğer her çözüm, /proc/net/devbu büyünün ne olduğunu ve nasıl gerçekleştiğini anlamadan, sahne arkasında, ayrıştırma işlemine geçiyor.
Eran

Bu çözüm benim için bir yönlendirici / meşgul kutusunda çalıştı.
cloneman

date +%s.%NHer yineleme için unix zaman damgasını almak ve bayt farkını zaman damgası farkına bölmek için kullanın . Sonra döngü yineleme sorunu 1 saniyeden daha uzun olması kaçının.
Arnav

3

Trafiğinizin aylık kayıtlarını tutan vnstat gibi ağ trafiği monitörleri veya değerlerini doğrudan çekirdeğe kaydedilenlerden alan slurm vardır. Çoğu dağıtım deposunda bulunur.

İşte koşarken gördüğüm şey slurm -i ra0:

resim açıklamasını buraya girin


1

İşte bunu hesaplamak için çok basit bir kabuk betiği:

#!/bin/sh

dev=$1

grep -q "^$dev:" /proc/net/dev || exec echo "$dev: no such device"

read rx <"/sys/class/net/$dev/statistics/rx_bytes"
read tx <"/sys/class/net/$dev/statistics/tx_bytes"

while sleep 1; do
    read newrx <"/sys/class/net/$dev/statistics/rx_bytes"
    read newtx <"/sys/class/net/$dev/statistics/tx_bytes"

    # convert bytes to kbit/s: bytes * 8 / 1000 => bytes / 125
    echo "$dev  {rx: $(((newrx-rx) / 125)), tx: $(((newtx-tx) / 125))}"

    rx=$newrx
    tx=$newtx
done

sadece arabirim adını geçen komut dosyasını başlatın, örn. ./shtraf eth1


1
Bunu biraz açıklayabilir misiniz? Parametre tam olarak ne olmalı? Önemi nedir 125? Lütfen yorumlarda yanıt vermeyin; daha net ve eksiksiz hale getirmek için cevabınızı düzenleyin .
Scott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.