sendto() python

Я использую программу на 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, чтобы получить информацию о трафике.

Но я пересчитываю трафик в единицу "кбит" около 128.

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

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

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

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

Чтобы он работал быстрее, вы можете:

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

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

Другие вопросы по тегам