异想天开

What's the true meaning of light, Could you tell me why

统计某ip的udp请求包数量

日期:2014-10-21 18:12:43
  
最后更新日期:2014-10-21 18:22:37
【技术文章】
一般tcp连接,可以直接通过netstat来看连接数量。需求的来源,就是某server利用了ip负载。但是记得之前,看到过,由于很多使用nat共享ip上网,所以一个ip下可能是多个用户。显然学校和企业的同一个ip下上网用户多,那么利用ip负载,可能会出现负载不均的情况。先验证下想法。开始想最简单就是直接利用现成的工具iftop,这里有个ip的流量。但是使用了iftop后,发现半天还不出结果。估计是请求数量众多,导致iftop执行慢。换了思路,写个python脚本,统计某个间隔下,访问的udp的ip数量,这里先用了tcpdump命令dump出请求数量,python脚本分析统计。如下: [code lang="cpp"]
#! env python
import sys
import os
import traceback

ip_stat={}

'''
ip_str is like *.147.41.52.80 or *.147.41.52.80:
'''
def _ip_split(str):
foo=str.split('.')
if len(foo)<4:
return ""
bar=[foo[0],foo[1],foo[2],foo[3]]
return '.'.join(bar)


def top_by_ip(path):
global ip_stat
fp=open(path,'r')
lines=fp.read().split('\n')
for i in range(len(lines)):
line=lines[i]
tmp=line.split()
if len(tmp)<2:
continue
src=_ip_split(tmp[0])
dest=_ip_split(tmp[1])
count=ip_stat.get(src)
if count==None:
count=0
ip_stat[src]=count+1
count=ip_stat.get(dest)
if count==None:
count=0
ip_stat[dest]=count+1

if __name__=='__main__':
if len(sys.argv)<3:
print 'Usage:%s tcpdump_file_path num' % sys.argv[0]
print "tcpdump example:tcpdump -i em2 -nn udp and port 8080 |awk '{print $3 ,$5}' | tee a.txt"
sys.exit(0)
try:
top_by_ip(sys.argv[1])
'''
sort by count
'''
data=sorted(ip_stat.items(), lambda x, y: cmp(x[1], y[1]), reverse=False)
_stat_d={}
for i in range(len(data)):
index=((data[i][1]+10)/10)*10
if not _stat_d.has_key(index):
_stat_d[index]=0
_stat_d[index]=_stat_d[index]+1
_data=sorted(_stat_d.items(), lambda x, y: cmp(x[1], y[1]), reverse=False)
default_len=int(sys.argv[2]);
if default_len and len(_data)>default_len:
len_data=default_len
else:
len_data=len(_data)
print len_data
for i in range(len_data):
print _data[i][0],_data[i][1]

except Exception,e:
print traceback.format_exc()
[/code]
在我执行tcpdump -i eth2 -nn udp and port 80 |awk '{print $3 ,$5}' | tee a.txt到ctrl+c,这几秒钟的结果如下:
110 1
90 1
100 2
80 4
70 5
60 18
50 32
40 80
30 198
20 1164
10 49272
第一行表示请求数量段,我按10次为一个间隔计算。小于10次请求ip居多。但是20次的请求是不容忽视的,这会导致server的缓冲不够用,增加了延迟,按ip来负载的话。看来是得改进下。