1

我使用python程序在Linux Ubuntu中做流量生成器,代码如下:

import socket, sys

host = sys.argv[1] #Server IP Address
textport = sys.argv[2] #Server Binding Port

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #socket

try:

    port = int(textport)

except ValueError:

    port = socket.getservbyname(textport, 'udp')

while 1:

   try:
        data = open('auth3.log')#read file

        for each_line in data: #each rows
                try:
                        (role,line_spoken) = each_line.split(': ',1)#split two parts
                        role  =  role.strip()
                        s.sendto(role, (host, port))
                        print('Send: ' + str(role) + "\n" )
                except:
                        pass

    except IOError as err:
        print('file isn\'t exist!!~'+str(err))

    finally:
        if 'data' in locals():   #If data have no object, Don't use data to close!!~
                data.close()

    print "\n"

auth3.log 的大小约为 1.8M。

当我向目标服务器发送数据时,我使用 OID 为 ''ifInOctets'' 的 snmp 来获取流量信息。

但我重新计算以“Kbits”为单位的流量约为 128。

我如何使用这个程序将带宽填充到 1Gbits?(也就是说,我要填充带宽)

谢谢你的帮助。

4

2 回答 2

2

此版本的代码实现了 Chris Merck 建议的前两个优化。

import socket, sys, itertools

host = sys.argv[1] #Server IP Address
textport = sys.argv[2] #Server Binding Port

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

try:
    port = int(textport)
except ValueError:
    port = socket.getservbyname(textport, 'udp')

# preprocess file data    
with open('auth3.log') as data:
    roles = [role for (role, line_spoken) in line.split(': ', 1) for line in data]

# preprocess everything we can
hp = (host, port)
send = s.sendto

for role in itertools.cycle(roles):
    try:
        send(role, hp)
    except:
        pass

为了进一步优化,您可能希望使用Cython对其进行处理,这可能会进一步加快循环速度。如果代码仍然没有产生足够的流量,您可能需要并行启动多个进程。

于 2013-03-09T14:57:06.830 回答
2

您的程序运行速度不够快,无法在线生成 1Gbps。

为了让它运行得更快,你可以:

  1. 删除对printafter的调用sendto。(打印本质上很慢。)
  2. 预处理您的auth3.log文件,以便您不需要在内部循环中处理它。(现在你正在循环.split.strip,这两者都在浪费 CPU 时间。
  3. 重写您的程序以发送更大的块。

但是,我担心结果仍然达不到 1Gbps。要真正最大化您的线路,请尝试使用诸如Colaso​​ft Packet Builder之类的流量生成程序(尽管我不确定程序是否会这样做。1Gbps 是很多流量。)

于 2013-03-09T14:26:07.740 回答