두 개의 우분투 서버 시스템 간의 느린 연결 시뮬레이션


9

다음 시나리오를 시뮬레이트하려고합니다. 4 개의 우분투 서버 시스템 A, B, C 및 D가있는 경우 시스템 A와 시스템 C 사이에서 네트워크 대역폭을 20 %, A와 B 사이에서 10 % 줄이려고합니다. 네트워크 시뮬레이션 / 스로틀 링 도구를 사용하여이 작업을 수행합니까?


iptables에는 조절 기능이있을 수 있습니다. 나는 그것을 사용하지 않았지만 조사 할 가치가 있습니다.
Michael Martinez

@MichaelMartinez 아닙니다. tciptables 표시와 함께 사용할 때 수행합니다.
Xavier Lucas

@XavierLucas 님이 좋아합니다!
Michael Martinez

답변:


15

이렇게하려면 필터 를 tc단독으로 u32사용하거나 iptables 표시 와 결합하여 사용할 수 있습니다 (복잡한 필터 구문을 배우고 싶지 않은 경우 더 간단 할 수 있음). 다음 게시물에서 이전 솔루션에 대해 자세히 설명하겠습니다.


설정 시뮬레이션

예를 들어 10Mbit / s 가상 인터페이스를 실행하는 A, B, C 및 D를 고려해 봅시다 .

당신은 기본적으로 원합니다 :

  • A <==> B : 송신을위한 9Mbit / s 형성
  • A <==> C : 송신을 위해 형성되는 8Mbit / s

이를 시뮬레이션하기 위해 브리지에 연결된 4 개의 네트워크 네임 스페이스와 가상 이더넷 인터페이스를 만듭니다.

물론, 귀하의 경우 실제 NIC로 작업하고 브리지는 인프라에 따라 게이트웨이 또는 스위치가됩니다.

시뮬레이션에서 우리는 10.0.0.0/24 네트워크에서 다음과 같은 설정을 할 것입니다.

                                  10.0.0.254            

                                  +-------+                     
                                  |       |                     
                                  |  br0  |                     
                                  |       |                   
                                  +---+---+                     
                                      |                         
                                      | veth{A..D}.peer        
                                      |                      
                  +------------+------+-----+------------+     
                  |            |            |            |      
            vethA |      vethB |      vethC |      vethD |      
              +---+---+    +---+---+    +---+---+    +---+---+  
              |       |    |       |    |       |    |       |   
              |   A   |    |   B   |    |   C   |    |   D   |   
              |       |    |       |    |       |    |       |  
              +-------+    +-------+    +-------+    +-------+    

              10.0.0.1      10.0.0.2     10.0.0.3     10.0.0.4           

먼저 설정 단계를 통해 구성 내용을 이해하고 익숙하지 않은 경우 건너 뛰십시오. 그러나 알아야 할 것은 명령 ip netns exec <namespace> <command>이 네트워크 네임 스페이스 (즉, 이전 그리기의 상자 중 하나)에서 명령을 실행할 수 있다는 것입니다. 이것은 다음 섹션에서도 사용됩니다.

# Create the bridge
ip link add br0 type bridge

# Create network namespaces and veth interfaces and plug them into the bridge
for host in {A..D} ; do 
    ip link netns add ${host}
    ip link add veth${host} type veth peer name veth${host}.peer
    ip link set dev veth${host}.peer master br0
    ip link set dev veth${host} netns ${host}
    ip netns exec ${host} ip link set veth${host} up
done

# Assign IPs
ip addr add 10.0.0.254/24 dev br0
ip netns exec A ip addr add 10.0.0.1/24 dev vethA
ip netns exec B ip addr add 10.0.0.2/24 dev vethB
ip netns exec C ip addr add 10.0.0.3/24 dev vethC
ip netns exec D ip addr add 10.0.0.4/24 dev vethD

이 시점에서 앞에서 설명한 설정이 있습니다.


트래픽 형성

원하는 것을 얻기 위해 교통 통제에 들어갈 시간입니다. 이 tc도구를 사용하면 큐잉 규칙을 추가 할 수 있습니다.

  • 송신 : 커널이 패킷을 보내야하고 NIC 드라이버에 액세스하기 전에.
  • 수신 : NIC 드라이버에 액세스 한 후 커널 루틴이 수신 된 패킷을 통해 실행되기 전에.

qdisc , 클래스필터의 3 가지 개념이 있습니다 . 이러한 개념은 복잡한 패킷 흐름 관리를 설정하고 원하는 기준 / 기준에 따라 트래픽의 우선 순위를 지정하는 데 사용할 수 있습니다.

