don't stop believing

Linux에서 인터넷 대역폭(속도) 측정하기 - iperf 본문

Network

Linux에서 인터넷 대역폭(속도) 측정하기 - iperf

Tongchun 2019. 1. 8. 18:44

Linux에서 인터넷 대역폭(속도)를 측정하기 의한 툴로 iperf 를 사용합니다.


Ubuntu에서 설치는 아래와 같이 합니다.

$ sudo apt-get install iperf

CentOS에는 아래와 같이 설치합니다.

$ sudo yum install epel-release
$ sudo yum update
$ sudo yum install iperf

iperf에서는 두 가지 역할이 있습니다. Server와 Client죠. iperf로 Server를 실행시키고 다른(대역폭을 측정하고 싶은 Client)쪽에서 packet을 보내 속도를 측정하게 됩니다. 따라서 iperf로 대역폭을 측정하고 싶다면 두 대의 서버(PC)가 필요합니다.


회사에 두 대의 PC를 설치했습니다. 사내 네트워크 대역폭을 측정한다는 가정입니다.

A는 Server 역할을 합니다. (Ubuntu, 10.10.1.168)

B는 Client 역할을 합니다. (CentOS, 10.10.0.78)


먼저 TCP의 대역폭 확인입니다.

A(Server)에서 iperf를 서버로 실행합니다.

$ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------

이제 B(Client)에서 서버로 대역폭 체크를 합니다.

$ iperf -c 10.10.1.168
------------------------------------------------------------
Client connecting to 10.10.1.168, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[  3] local 10.10.0.78 port 55962 connected with 10.10.1.168 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.1 sec   113 MBytes  94.6 Mbits/sec

두 서버간의 대역폭은 94.6 Mbits/sec로 나옵니다.

두 서버 사이에 100M 허브를 지나가고 있습니다. 그래서 실제 1G가 아닌 100M에 가까운 94.6이 나오고 있습니다.

실행 후 A(Server)에도 아래와 같이 나오고 있습니다.

------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  4] local 10.10.1.168 port 5001 connected with 10.10.0.78 port 55962
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-10.2 sec   113 MBytes  93.6 Mbits/sec


이번에는 UDP의 대역폭을 확인해 보겠습니다.

동일하게 A(Server)에 아래와 같이 실행합니다. -u 옵션이 추가되었습니다.

$ iperf -s -u
------------------------------------------------------------
Server listening on UDP port 5001
Receiving 1470 byte datagrams
UDP buffer size:  208 KByte (default)
------------------------------------------------------------

B(Client)에서도 -u 옵션을 추가해 대역폭 측정을 시작합니다.

$ iperf -c 10.10.1.168 -u
------------------------------------------------------------
Client connecting to 10.10.1.168, UDP port 5001
Sending 1470 byte datagrams, IPG target: 11215.21 us (kalman adjust)
UDP buffer size:  208 KByte (default)
------------------------------------------------------------
[  3] local 10.10.0.78 port 34548 connected with 10.10.1.168 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  1.25 MBytes  1.05 Mbits/sec
[  3] Sent 892 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec  1.25 MBytes  1.05 Mbits/sec   0.013 ms    0/  892 (0%)

UDP 테스트에서는 대역폭이 1.05Mbits/sec로 나오고 있습니다. 이는 iperf가 udp에 대한 기본 bandwidth를 1Mbits/sec로 가지고 있기 때문입니다.

다시 B(Client)에서 -b 옵션에 1000m를 추가해 실행합니다.

$ iperf -c 10.10.1.168 -u -b 1000m
------------------------------------------------------------
Client connecting to 10.10.1.168, UDP port 5001
Sending 1470 byte datagrams, IPG target: 11.76 us (kalman adjust)
UDP buffer size:  208 KByte (default)
------------------------------------------------------------
[  3] local 10.10.0.78 port 41621 connected with 10.10.1.168 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   114 MBytes  95.3 Mbits/sec
[  3] Sent 81058 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec   114 MBytes  95.2 Mbits/sec   0.166 ms    0/81058 (0%)

이번에는 95.2 Mbits/sec로 나오네요. 역시 중간에 100M 허브때문에 1G 속도는 나오지 않고 있습니다.


이번에는 양방향으로 테스트해보겠습니다. (Bidirectional Tests)

A(Server)와 B(Client)의 역할을 바꿔 가며 테스트하게 됩니다. 

한번은 A가 Server로 다시 한번은 B가 Server로 역할을 바꿔가며 테스트 합니다.


A(Server)에 tcp 측정과 같이 서버를 실행시킵니다.

$ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------

B(Client)에서 -d 옵션을 추가해 실행해 줍니다.

$ iperf -c 10.10.1.168 -d
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
------------------------------------------------------------
Client connecting to 10.10.1.168, TCP port 5001
TCP window size:  170 KByte (default)
------------------------------------------------------------
[  5] local 10.10.0.78 port 55964 connected with 10.10.1.168 port 5001
[  4] local 10.10.0.78 port 5001 connected with 10.10.1.168 port 51236
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0-10.0 sec   110 MBytes  91.7 Mbits/sec
[  4]  0.0-10.0 sec   110 MBytes  91.5 Mbits/sec

