Моделюйте затримки та падіння пакетів у Linux


246

Я б хотів імітувати затримку та втрати пакетів для UDPта TCPв Linux для вимірювання продуктивності програми. Чи є простий спосіб це зробити?



1
Про OS X дивіться: superuser.com/questions/173882/…
Lenar Hoyt

Відповіді:


323

netem використовує функціональні можливості, вже вбудовані в утиліти Linux та користувача, щоб імітувати мережі. Це саме те, на що йдеться у відповіді Марка, іншим ім’ям.

Приклади на їх домашній сторінці вже показують, як можна досягти того, про що ви просили:

Приклади

Емуляція широкої затримки мережі

Це найпростіший приклад, він просто додає фіксовану кількість затримки до всіх пакетів, що виходять з локальної Ethernet.

# tc qdisc add dev eth0 root netem delay 100ms

Тепер простий тест пінгу для розміщення в локальній мережі повинен показати збільшення 100 мілісекунд. Затримка обмежена тактовою роздільною здатністю ядра (Гц). У більшості 2.4 системних синхросигналів працює частота 100 Гц, що дозволяє затримувати з кроком 10 мс. На 2.6 значення є параметром конфігурації від 1000 до 100 Гц.

Пізніші приклади просто змінюють параметри, не завантажуючи qdisc

Реальні мережі широкої площі показують мінливість, тому можна додати випадкові зміни.

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

Це призводить до того, що додана затримка становить 100 ± 10 мс. Варіант затримки в мережі не є виключно випадковим, тому можна пересвідчитись, що існує значення кореляції.

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

Це призводить до того, що додана затримка становитиме 100 ± 10 мс із наступним випадковим елементом залежно від 25% від останнього. Це не справжня статистична кореляція, а наближення.

Затримка розподілу

Зазвичай затримка в мережі неоднакова. Для опису варіації затримки частіше використовувати щось на зразок звичайного розподілу. Нетемна дисципліна може скласти таблицю, щоб вказати нерівномірний розподіл.

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

Фактичні таблиці (нормальні, парето, паротонормальні) генеруються як частина компіляції iproute2 та розміщуються в / usr / lib / tc; тому можливо з певними зусиллями зробити власний розподіл на основі експериментальних даних.

Втрата пакету

Випадкові втрати пакетів задаються в команді 'tc' у відсотках. Найменше можливе ненульове значення:

2 −32 = 0,0000000232%

# tc qdisc change dev eth0 root netem loss 0.1%

Це спричиняє випадкове скидання 1/10 відсотка (тобто 1 з 1000) пакетів.

Необов'язкове співвідношення також може бути додане. Це призводить до того, що генератор випадкових чисел є менш випадковим і може бути використаний для імітації втрат при розриві пакетів.

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

Це призведе до втрати 0,3% пакетів, і кожна наступна ймовірність залежить на чверть від останнього.

Зонд 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,33е-10
ефеміент

34
Зауважте, що tc -p qdisc ls dev eth0буде перераховано поточні визначені правила та tc qdisc del dev eth0 rootбуде видалено їх
Quamis

1
вимагає вказувати на помилку при спробі змінити неіснуючий запис
Нео

Чи знаєте ви, чому я отримую ці помилки? ubuntu @ anmol-vm1-new: / home / hadoop / yarnpp / workloads / РЕЗУЛЬТИ $ sudo tc qdisc додати dev eth0 root netem затримка 100ms RTNETLINK відповіді: Файл існує ubuntu @ anmol-vm1-new: / home / hadoop / yarnpp / завантаження / РЕЗУЛЬТАТИ $ sudo tc qdisc змінити dev eth0 root netem затримка 100ms RTNETLINK відповіді: Недійсний аргумент serverfault.com/questions/743885/…
Mona Jalal

Напевно, було б хорошою ідеєю включити деталі, як обмежити пропускну здатність усіх інтерфейсів для імітації низькошвидкісних ліній
Pavel P

91

Для скинутих пакетів я просто використовував iptables та модуль статистики .

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

Зверху випаде вхідний пакет з імовірністю 1%. Будьте уважні, будь-що вище приблизно 0,14, і більшість з вас підключенням tcp, швидше за все, повністю зупиниться.

Погляньте на iptables man і знайдіть "статистику" для отримання додаткової інформації.


6
Чому TCP-з'єднання стоять на рівні понад 14%?
Девід Волвер

2
@DavidWolever: через те, як регулюється розмір розсувних вікон tcp. Але 14% виключно з досвіду, спробуйте спробувати себе, і ви побачите, що ssh стає здебільшого непридатним на рівні 14% і вище, але насправді працює досить добре при нижчих рівнях падіння пакетів.
Bjarke Freund-Hansen

12
Для безпеки, мабуть, найкраще обмежити правило застосовувати лише до портів, які ви хочете перевірити: iptables -A INPUT --повідомте про статистику FOO -m .... Таким чином, ваш ssh та інші з'єднання будуть залишатись непорушеними, і ви можете збільшити ставку падіння послуги, що цікавить, щоб швидше відтворити будь-які проблеми з нею.
Михайло Т.

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 .


3

Цей підручник з моделювання фізики мереж містить клас C ++ у зразковому коді для імітації затримки та втрати пакетів у з'єднанні UDP і може бути орієнтовним. Перегляньте загальнодоступні затримки та змінні packetLoss класу Connection, знайдені у файлі Connection.h вихідного коду, який можна завантажити .


1

Я сам не пробував цього, але на цій сторінці є перелік модулів плагінів, які працюють у Linux, вбудованому в систему фільтрації IP-адрес iptables. Один з модулів називається "nth" і дозволяє налаштувати правило, яке знизить настроювану швидкість пакетів. Можливо, принаймні гарне місце для початку.



1

Простий у користуванні мережевий інструмент введення несправностей - це Saboteur . Він може імітувати:

  • Загальний розділ мережі
  • Віддалений сервіс мертвий (не слухаючи очікуваного порту)
  • Затримки
  • Час очікування з'єднання - втрата пакету (як це часто буває, коли дві системи розділені потужним брандмауером)

1
На жаль, остання прихильність до цього проекту була 28 серпня 2015 року, тобто майже 4 роки тому. Зараз відкритим питанням вже 5 років.
Алі

1

Одним з найбільш використовуваних інструментів у науковому співтоваристві для цієї мети є DummyNet . Після встановлення ipfwмодуля ядра, щоб запровадити затримку розповсюдження 50 мс між двома машинами, просто запустіть ці команди:

./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

Тут докладніше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.