본문 바로가기

IT/개발

Rocky Linux 파이썬으로 네트워트 인터페이스 정보 가져오기, 각 트래픽 량 계산하기 (랜카드별 데이터송수신 데이터량)

반응형

망내에 서버 설계를 하다보면 서버간 데이터 트래픽을 제어해야 할 경우가 있습니다.

 

여러개의 랜카드를 이용해서 망을 분리하기도 하고 트래픽을 분산 시키기도 하지요.

 

이런 경우 유용한 함수들을 파이썬으로 구현했습니다. 

 

(인터페이스별 트래픽은 1초만 측정했습니다)

 

- 인터페이스 목록 가져오기

- 인터페이스 현재 up/down link 상태 가져오기 

- 인터페이스별 1초당 트래픽량 측정하기(Tx/Rx)

 

# 네트워크 인터페이스 목록 가져오기
def get_network_interface() :
    network_interfaces = psutil.net_if_addrs()

    # 인터페이스 이름 출력
    print("network interface list:")    
    for interface_name, addresses in network_interfaces.items():
        print(f"\nintreface: {interface_name}")
        for address in addresses:
            print(f"  address type: {address.family.name}")
            print(f"  address: {address.address}")
            if address.netmask:
                print(f"  netmask: {address.netmask}")
            if address.broadcast:
                print(f"  broadcast: {address.broadcast}")
               
# 네트워크 인터페이스 상태 정보 가져오기
def get_network_interface_status() :                
       
    # 네트워크 인터페이스 주소 정보 가져오기
    network_interfaces = psutil.net_if_addrs()

    # 네트워크 인터페이스 상태 정보 가져오기
    interface_stats = psutil.net_if_stats()

    # 각 인터페이스에 대해 상태 정보 출력하기
    for interface, addrs in network_interfaces.items():
        print(f"Interface: {interface}")

        # 인터페이스 상태 정보 가져오기
        stats = interface_stats.get(interface)

        if stats:
            # 링크 상태 확인
            is_up = "Up" if stats.isup else "Down"
            print(f"  Status: {is_up}")
        else:
            print("  Status: Unknown")
           
# 네트워크 인터페이스 트래픽 량 측정하기 1초
def get_network_interface_traffic() :              
   
    # 초기 네트워크 인터페이스 별 I/O 카운터 가져오기
    initial_counters = psutil.net_io_counters(pernic=True)

    # 대기 시간 간격 (초)
    wait_time = 1

    # 잠시 대기
    time.sleep(wait_time)

    # 두 번째 네트워크 인터페이스 별 I/O 카운터 가져오기
    second_counters = psutil.net_io_counters(pernic=True)

    # 초당 전송 및 수신 바이트 계산
    for interface, initial in initial_counters.items():
        if interface in second_counters:
            second = second_counters[interface]
           
            # 초당 수신 바이트
            bytes_received_per_second = (second.bytes_recv - initial.bytes_recv) / wait_time
           
            # 초당 전송 바이트
            bytes_sent_per_second = (second.bytes_sent - initial.bytes_sent) / wait_time
           
            print(f"Interface: {interface}")
            print(f"  Bytes Rx/s: {bytes_received_per_second:.2f} B/s")
            print(f"  Bytes Tx/s: {bytes_sent_per_second:.2f} B/s\n")
 
if __name__ == '__main__' :
   
   
    get_network_interface()
    get_network_interface_status()
    get_network_interface_traffic()
 

 

 

network interface list:

intreface: lo
  address type: AF_INET
  address: 127.0.0.1
  netmask: 255.0.0.0
  address type: AF_INET6
  address: ::1
  netmask: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
  address type: AF_PACKET
  address: 00:00:00:00:00:00

intreface: eno1
  address type: AF_INET
  address: 192.168.10.219
  netmask: 255.255.255.0
  broadcast: 192.168.10.255
  address type: AF_INET6
  address: fe80::b53d:d1df:70fd:3e69%eno1
  netmask: ffff:ffff:ffff:ffff::
  address type: AF_PACKET
  address: 7c:10:c9:9f:64:e3
  broadcast: ff:ff:ff:ff:ff:ff

intreface: docker0
  address type: AF_INET
  address: 172.17.0.1
  netmask: 255.255.0.0
  broadcast: 172.17.255.255
  address type: AF_PACKET
  address: 02:42:ed:77:6b:fa
  broadcast: ff:ff:ff:ff:ff:ff
Interface: lo
  Status: Up
Interface: eno1
  Status: Up
Interface: docker0
  Status: Down
Interface: lo
  Bytes Received per Second: 4698.00 B/s
  Bytes Sent per Second: 4698.00 B/s

Interface: eno1
  Bytes Received per Second: 43984.00 B/s
  Bytes Sent per Second: 71699.00 B/s

Interface: docker0
  Bytes Received per Second: 0.00 B/s
  Bytes Sent per Second: 0.00 B/s

반응형