Я б хотів імітувати затримку та втрати пакетів для UDP
та TCP
в Linux для вимірювання продуктивності програми. Чи є простий спосіб це зробити?
Я б хотів імітувати затримку та втрати пакетів для UDP
та TCP
в Linux для вимірювання продуктивності програми. Чи є простий спосіб це зробити?
Відповіді:
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
.
tc -p qdisc ls dev eth0
буде перераховано поточні визначені правила та tc qdisc del dev eth0 root
буде видалено їх
Для скинутих пакетів я просто використовував iptables та модуль статистики .
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
Зверху випаде вхідний пакет з імовірністю 1%. Будьте уважні, будь-що вище приблизно 0,14, і більшість з вас підключенням tcp, швидше за все, повністю зупиниться.
Погляньте на iptables man і знайдіть "статистику" для отримання додаткової інформації.
DROP
на вихідних з'єднаннях досить смішно викликає send()
повернення операцій EPERM
, а не просто викидання пакетів (як слід).
iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
Один з моїх колег використовує tc для цього. Для отримання додаткової інформації див. Сторінку чоловіка. Приклад його використання можна подивитися тут .
Цей підручник з моделювання фізики мереж містить клас C ++ у зразковому коді для імітації затримки та втрати пакетів у з'єднанні UDP і може бути орієнтовним. Перегляньте загальнодоступні затримки та змінні packetLoss класу Connection, знайдені у файлі Connection.h вихідного коду, який можна завантажити .
Я сам не пробував цього, але на цій сторінці є перелік модулів плагінів, які працюють у Linux, вбудованому в систему фільтрації IP-адрес iptables. Один з модулів називається "nth" і дозволяє налаштувати правило, яке знизить настроювану швидкість пакетів. Можливо, принаймні гарне місце для початку.
Ви можете спробувати http://snad.ncsl.nist.gov/nistnet/ Це досить старий проект NIST (останній випуск 2005 року), але він працює для мене.
Простий у користуванні мережевий інструмент введення несправностей - це Saboteur . Він може імітувати:
- Загальний розділ мережі
- Віддалений сервіс мертвий (не слухаючи очікуваного порту)
- Затримки
- Час очікування з'єднання - втрата пакету (як це часто буває, коли дві системи розділені потужним брандмауером)
Одним з найбільш використовуваних інструментів у науковому співтоваристві для цієї мети є 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
Тут докладніше.