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 Гбит / с по проводам.
Чтобы он работал быстрее, вы можете:
- Удалить звонок
print
послеsendto
, (Печать медленная по своей природе.) - Предварительная обработка вашего
auth3.log
файл, так что вам не нужно обрабатывать его в вашем внутреннем цикле. (Прямо сейчас вы включаете.split
а также.strip
оба из которых тратят время процессора. - Перепишите свою программу для отправки больших кусков.
Но, боюсь, результат все равно не достигнет 1 Гбит / с. Чтобы действительно максимально использовать свою линию, попробуйте использовать программу генерации трафика, такую как Colasoft Packet Builder (хотя я не уверен, что даже эта программа сделает это. 1 Гбит / с - это большой трафик.)