간단히 말해서 :

  • Qdiscs는 패킷을 대기열에 넣거나 대기열에 넣는 구조입니다.
  • 클래스는 특정 동작으로 작동하는 qdisc의 컨테이너입니다.
  • 필터는 클래스간에 패킷을 라우팅하는 방법으로, 처리 중 우선 순위를 사용하여 동일한 진입 점에 여러 개를 정의 할 수 있습니다.

이 모든 것은 일반적으로 나뭇잎이 qdiscs이고 클래스가 노드 인 트리로 작동합니다. 트리 또는 하위 트리의 루트는로 선언 <id>:되고 하위 노드는로 선언됩니다 <parent_id>:<children_id>. 이 구문을 명심하십시오.

귀하의 경우 A를 가져 와서 설정하려는 트리를 렌더링하십시오 tc.

                                     1:
                                      |
                                      |
                                      |
                                     1:1
                                   /  |  \
                                  /   |   \
                                 /    |    \
                               1:10  1:20  1:30
                                |     |     |
                                |     |     |
                               :10   :20   :30

설명 :

  • 1:장치 vethA에 연결된 루트 qdisc이며, htb계층 토큰 버킷 과 같이 명시 적으로 가져옵니다 (장치의 기본 qdisc 는 OS에 따라 다르거 pfifopfifo_fastOS에 따라 다름). 대역폭 관리에 특히 적합합니다. 이 수준에서 정의 된 필터와 일치하지 않는 패킷은 1:30클래스 로 이동합니다 .
  • 1:1htb디바이스의 전체 트래픽을 10Mbit / s로 제한 하는 클래스 가됩니다 .
  • 1:10htb출력 트래픽을 9Mbit / s (10Mbit / s의 90 %)로 제한 하는 클래스 가됩니다 .
  • 1:20htb출력 트래픽을 8Mbit / s (10Mbit / s의 80 %)로 제한 하는 클래스 가됩니다 .
  • 1:30htb트래픽을 10Mbit / s (폴백)로 제한 하는 클래스 가됩니다 .
  • :10, :20, :30있는 sfq확률 공정성 큐의 qdisc를. 다시 말해,이 qdisc는 흐름을 기반으로 전송 스케줄링에서 공정성을 보장 할 것입니다.

이 모든 것은 다음 명령으로 설정됩니다.

ip netns exec A tc qdisc add dev vethA root handle 1: htb default 30
ip netns exec A tc class add dev vethA parent 1: classid 1:1 htb rate 10mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:10 htb rate 9mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:20 htb rate 8mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:30 htb rate 10mbit burst 15k
ip netns exec A tc qdsic add dev vethA parent 1:10 handle 10: sfq perturb 10
ip netns exec A tc qdisc add dev vethA parent 1:20 handle 20: sfq perturb 10
ip netns exec A tc qdisc add dev vethA parent 1:30 handle 30: sfq perturb 10

마지막으로 필요한 것은 필터를 추가하여 대상 IP가 B 인 1:10IP 패킷이 클래스 로 이동 하고 대상 IP가 C 인 IP 패킷이 클래스 로 이동하는 필터를 추가하는 것입니다 1:20.

ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 1 u32 match ip dst 10.0.0.2/32 flowid 1:10
ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 2 u32 match ip dst 10.0.0.3/32 flowid 1:20

이제 아이디어를 얻었 tc으므로 B와 C에 비슷한 규칙을 추가해야합니다. 그러므로 이러한 굴착 장치에서 A쪽으로의 전송도 형성됩니다.


테스팅

이제 테스트 해 봅시다. 이것을 개인적으로 사용하는 데 사용하기 위해 iperf클라이언트 또는 서버로 실행할 수있는 단일 바이너리로 구성되어 있으며 두 호스트간에 최대한 많은 트래픽을 자동으로 보냅니다.

A와 B 사이 :

 $ ip netns exec B iperf -s -p 8001
  ...
 $ ip netns exec A iperf -c 10.0.0.2 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.2, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  5] local 10.0.0.1 port 58191 connected with 10.0.0.2 port 8001
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0- 2.0 sec  2.38 MBytes  9.96 Mbits/sec
[  5]  2.0- 4.0 sec  2.12 MBytes  8.91 Mbits/sec
[  5]  4.0- 6.0 sec  2.00 MBytes  8.39 Mbits/sec
[  5]  6.0- 8.0 sec  2.12 MBytes  8.91 Mbits/sec
[  5]  8.0-10.0 sec  2.00 MBytes  8.39 Mbits/sec
[  5]  0.0-10.1 sec  10.8 MBytes  8.91 Mbits/sec

