Linux에서 지연 및 손실 된 패킷 시뮬레이션


246

나는에 대한 패킷 지연 및 손실 시뮬레이션 싶습니다 UDPTCP응용 프로그램의 성능을 측정하는 리눅스에 있습니다. 이를 수행하는 간단한 방법이 있습니까?



1
OS X은 다음을 참조하십시오 superuser.com/questions/173882/...
LENAR 호이트

답변:


323

netem 은 이미 Linux 및 사용자 공간 유틸리티에 내장 된 기능을 활용하여 네트워크를 시뮬레이션합니다. 이것은 실제로 Mark의 대답이 다른 이름으로 말하는 것입니다.

홈페이지 의 예는 이미 요청한 내용을 달성하는 방법을 보여줍니다.

광역 네트워크 지연 에뮬레이션

이것은 가장 간단한 예이며 로컬 이더넷에서 나가는 모든 패킷에 고정 된 지연 시간을 추가합니다.

# tc qdisc add dev eth0 root netem delay 100ms

이제 로컬 네트워크에서 호스트하기위한 간단한 핑 테스트는 100 밀리 초의 증가를 보여야합니다. 지연은 커널의 클럭 해상도 (Hz)에 의해 제한됩니다. 대부분의 2.4 시스템에서 시스템 클록은 100Hz에서 실행되며 10ms 단위로 지연 될 수 있습니다. 2.6에서이 값은 1000 ~ 100Hz의 구성 매개 변수입니다.

이후 예제는 qdisc를 다시로드하지 않고 매개 변수를 변경합니다.

실제 광역 네트워크는 변동성을 보여 임의의 변동을 추가 할 수 있습니다.

# tc qdisc change dev eth0 root netem delay 100ms 10ms

이로 인해 추가 된 지연은 100 ± 10ms가됩니다. 네트워크 지연 변동은 순전히 무작위가 아니므로 상관 값도 모방합니다.

# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%

이로 인해 추가 된 지연이 마지막 임의 요소의 25 %에 따라 다음 임의 요소로 100 ± 10ms가됩니다. 이것은 실제 통계적 상관 관계가 아니라 근사치입니다.

배포 지연

일반적으로 네트워크 지연은 일정하지 않습니다. 지연의 변동을 설명하기 위해 정규 분포와 같은 것을 사용하는 것이 더 일반적입니다. netem 분야는 불균일 분포를 지정하기 위해 테이블을 사용할 수 있습니다.

# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal

실제 테이블 (normal, pareto, paretonormal)은 iproute2 컴파일의 일부로 생성되어 / usr / lib / tc에 배치됩니다. 실험 데이터를 기반으로 자신의 배포판을 만드는 것이 가능합니다.

패킷 손실

임의 패킷 손실은 'tc'명령에 백분율로 지정됩니다. 가능한 가장 작은 0이 아닌 값은 다음과 같습니다.

(2) -32 = 0.0000000232 %

# tc qdisc change dev eth0 root netem loss 0.1%

이로 인해 1 / 10 % (즉, 1000 개 중 1 개)의 패킷이 무작위로 삭제됩니다.

선택적 상관 관계가 추가 될 수도 있습니다. 이로 인해 난수 생성기는 난수가 낮아 패킷 버스트 손실을 에뮬레이션하는 데 사용할 수 있습니다.

# tc qdisc change dev eth0 root netem loss 0.3% 25%

이로 인해 패킷의 0.3 %가 손실되고 각 연속 확률은 마지막 패킷의 1/4에 따라 달라집니다.

프로브 n = 0.25 × 프로브 n-1 + 0.75 × 랜덤

참고 당신은 사용해야 tc qdisc add해당 인터페이스에 대한 규칙이없는 경우 또는 tc qdisc change이미 해당 인터페이스에 대한 규칙이있는 경우. tc qdisc change규칙이없는 인터페이스 에서 사용하려고 하면 오류가 발생 RTNETLINK answers: No such file or directory합니다.


2
원래 웹 사이트에 오류가 있습니다. 방금 해당 텍스트를 직접 복사했습니다. 그러나 그렇습니다, 2 ^ (-32) = 2.33e-10
ephemient

34
그 주 tc -p qdisc ls dev eth0현재 정의 된 규칙을 나열합니다 및 tc qdisc del dev eth0 root삭제합니다
Quamis

1
기존 항목이 아닌 항목을 변경하려고 할 때 오류를 지적하기 위해 투표
Neo

