redhat:计算网络流量遇到负数问题

v6hacker 2011-11-01 11:00:11
原脚本:http://bbs.chinaunix.net/thread-1693020-1-1.html

以下是自己修改网上给出的Linux流量脚本所得出的数据,有好几个时间出现红色标注的奇怪流量,
还是负的。
日期 时间 流入 流出 总流量 单位:KB/s
11-10-30 21:32:00 77.88 338.32 416.20
11-10-30 21:33:00 76.61 -69573.22 -69496.61
11-10-30 21:34:00 76.02 331.23 407.25


百度了一下,说什么unsigned int(4字节)整数计数发生溢出,要用4294967295相减。
后来我按照网上所说的,使用4294967295相减,得出数据虽然是没有负的,但也非常大,完全超出
正常水平。
请问这是什么问题导致的?我用的是redhat 5.4
日期 时间 流入 流出 总流量 单位:KB/s
11-11-01 02:04:00 42.86 144.95 187.81
11-11-01 02:05:00 41.66 71513022.52 71513064.18
11-11-01 02:05:00 43.51 140.24 183.15
......
11-11-01 04:51:00 26.50 77.44 103.94
11-11-01 04:52:00 71512893.83 71565327.50 14378221.33
11-11-01 04:53:00 0.00 0.00 0.00
11-11-01 04:54:00 0.00 0.00 0.00
11-11-01 04:55:00 0.00 0.00 0.00
11-11-01 04:56:00 0.00 0.00 0.00
11-11-01 04:57:00 0.00 0.00 0.00
11-11-01 04:58:00 26.08 73.34 99.42
11-11-01 04:59:00 25.50 70.30 95.50
...全文
152 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
v6hacker 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qq120848369 的回复:]

引用 3 楼 v6hacker 的回复:

cat /proc/net/dev ,发现数值真的很大。十几位数了


恩,跑久了的确很大。
[/Quote]
请问你知道怎么回事吗?那数值那么大肯定不对的
qq120848369 2011-11-01
  • 打赏
  • 举报
回复
#!/bin/bash
#Name: network_top.sh
#Usage: sh network_top.sh --network-port=eth0 --interval-time=1 --repeat-total=10
#Description: monitor the network interface's flow
#WebSite: www.mysqlops.com

usage()
{
cat <<EOF
Usage: $0 [OPTIONS]
--network-port=ethN Show which network port,For Example --network-port=eth0.
--interval-time=N Every twice that need interval time,For Example --interval-time=1.
--repeat-total=N We need to see a continuous flow of card number,For Example --repeat-total=10.
EOF
exit 1
}

if [ "$#" -lt 1 ] ; then
usage
fi

for INPUT_DATA in $*
do
INPUT_DATA_1=$1
Val=`echo "$INPUT_DATA_1" | sed -e "s;--[^=]*=;;"`

case "$INPUT_DATA_1" in
--network-port=*)
ETH_PORT="$Val"
;;
--interval-time=*)
INTERVAL_TIME="$Val"
;;
--repeat-total=*)
REPEAT_TOTAL="$Val"
;;
*)
echo -e "\n ERROR VARIABLES: $INPUT_DATA_1 \n"
usage
exit 1
;;
esac
shift
done

infirst=$(cat /proc/net/dev |tr ':' ' '|awk '/'$ETH_PORT'/{print $2}')
outfirst=$(cat /proc/net/dev |tr ':' ' '|awk '/'$ETH_PORT'/{print $10}')

echo "$ETH_PORT" "in_bytes/sec" "out_bytes/sec" "total_bytes/sec" |awk '{printf("%10s %16s %16s %16s\n",$1,$2,$3,$4)}'
sleep $INTERVAL_TIME"s"

i=0
while [ "$i" -lt "$REPEAT_TOTAL" ]
do
inend=$(cat /proc/net/dev |tr ':' ' '|awk '/'$ETH_PORT'/{print $2}')
outend=$(cat /proc/net/dev |tr ':' ' '|awk '/'$ETH_PORT'/{print $10}')
sumin=$((($inend-$infirst)/$INTERVAL_TIME))
sumout=$((($outend-$outfirst)/$INTERVAL_TIME))
sum=$(($sumin+$sumout))

echo "$ETH_PORT" $sumin $sumout $sum |awk '{printf("%10s %16s %16s %16s\n",$1,$2,$3,$4)}'
infirst=$inend
outfirst=$outend
i=$(($i+1))
sleep $INTERVAL_TIME"s"
done


用这个脚本跑跑看。、
qq120848369 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 v6hacker 的回复:]

cat /proc/net/dev ,发现数值真的很大。十几位数了
[/Quote]

恩,跑久了的确很大。
v6hacker 2011-11-01
  • 打赏
  • 举报
回复
cat /proc/net/dev ,发现数值真的很大。十几位数了
v6hacker 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qq120848369 的回复:]

C/C++ code
#!/bin/bash
#Name: network_top.sh
#Usage: sh network_top.sh --network-port=eth0 --interval-time=1 --repeat-total=10
#Description: monitor the network interface's flow
#WebSite: www.mysqlo……
[/Quote]
我晕。原理还是一样的吧。读/proc/net/dev的内容,然后相减,再除以时间差。我觉得关键还是读出的数太大了,发生溢出。数据才不准,跟脚本写法无关吧。

19,612

社区成员

发帖
与我相关
我的任务
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
  • 系统维护与使用区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