Мы хотели бы смоделировать влияние локальности с помощью виртуальных машин в публичном облаке (скажем, AWS EC2).
Для этого мы хотели бы добавить задержки в пакеты, чтобы можно было моделировать конкретную топологию сети.
Предположим, что существует три виртуальных машины: A, B, C
|
A | <- 5 μs delay -> B
| <---- 25 μs delay ----> C
Как нам проще всего ввести задержку 5 мкс (или любое произвольное значение) для соединений между A и B по сравнению с задержкой 25 мкс между A и C? Приветствуется любое решение (изменение уровня ядра Linux на каждой виртуальной машине / создание оверлейной сети / ...).
Создание задержек можно смоделировать с помощью алгоритмов формирования трафика, поддерживаемых ядром Linux. Из руководства netem
:
# tc qdisc add dev eth0 root handle 1: prio
# tc qdisc add dev eth0 parent 1:3 handle 30: tbf rate 20kbit buffer 1600 limit 3000
# tc qdisc add dev eth0 parent 30:1 handle 31: netem delay 200ms 10ms distribution normal
# tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 match ip dst <IP_of_server_B>/32 flowid 1:3
Который, при запуске на сервере A, создает задержку 200 мс со случайным изменением ± 10 мс в трафике к серверу B.