मुझे वर्तमान नेटवर्क उपयोग का निर्धारण कैसे करना चाहिए?


9

मैं एक वेबसाइट पर एक डेबियन बॉक्स के एक इंटरफेस के वर्तमान नेटवर्क उपयोग (बैंडविड्थ उपयोग) को प्रदर्शित करना चाहता हूं। यह बहुत विस्तृत या सटीक नहीं माना जाता है, बस एक सरल संख्या जैसे "52 Mbit / s"।

विशिष्ट नेटवर्क बैंडविड्थ मॉनिटर जैसे कि iftopमुझे ऐसे मूल्य निकालने के लिए कोई रास्ता नहीं है।

मैं इसे कैसे पुनः प्राप्त कर सकता हूं?

उदाहरण के लिए, मुझे लगता है कि मैं /proc/net/devहर कुछ मिनटों में पार्स कर सकता हूं । यकीन नहीं अगर यह वास्तव में यह करने के लिए सबसे अच्छा तरीका है।

जवाबों:


10

मुझे लगता है कि ifstat आपकी मदद करेगा:

[रूट @ लोकलहोस्ट ~ ~ # इफस्टैट -इ एथ ० —क १ १
       eth0
 KB / s में केबी / एस
 3390.26 69.69

7

बस इसे करने का सबसे अच्छा तरीका संभवतः पार्स करना है /proc/net/dev(चेतावनी दी जाए कि /procयह पोर्टेबल नहीं है)। यहां एक bashस्क्रिप्ट है जिसे मैंने जल्दी से एक साथ रखा है जो इसे गणना करने में सक्षम होना चाहिए:

#!/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

इस बात को ध्यान में रखें कि sleepलूप में ऑपरेशन करने में जितना समय लगता है, उतना समय नहीं लगता है, इसलिए यह गलत है। मेरे 600mhz कॉपरमाइन पर, लूप 0.011 सेकंड लेता है - अधिकांश प्रयोजनों के लिए एक नगण्य अशुद्धि। किलोबाइट / मेगाबिट आउटपुट का उपयोग करते समय ध्यान रखें कि बैश केवल पूर्णांक अंकगणित को समझता है।


मुझे लगता है कि यह चुना हुआ जवाब होना चाहिए। हर दूसरे समाधान, पर्दे के पीछे, पार्सिंग पर /proc/net/dev, वास्तव में यह समझने के बिना कि यह जादू क्या और कैसे होता है।
एरन

यह समाधान मेरे लिए राउटर / बिजीबॉक्स पर काम करता है।
1:14 बजे क्लोनमैन

date +%s.%Nहर पुनरावृत्ति के लिए यूनिक्स टाइमस्टैम्प प्राप्त करने के लिए उपयोग करें और टाइमस्टैम्प अंतर द्वारा बाइट्स अंतर को विभाजित करें। तब आप लूप पुनरावृत्तियों की समस्या 1s से अधिक होने से बचते हैं।
अर्नवियन

3

वहाँ vnstat की तरह नेटवर्क ट्रैफ़िक मॉनिटर हैं जो आपके ट्रैफ़िक के मासिक रिकॉर्ड को बनाए रखता है, या स्लरम जो कि कर्नेल में संग्रहीत उन लोगों से सीधे मान लेता है। यह अधिकांश डिस्ट्रो रिपोज में उपलब्ध है।

यहाँ है कि मैं क्या देखता हूँ जब मैं दौड़ता हूँ slurm -i ra0:

यहां छवि विवरण दर्ज करें


1

यह गणना करने के लिए एक बहुत ही सरल शेल स्क्रिप्ट है:

#!/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

बस इंटरफ़ेस नाम से गुजरने वाली स्क्रिप्ट शुरू करें, जैसे। ./shtraf eth1


1
क्या आप इसे थोड़ा समझा सकते हैं? वास्तव में पैरामीटर क्या होना चाहिए? का महत्व क्या है 125? कृपया टिप्पणियों में प्रतिक्रिया न दें; इसे स्पष्ट और अधिक पूर्ण बनाने के लिए अपना उत्तर संपादित करें।
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.