我使用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。
当我将数据发送到目标服务器时,我使用snmp,其中OID是''ifInOctets''来获取交通信息。
但我重新计算到''Kbits''的流量大约是128。
如何使用此程序将带宽填充到1Gbits?(换句话说,我想填写带宽)
感谢您的帮助。
答案 0 :(得分:2)
您的程序运行速度不够快,无法在线路上生成1Gbps。
为了让它跑得更快,您可以:
print
之后移除对sendto
的来电。 (打印本质上很慢。)auth3.log
文件,这样您就不需要在内循环中处理它。 (现在你正在循环.split
和.strip
,这两个都在浪费CPU时间。但是,我担心结果仍不能达到1Gbps。为了真正最大化您的线路,尝试使用流量生成程序,例如Colasoft Packet Builder(虽然我不确定 程序将执行此操作.1Gbps是批次交通流量。)
答案 1 :(得分: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来处理它,这可能会进一步加快循环。如果代码仍然没有产生足够的流量,您可能需要并行启动多个进程。