zMonkey is an open-source 200G network impairment emulator tool to emulate the real-world WAN/DC conditions for your applications. it can support 90Mpps packet forwarding with latency, jitter and packet drop simulation.
Latency/Jitter accuracy is around 200 microsecond, packet drop rate accuracy is a round 0.1%
zMonkey is based on DPDK and provide a udp based northbound interface for remote controller change the simulated latency/jitter/loss.
============================================================================================================================================ zMonkey Network Chaos System (by zartbot) LeftPort-------->>>>>>>>>>--------->>>>>>>>> | <<<<<<<<<--------<<<<<<<<<<---------RightPort | Latency : 10000 us | Latency : 0 us Jitter : 0 us | Jitter : 0 us Loss : 0 %% | Loss : 0 %% Duplicate : 0 %% | Duplicate : 0 %% | Total RX : 68276668 pps ---> | <--- Total RX : 6176950 pps Total TX : 6176950 pps <--- | ---> Total TX : 68281475 pps -------------------------------------------------------------------------------------------------------------------------------------------- Monkey[ 0] 4091413 --> LeftPort --> [Drop 0 -->(Q-Depth 40282|Fail 0)--> DeQ 4092640] --> RightPort --> 4092628 Monkey[ 1] 4084706 --> LeftPort --> [Drop 0 -->(Q-Depth 39992|Fail 0)--> DeQ 4086496] --> RightPort --> 4086483 Monkey[ 2] 4340355 --> LeftPort --> [Drop 0 -->(Q-Depth 42786|Fail 0)--> DeQ 4341760] --> RightPort --> 4341781 Monkey[ 3] 4331071 --> LeftPort --> [Drop 0 -->(Q-Depth 42617|Fail 0)--> DeQ 4330944] --> RightPort --> 4330951 Monkey[ 4] 4318890 --> LeftPort --> [Drop 0 -->(Q-Depth 42145|Fail 0)--> DeQ 4320416] --> RightPort --> 4320417 Monkey[ 5] 4318237 --> LeftPort --> [Drop 0 -->(Q-Depth 44043|Fail 0)--> DeQ 4316896] --> RightPort --> 4316896 Monkey[ 6] 4321452 --> LeftPort --> [Drop 0 -->(Q-Depth 43103|Fail 0)--> DeQ 4319104] --> RightPort --> 4319119 Monkey[ 7] 4332730 --> LeftPort --> [Drop 0 -->(Q-Depth 46148|Fail 0)--> DeQ 4331424] --> RightPort --> 4331417 Monkey[ 8] 4317736 --> LeftPort --> [Drop 0 -->(Q-Depth 43199|Fail 0)--> DeQ 4319424] --> RightPort --> 4319428 Monkey[ 9] 4320157 --> LeftPort --> [Drop 0 -->(Q-Depth 43567|Fail 0)--> DeQ 4322016] --> RightPort --> 4322016 Monkey[ 10] 4332787 --> LeftPort --> [Drop 0 -->(Q-Depth 43934|Fail 0)--> DeQ 4332160] --> RightPort --> 4332139 Monkey[ 11] 4319630 --> LeftPort --> [Drop 0 -->(Q-Depth 43216|Fail 0)--> DeQ 4321536] --> RightPort --> 4321538 Monkey[ 12] 4085023 --> LeftPort --> [Drop 0 -->(Q-Depth 41323|Fail 0)--> DeQ 4085216] --> RightPort --> 4085216 Monkey[ 13] 4091710 --> LeftPort --> [Drop 0 -->(Q-Depth 42466|Fail 0)--> DeQ 4090976] --> RightPort --> 4090975 Monkey[ 14] 4329958 --> LeftPort --> [Drop 0 -->(Q-Depth 42092|Fail 0)--> DeQ 4330176] --> RightPort --> 4330186 Monkey[ 15] 4340813 --> LeftPort --> [Drop 0 -->(Q-Depth 42871|Fail 0)--> DeQ 4340288] --> RightPort --> 4340285 -------------------------------------------------------------------------------------------------------------------------------------------- Monkey[ 0] 384868 <-- LeftPort <-- [DeQ 384868 <--(Q-Depth 0|Fail 0)<-- Drop 0] <-- RightPort <-- 384868 Monkey[ 1] 389342 <-- LeftPort <-- [DeQ 389342 <--(Q-Depth 0|Fail 0)<-- Drop 0] <-- RightPort <-- 389342 Monkey[ 2] 480953 <-- LeftPort <-- [DeQ 480953 <--(Q-Depth 0|Fail 0)<-- Drop 0] <-- RightPort <-- 480953 Monkey[ 3] 389303 <-- LeftPort <-- [DeQ 389303 <--(Q-Depth 0|Fail 0)<-- Drop 0] <-- RightPort <-- 389303 Monkey[ 4] 381398 <-- LeftPort <-- [DeQ 381398 <--(Q-Depth 0|Fail 0)<-- Drop 0] <-- RightPort <-- 381398 Monkey[ 5] 387385 <-- LeftPort <-- [DeQ 387385 <--(Q-Depth 0|Fail 0)<-- Drop 0] <-- RightPort <-- 387385 Monkey[ 6] 286082 <-- LeftPort <-- [DeQ 286082 <--(Q-Depth 0|Fail 0)<-- Drop 0] <-- RightPort <-- 286082 Monkey[ 7] 389327 <-- LeftPort <-- [DeQ 389327 <--(Q-Depth 0|Fail 0)<-- Drop 0] <-- RightPort <-- 389327 Monkey[ 8] 286569 <-- LeftPort <-- [DeQ 286569 <--(Q-Depth 0|Fail 0)<-- Drop 0] <-- RightPort <-- 286569 Monkey[ 9] 387979 <-- LeftPort <-- [DeQ 387979 <--(Q-Depth 0|Fail 0)<-- Drop 0] <-- RightPort <-- 387979 Monkey[ 10] 380284 <-- LeftPort <-- [DeQ 380284 <--(Q-Depth 0|Fail 0)<-- Drop 0] <-- RightPort <-- 380284 Monkey[ 11] 388636 <-- LeftPort <-- [DeQ 388636 <--(Q-Depth 0|Fail 0)<-- Drop 0] <-- RightPort <-- 388636 Monkey[ 12] 476803 <-- LeftPort <-- [DeQ 476803 <--(Q-Depth 0|Fail 0)<-- Drop 0] <-- RightPort <-- 476803 Monkey[ 13] 387778 <-- LeftPort <-- [DeQ 387778 <--(Q-Depth 0|Fail 0)<-- Drop 0] <-- RightPort <-- 387778 Monkey[ 14] 389524 <-- LeftPort <-- [DeQ 389524 <--(Q-Depth 0|Fail 0)<-- Drop 0] <-- RightPort <-- 389524 Monkey[ 15] 390719 <-- LeftPort <-- [DeQ 390719 <--(Q-Depth 0|Fail 0)<-- Drop 0] <-- RightPort <-- 390719 ============================================================================================================================================
1.support 100Gbps with 100ms latency, you must change the DPDK MBUF limit in the following file and re-compile DPDK.
Modify dpdk-21.08/config/rte_config.h
/* EAL defines */ #define RTE_MAX_HEAPS 32 #define RTE_MAX_MEMSEG_LISTS 512 //128 #define RTE_MAX_MEMSEG_PER_LIST 32768 //8192 #define RTE_MAX_MEM_MB_PER_LIST 131072 //32768 #define RTE_MAX_MEMSEG_PER_TYPE 131072 //32768 #define RTE_MAX_MEM_MB_PER_TYPE 262144 //65536
- git clone and build
git clone https://github.com/zartbot/zmonkey
cd zmonkey
build
sudo ./build/zmonkey -- -h zmonkey [EAL options] -- <Parameters> -f --first_lcore First lcore used for forwarding thread -n --core_num Number of lcore used for forwarding -m --mbuf_size Number of elements in mbuf -r --ring_size Number of elements in mbuf -c --control_port Remote control udp port(default:6666) zMonkey chaos config -d --l2r_latency Left -> Right Delay time [us] -D --r2l_latency Right -> Left Delay time [us] -j --l2r_jitter Left -> Right Jitter time [us] -J --r2l_jitter Right -> Left Jitter time [us] -l --l2r_loss Left -> Right Loss rate [%%] -L --r2l_loss Right -> Left Loss rate [%%] -u --l2r_dup Left -> Right Duplicate rate [%%] -U --r2l_dup Right -> Left Duplicate rate [%%] Example: 8-Thread to handle 100G/100ms latency with 12.34% packet drop_rate zmonkey -- --first_lcore 24 --core_num 8 --mbuf_size 2097152 --l2r_latency 100000 --l2r_loss 1234 16-Thread with 1M element buffer per thread,first lcore start at core.24 zmonkey -- --first_lcore 24 --core_num 16 --mbuf_size 1048576 --l2r_latency 10000 Short parameters zmonkey -- -f 24 -n 12 -m 2097152 -d 100000 -D 100000
check the example code in control/python
import socket import random import time udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) monkeyHost = ('127.0.0.1',6666) # instr # 1: config latency # 2: config jitter in micro seconds # 3: config packet drop rate in %%(1/10000) # 4: config packet duplication rate in %%(1/10000) # # direction # 0: left-->right # 1: right-->left # # value uint64_t instr = 3 direction = 0 value = 1234 sendData = str(instr) +"," + str(direction) +","+ str(value) udpSocket.sendto(sendData.encode(),monkeyHost)