ฉันจะพิจารณาการใช้เครือข่ายปัจจุบันได้อย่างไร


9

ฉันต้องการแสดงการใช้งานเครือข่ายปัจจุบัน (การใช้แบนด์วิดท์) ของหนึ่งอินเทอร์เฟซของกล่อง Debian บนเว็บไซต์ ไม่ควรจะละเอียดหรือแม่นยำมากเพียงแค่ตัวเลขอย่างเช่น "52 Mbit / s"

จอภาพแบนด์วิดท์เครือข่ายทั่วไปเช่นiftopฉันไม่สามารถแยกค่าดังกล่าวได้

ฉันจะดึงข้อมูลได้ดีที่สุดอย่างไร?

ตัวอย่างเช่นฉันเดาว่าฉันอาจแยกวิเคราะห์/proc/net/devทุกสองสามนาที ไม่แน่ใจว่านี่เป็นวิธีที่ดีที่สุดในการทำสิ่งนี้หรือไม่

คำตอบ:


10

ฉันคิดว่า ifstat จะช่วยคุณ:

[root @ localhost ~] # ifstat -i eth0 -q 1 1
       eth0
 KB / s ใน 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โดยไม่เข้าใจสิ่งที่และวิธีการที่เวทมนตร์นี้เกิดขึ้นจริง
Eran

วิธีนี้ใช้ได้กับฉันในเราเตอร์ / ไม่ว่าง
cloneman

ใช้date +%s.%Nเพื่อรับค่าการประทับเวลายูนิกซ์สำหรับการวนซ้ำทุกครั้งและหารผลต่างไบต์ด้วยผลต่างการประทับเวลา จากนั้นคุณหลีกเลี่ยงปัญหาการวนซ้ำที่ยาวกว่า 1 วินาที
Arnavion

3

มีมอนิเตอร์ทราฟฟิกเครือข่ายเช่นvnstat ที่เก็บบันทึกการเข้าชมรายเดือนของคุณหรือslurmที่รับค่าโดยตรงจากที่เก็บไว้ในเคอร์เนล มันมีอยู่ใน repos distro ส่วนใหญ่

นี่คือสิ่งที่ฉันเห็นเมื่อฉันวิ่ง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อะไร กรุณาอย่าตอบในความคิดเห็น; แก้ไขคำตอบของคุณเพื่อให้ชัดเจนและสมบูรณ์ยิ่งขึ้น
สกอตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.