1

私はPythonプログラムを使用してLinuxUbuntuでトラフィックジェネレーターを実行し、次のようなコードを使用します。

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を使用します。

しかし、トラフィックは「キロビット」の単位に再計算され、約128です。

このプログラムを使用して最大1Gビットの帯域幅を埋めるにはどうすればよいですか?(つまり、帯域幅を埋めたい)

ご協力いただきありがとうございます。

4

2 に答える 2

2

プログラムは、ネットワーク上で1Gbpsを生成するのに十分な速度で実行されていません。

実行速度を上げるには、次のことができます。

  1. printafterへの呼び出しを削除しますsendto。(印刷は本質的に遅いです。)
  2. auth3.log内部ループ内でファイルを処理する必要がないように、ファイルを前処理します。(現在、とをループしていますが.split.stripどちらもCPU時間を浪費しています。
  3. より大きなチャンクを送信するようにプログラムを書き直してください。

しかし、結果がまだ1Gbpsに達しないのではないかと心配しています。回線を最大限に活用するには、 Colaso​​ft Packet Builderなどのトラフィック生成プログラムを使用してみてください(ただし、そのプログラムで十分かどうかはわかりません。1Gbpsは大量のトラフィックです)。

于 2013-03-09T14:26:07.740 に答える
2

このバージョンのコードは、ChrisMerckによって提案された最初の2つの最適化を実装しています。

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 に答える