2013-03-09 7 views
1

Я использую программу питона, чтобы сделать генератор трафика в Linux Ubuntu, а код, как показано ниже:SendTo() питон

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,8 м.

Когда я отправляю данные на целевой сервер, я использую snmp, который OID является '' ifInOctets '', чтобы получить информацию о трафике.

Но трафик пересчитывать к единице «» «» килобит около 128.

Как я могу использовать эту программу, чтобы заполнить пропускную способность до 1Gbits? (Другими словами, я хочу, чтобы заполнить полоса пропускания)

Спасибо за помощь.

ответ

2

для этой версии код реализует f первые две оптимизации, предложенные Крисом Мерком.

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, который может дополнительно ускорить цикл. Если код по-прежнему не создает достаточного трафика, вам, вероятно, придется запускать несколько процессов параллельно.

+0

Большое спасибо. Имеются ли средства, связанные с «запуском нескольких процессов параллельно», - это способ, которым мне нужно многопоточно обрабатывать эту программу? – waynner

+0

@WayneHong Я имел в виду, что вы можете запустить более одного экземпляра всей программы. Вы измеряли использование полосы пропускания с этой версией? – user4815162342

+0

Итак, мне нужно использовать объектно-ориентированное программирование для создания более одного экземпляра, который является объектом класса? Ширина полосы пропускания составляет около 600 Мбит, которую я тестировал Netperf. – waynner

2

Ваша программа не работает достаточно быстро, чтобы генерировать 1 Гбит/с на проводе.

Чтобы сделать его работать быстрее, вы можете:

  1. Удалить вызов print после sendto. (Печать по природе невелика.)
  2. Предварительно обработайте файл auth3.log, чтобы вам не нужно его обрабатывать внутри внутреннего цикла. (Прямо сейчас вы зацикливание на .split и .strip, оба из которых тратить процессорное время.
  3. Перепишите программу для отправки больших кусков.

Но, я боюсь, что результат будет еще не достигнет 1Гбит. Чтобы действительно максимум из вашей линии, попробуйте использовать программу генерации трафика, такие как Colasoft Packet Builder (хотя я не уверен, что даже что программа сделает это. 1Gbps является много трафика.)

+0

Спасибо за ваш ответ, я изменяю код и пытаюсь использовать программу генерации трафика (Colasoft Packet Builder), о которой вы упомянули. Но я думаю, что он не может указать IP-адрес получателя, который будет отправлен? Если это так, то, возможно, это будет тот инструмент, который мне нужен. – waynner

 Смежные вопросы

  • Нет связанных вопросов^_^