우리는 9Mbit / s 대역폭을 가지고 있습니다.

A와 C 사이 :

$ ip netns exec C iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.3 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.3, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  5] local 10.0.0.1 port 58522 connected with 10.0.0.3 port 8001
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0- 2.0 sec  2.25 MBytes  9.44 Mbits/sec
[  5]  2.0- 4.0 sec  1.75 MBytes  7.34 Mbits/sec
[  5]  4.0- 6.0 sec  1.88 MBytes  7.86 Mbits/sec
[  5]  6.0- 8.0 sec  1.88 MBytes  7.86 Mbits/sec
[  5]  8.0-10.0 sec  1.75 MBytes  7.34 Mbits/sec
[  5]  0.0-10.1 sec  9.62 MBytes  7.98 Mbits/sec

우리는 8Mbit / s 대역폭을 가지고 있습니다.

A와 D 사이 :

$ ip netns exec D iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.4 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.4, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  5] local 10.0.0.1 port 40614 connected with 10.0.0.4 port 8001
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0- 2.0 sec  2.62 MBytes  11.0 Mbits/sec
[  5]  2.0- 4.0 sec  2.25 MBytes  9.44 Mbits/sec
[  5]  4.0- 6.0 sec  2.38 MBytes  9.96 Mbits/sec
[  5]  6.0- 8.0 sec  2.25 MBytes  9.44 Mbits/sec
[  5]  8.0-10.0 sec  2.38 MBytes  9.96 Mbits/sec
[  5]  0.0-10.2 sec  12.0 MBytes  9.89 Mbits/sec

여기에 우리의 가상 인터페이스 최대 속도가 10 메가 비트를 / S 에 도달했다.

htb매개 변수 의 첫 번째 측정 버스트 는 적절한 매개 변수를 조정하여 클래스 에서 더 잘 처리 할 수 ​​있습니다 .


청소

제거 :

  • 우선 순위에 1 필터 1:: tc filter del dev vethA parent 1: prio 1 u32.
  • 의 모든 필터 1:: tc filter del dev vethA parent 1:.
  • 수업 1:20과 그 자녀들 : tc class del dev vethA parent 1:1 classid 1:20.
  • 전체 나무 : tc qdisc del dev vethA.

시뮬레이션 세트를 정리하려면 다음을 수행하십시오.

# Remove veth pairs and network namespaces
for host in {A..D} ; do
    ip link del dev veth${host}.peer
    ip netns del ${host}
done

# Remove the bridge
ip link del dev br0

1
답장을 보내 주셔서 감사합니다. 가능하면 필터를 제거하는 명령을 추가 할 수 있습니까? 시뮬레이션 후 누군가이 설정을 안전하게 롤백하려는 경우를 대비하여.
Yehia Elshater

1
@YahiaZakaria 방금이 정보를 내 게시물의 후반부에 추가했습니다.
Xavier Lucas

0

우분투에는 FreeBSD에서 IPFW를 포팅했으며, IPFW에는 DUMMYNET이있어 대역폭, 지연, 패킷 손실률 등 다양한 네트워크 매개 변수를 관리 할 수 ​​있습니다.


0

가장 좋은 방법은 tc 도구를 현재 통합 된 (최소한 우분투 서버에서) netem 모듈과 함께 사용하는 것입니다. 이 기사에서 자세한 정보는 Stackoverflow 에서 찾을 수 있습니다 .


Netem은 rtt 및 혼잡 에뮬레이션에 관한 것이며 bandwith에 관한 것이 아닙니다.
Xavier Lucas

1
@XavierLucas, 당신은 맞습니다. 대역폭조차도 netem없이 tc 만 있으면됩니다.
Luc Stepniewski

0

물방울이 잘 작동합니다.

이 토론은 몇 가지 제한 사항을 보여줍니다 : /unix/109973/how-to-change-speed-limit-of-running-trickle-instance


Trickle은 특정 프로그램에 대한 네트워크 대역을 시뮬레이션하는 데 사용됩니다. OP는 호스트 범위에서 솔루션을 찾는 것 같습니다.
Xavier Lucas

Trickled를 사용하여 단일 연결이 아닌 연결 그룹을 시뮬레이션 할 수 있습니다. 실제로이 질문은 "모든 호스트 간 연결"로 해석 될 수 있습니다.
Mathew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.