이 오류가 발생하는 이유를 알고 있습니까? ubuntu @ anmol-vm1-new : / home / hadoop / yarnpp / workloads / RESULTS $ sudo tc qdisc add dev eth0 root netem delay 100ms RTNETLINK 답변 : 파일 존재 ubuntu @ anmol-vm1-new : / home / hadoop / yarnpp / workloads / RESULTS $ sudo는 TC qdisc를 변경 dev에 eth0를 루트 netem 지연이 RTNETLINK 답변을 100MS : 잘못된 인수 serverfault.com/questions/743885/...
모나 잘랄를

저속 링크를 시뮬레이트하기 위해 전체 인터페이스 처리량을 제한하는 방법을 자세히 포함하는 것이 좋습니다.
Pavel P

91

손실 된 패킷의 경우 단순히 iptables 및 통계 모듈을 사용 합니다 .

iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP

위의 경우 1 % 확률로 들어오는 패킷을 삭제합니다. 약 0.14 이상이며 대부분의 TCP 연결은 완전히 중단 될 수 있으므로주의하십시오.

man iptables를 살펴보고 자세한 정보는 "통계"를 검색하십시오.


6
TCP 연결이 14 % 이상인 이유는 무엇입니까?
David Wolever

2
@DavidWolever : tcp 슬라이딩 윈도우 크기가 조정되는 방식 때문입니다. 그러나 14 %는 순전히 경험에서 나온 것입니다. 직접 시도해보십시오. ssh는 14 % 이상에서는 거의 사용할 수 없지만 실제로는 낮은 수준의 패킷 드롭률에서 잘 작동합니다.
Bjarke Freund-Hansen

12
안전을 위해 테스트하려는 포트에만 적용되도록 규칙을 제한하는 것이 가장 좋습니다. iptables -A INPUT --dport FOO -m statistics .... 이런 식으로 ssh 및 기타 연결은 성가신 상태를 유지하고 관심있는 서비스의 드롭 속도를 높이면 문제를 더 빨리 재현 할 수 있습니다.
Mikhail T.

5
참고 있음 DROP아웃 바운드 연결 오히려 터무니 원인 send()반환에 작업 EPERM보다는 단지 (그것을해야 같은) 패킷을 삭제.
가짜 이름

2
이 명령을 실행 취소하는 데 필요한 전부입니까? iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
jcalfee314

6

내 동료 중 하나가 tc를 사용 하여이 작업을 수행합니다. 자세한 내용은 매뉴얼 페이지를 참조하십시오. 여기에서 사용법의 예를 볼 수 있습니다 .


내가 사용 iptables에 :) 더 쉽게 생각
c4f4t0r

물론, tc는 iptables보다 훨씬 빠릅니다
teknoraver

5

iptables (8)에는 모든 n 번째 패킷을 일치시키는 데 사용할 수있는 통계 일치 모듈이 있습니다. 이 패킷을 삭제하려면 -j DROP를 추가 하십시오 .



1

직접 시도하지는 않았지만 이 페이지 에는 Linux의 내장 iptables IP 필터링 시스템에서 실행되는 플러그인 모듈 목록이 있습니다. 모듈 중 하나를 "nth"라고하며 구성 가능한 패킷 속도를 떨어 뜨리는 규칙을 설정할 수 있습니다. 적어도 시작하기에 좋은 장소 일 수 있습니다.



1

사용하기 쉬운 네트워크 오류 주입 도구는 Saboteur 입니다. 다음을 시뮬레이션 할 수 있습니다.

  • 총 네트워크 파티션
  • 원격 서비스 작동 불능 (예상 포트에서 수신 대기하지 않음)
  • 지연
  • 패킷 손실 -TCP 연결 시간 초과 (두 시스템이 상태 저장 방화벽으로 분리 될 때 자주 발생)

1
안타깝게도이 프로젝트에 대한 마지막 약속은 2015 년 8 월 28 일, 즉 거의 4 년 전이었습니다. 공개 된 문제는 이제 5 살입니다.
Ali

1

과학 커뮤니티에서 가장 많이 사용되는 도구 중 하나는 DummyNet 입니다. ipfw커널 모듈 을 설치 한 후 두 시스템간에 50ms의 전파 지연을 발생 시키려면 다음 명령을 실행하십시오.

./ipfw pipe 1 config delay 50ms
./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2

패킷 손실의 50 %를 발생 시키려면 다음을 실행해야합니다.

./ipfw pipe 1 config plr 0.5

자세한 내용은 여기 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.