2013-03-09 2 views
1

내가 리눅스 우분투 트래픽 발생기를 할 파이썬 프로그램을 사용하고 코드를 아래와 같이 :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.8M이다.

대상 서버에 데이터를 보내면 OID가 ''ifInOctets ''인 snmp를 사용하여 교통 정보를 가져옵니다.

하지만 트래픽이 'Kbit의'단위로 계산 약 128

가 어떻게 1Gbits 최대 대역폭을 채우기 위해이 프로그램을 사용할 수있다? (즉, 난을 작성하려면 대역폭)

도움 주셔서 감사합니다.

답변

2

이 버전의 사용자 코드는 f를 구현합니다. 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을 사용하여 처리 할 수 ​​있습니다. 코드가 여전히 충분한 트래픽을 생성하지 않으면 여러 프로세스를 병렬로 실행해야 할 수 있습니다.

+0

고마워, '여러 개의 프로세스를 동시에 실행'하는 방법은이 프로그램에서 다중 스레드 처리가 필요한 방식입니까? – waynner

+0

@WayneHong 나는 전체 프로그램의 인스턴스를 두 개 이상 시작할 수 있음을 의미했습니다. 이 버전의 대역폭 사용량을 측정 했습니까? – user4815162342

+0

그래서 클래스의 객체 인 둘 이상의 인스턴스를 생성하려면 객체 지향 프로그래밍을 사용해야합니까? 대역폭은 Netperf에서 테스트 한 약 600Mbits입니다. – waynner

2

프로그램이 와이어에서 1Gbps를 생성 할만큼 충분히 빠르게 실행되지 않습니다.

은 당신이 할 수있는, 그것은 빠르게 실행하려면 :
  1. sendtoprint에 대한 호출을 제거합니다. (본질적으로 인쇄가 느립니다.)
  2. auth3.log 파일을 사전 처리하여 내부 루프 내에서 처리 할 필요가 없습니다. (지금 당신은.
  3. 큰 덩어리를 보낼 수있는 프로그램을 다시 작성
  4. . CPU 시간을 낭비하고 둘 .split.strip

를 루핑, 나는 결과가 여전히가 1Gbps의에 도달하지 않습니다 우려하고있다. 당신의 라인 정말 최대 출력, 교통 생성 프로그램 등 Colasoft Packet Builder를 사용하려고합니다 (I가 프로그램이 그것을 할 것입니다 심지어 모르겠어요하지만. 1Gbps의 트래픽의 많은입니다.)

+0

답장을 보내 주셔서 감사합니다. 코드를 수정하고 언급 한 트래픽 생성 프로그램 (Colasoft Packet Builder)을 사용하려고합니다. 하지만 패킷을 보낼 대상 IP 주소를 지정할 수 없다고 생각합니까? 그렇다면 아마 내가 필요로하는 도구가 될 것입니다. – waynner