현재 네트워크 사용률을 어떻게 확인해야합니까?


9

웹 사이트에 데비안 상자의 한 인터페이스의 현재 네트워크 사용률 (대역폭 사용)을 표시하고 싶습니다. 매우 정교하거나 정확하지 않아야하며 "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이 (아주 약간) 부정확 있도록 시간을 고려하지 않습니다 그것은, While 루프에서 작업을 수행합니다. 내 600mhz coppermine에서 루프는 0.011 초가 걸립니다. 대부분의 경우 무시할 수없는 부정확성입니다. (commented out) 킬로바이트 / 메가 비트 출력을 사용할 때도 bash는 정수 산술 만 이해합니다.


나는 이것이 선택된 대답이어야한다고 생각합니다. 다른 모든 솔루션은 /proc/net/dev이 마술이 어떻게 그리고 어떻게 발생하는지 실제로 이해하지 않고 무대 뒤에서 파싱을 중계 합니다.
Eran

이 솔루션은 라우터 / busybox에서 나를 위해 일했습니다.
cloneman

사용은 date +%s.%N모든 반복에 대한 유닉스 타임 스탬프를 얻을 타임 스탬프 차이에 의해 바이트 차이를 분할합니다. 그런 다음 루프 반복이 1보다 길다는 문제를 피하십시오.
Arnavion

3

월간 트래픽 기록을 유지하는 vnstat 와 같은 네트워크 트래픽 모니터 또는 커널에 저장된 값에서 직접 값을 가져 오는 slurm 이 있습니다. 대부분의 배포 저장소에서 사용할 수 있습니다.

다음은 내가 실행할 때 표시되는 내용입니다 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무엇입니까? 의견에 응답하지 마십시오. 명확하고 완전하게 답변을 편집 하십시오.
Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.