-d 옵션을 추가해 실행하면 B가 먼저 서버 역할을 하고 A가 Client역할을 합니다. 측정이 끝나면 A가 서버 역할을 하고 B가 Client 역할을 합니다. 이렇게 역할을 바꿔가며 양방향의 대역폭을 체크 하게 됩니다.

A(Server)에서도 아래와 같이 출력됩니다.

------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  4] local 10.10.1.168 port 5001 connected with 10.10.0.78 port 55964
------------------------------------------------------------
Client connecting to 10.10.0.78, TCP port 5001
TCP window size:  144 KByte (default)
------------------------------------------------------------
[  6] local 10.10.1.168 port 51236 connected with 10.10.0.78 port 5001
[ ID] Interval       Transfer     Bandwidth
[  6]  0.0-10.0 sec   110 MBytes  91.8 Mbits/sec
[  4]  0.0-10.1 sec   110 MBytes  90.8 Mbits/sec

양방향 모두 90Mbits/sec 이상으로 나오고 있습니다. 양쪽에서 측정한 데이터가 조금 다르기는 하네요.


몇 가지 옵션을 더 알아 봅시다.


대역폭 측정 시간을 (기본 10초에서) 30초로 변경해 진행합니다.

B(Client)에서 iperf -c 10.10.1.168로 측정하면 기본 10초간 데이터를 전송하며 대역폭을 측정하게 됩니다. 이걸 30초 동안 데이터를 전송해가며 측정하게 합니다.

옵션은 -t 이며, 뒤에 측정하려는 시간(초)를 추가합니다. 30초 동안 측정하려면 -t 30 입니다.

$ iperf -c 10.10.1.168 -t 30
------------------------------------------------------------
Client connecting to 10.10.1.168, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[  3] local 10.10.0.78 port 55968 connected with 10.10.1.168 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-30.0 sec   337 MBytes  94.1 Mbits/sec

출력된 데이터의 마지막 줄에 아래와 같이 30초 동안 측정된 데이터가 있습니다.

[  3]  0.0-30.0 sec   337 MBytes  94.1 Mbits/sec


1초 간격으로 측정한 데이터를 출력합니다.

대역폭 측정을 시작하면 기본 10초 동안 아무런 출력이 없다 10초가 지난 뒤 결과 데이터를 출력합니다.

이걸 1초 간격으로 측정한 데이터를 출력하게 합니다. 옵션은 -i 이며, 뒤에 간격(초)를 추가합니다. 1초 간격이라면 -i 1 입니다.

$ iperf -c 10.10.1.168 -i 1
------------------------------------------------------------
Client connecting to 10.10.1.168, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[  3] local 10.10.0.78 port 55970 connected with 10.10.1.168 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0- 1.0 sec  11.8 MBytes  98.6 Mbits/sec
[  3]  1.0- 2.0 sec  11.2 MBytes  94.4 Mbits/sec
[  3]  2.0- 3.0 sec  11.1 MBytes  93.3 Mbits/sec
[  3]  3.0- 4.0 sec  11.2 MBytes  94.4 Mbits/sec
[  3]  4.0- 5.0 sec  11.1 MBytes  93.3 Mbits/sec
[  3]  5.0- 6.0 sec  11.2 MBytes  94.4 Mbits/sec
[  3]  6.0- 7.0 sec  11.1 MBytes  93.3 Mbits/sec
[  3]  7.0- 8.0 sec  11.2 MBytes  94.4 Mbits/sec
[  3]  8.0- 9.0 sec  11.1 MBytes  93.3 Mbits/sec
[  3]  9.0-10.0 sec  11.2 MBytes  94.4 Mbits/sec
[  3]  0.0-10.0 sec   112 MBytes  94.2 Mbits/sec


이번에는 클라이언트 포트를 여러개 열어 동시에 측정합니다.

기본적으로 클라이언트에서 하나를 열고 데이터를 전달하며 측정하는데, 여러개의 포트를 열고 동시에 측정하게 합니다.

옵션은 -P 이고 오픈하려는 포트 수를 추가합니다.

5개의 포트로 측정하려면 -P 5입니다.

$ iperf -c 10.10.1.168 -P 5
------------------------------------------------------------
Client connecting to 10.10.1.168, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[  7] local 10.10.0.78 port 56022 connected with 10.10.1.168 port 5001
[  3] local 10.10.0.78 port 56014 connected with 10.10.1.168 port 5001
[  6] local 10.10.0.78 port 56018 connected with 10.10.1.168 port 5001
[  5] local 10.10.0.78 port 56016 connected with 10.10.1.168 port 5001
[  4] local 10.10.0.78 port 56020 connected with 10.10.1.168 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  21.6 MBytes  18.1 Mbits/sec
[  5]  0.0-10.0 sec  27.5 MBytes  23.0 Mbits/sec
[  6]  0.0-10.1 sec  21.1 MBytes  17.6 Mbits/sec
[  7]  0.0-10.1 sec  18.0 MBytes  15.0 Mbits/sec
[  4]  0.0-10.1 sec  25.5 MBytes  21.2 Mbits/sec
[SUM]  0.0-10.1 sec   114 MBytes  94.6 Mbits/sec

포트 5개로 동시에 데이터를 전송하기 때문에 5개로 대역폭이 나눠지게 됩니다.

5개의 대역폭을 합하면 전체 대역폭이 됩니다.


여기까지 Linux에서 iperf를 이용한 속도 체크 였습니다.


Comments