---
name: "mm-delay"
section: "1"
platform: "linux"
package: "mahimahi"
version: "0.98-1.1+b2"
release: "Debian 11 (Bullseye)"
platforms: ["linux"]
url: "https://new.carta.tech/mahimahi"
---

# mm-delay(1)

lightweight, composable network-emulation tools link emulation: mm-delay, mm-loss, mm-onoff, mm-link analysis scripts: mm-throughput-graph, mm-delay-graph observation: mm-meter record and replay multi-origin websites: mm-webrecord, mm-webreplay

Part of [mahimahi(1)](/mahimahi/1.md).

## NAME

**mahimahi** - lightweight, composable network-emulation tools

link emulation: **mm-delay**, **mm-loss**, **mm-onoff**, **mm-link**

analysis scripts: **mm-throughput-graph**, **mm-delay-graph**

observation: **mm-meter**

record and replay multi-origin websites: **mm-webrecord**, **mm-webreplay**

## DESCRIPTION

**mahimahi** is a suite of user-space tools for network emulation and analysis.

Each mahimahi tool spawns a lightweight container, generally connected to the outside via a synthetic network device that observes packets in transit or emulates a desired behavior.

The tools are composable so that a series of emulated network effects can be chained together, with mahimahi containers nested inside each other. Each tool takes an optional command to execute, so it is possible to create a series of nested containers with one command line.

## LINK EMULATION TOOLS

**mm-delay** *delay* \[*command...*\]

-

  Every packet is delayed by the specified *delay* (in milliseconds) entering and leaving the container.

**mm-loss** uplink\|downlink *rate* \[*command...*\]

-

  Packets are lost at the given *rate* either when leaving (uplink) or entering (downlink) the container. *rate* is a number between 0 and 1.

**mm-onoff** uplink\|downlink *mean-on-time* *mean-off-time* \[*command...*\]

-

  The uplink or downlink will be intermittent and will switch between connected and disconnected states according to a Poisson point process with specified average durations spent "on" and "off".

**mm-link** \[**--uplink-log=*filename***\] \[**--downlink-log=*filename***\] \[**--meter-uplink**\] \[**--meter-uplink-delay**\] \[**--meter-downlink**\] \[**--meter-downlink-delay**\] \[**--once**\] *uplink-filename* *downlink-filename* \[*command...*\]

**mm-throughput-graph**

**mm-delay-graph**

-

  Emulates a throughput-limited link with a specified packet-delivery schedule and analyzes the resulting performance. See [**mm-link**(1)](/mm-link/1.md).

## OBSERVATION TOOLS

**mm-meter** \[**--meter-uplink**\] \[**--meter-downlink**\] \[*command...*\]

-

  Displays an animated live plot of the transfer rate entering or leaving the container.

## RECORD AND REPLAY WEBSITES

**mm-webrecord** *directory* \[*command...*\]

-

  Transparently proxies outgoing HTTP and HTTPS connections, saving the requests, corresponding responses, and IP address of each Web server contacted in the given *directory*. **mm-webrecord** uses a self-signed TLS certificate in its HTTPS proxy, causing typical Web browsers to reject it. For testing or debugging purposes, this behavior can usually be turned off, e.g.: with the **--no-check-certificate** option to [**wget**(1)](/wget/1.md) or the **--ignore-certificate-errors** option to [**chromium-browser**(1)](/chromium-browser/1.md).

**mm-webreplay** *directory* \[*command...*\]

-

  Replays a saved session from a previous run of **mm-webrecord**. Unlike most mahimahi tools, the **mm-webreplay** container does not have a network connection to the outside world. Instead, it has dummy network interfaces bound to each IP address on which a Web server in the saved session had answered a request. **mm-webreplay** runs an [**apache2**(8)](/apache2/8.md) Web server bound to each such IP address inside the container. Each Web server emulates the corresponding server from the saved session. When receiving a request that matches one in the *directory*, the corresponding apache2 replies with the same reply as previously captured.

  **mm-webreplay** can be used to measure the performance of Web browsers on complex websites and the effect of changes in Web protocols (e.g. HTTP, HTTP/2, SPDY, QUIC). Unlike tools like web-page-replay, **mm-webreplay** preserves the sharded structure of a website, binds to the actual IP addresses that the real website used, and serves requests from real Web servers.

## ENVIRONMENT

The MAHIMAHI\_BASE environment variable is set to an IP address of the host, outside any container. This can be used to conduct scripted measurements over a series of mahimahi containers chained together.

## EXAMPLES

To spawn a shell with a delayed, lossy link to the Internet:

-

  ```
  $ mm-delay 50 mm-loss uplink 0.2
  [delay 50 ms] [loss up=0.1] $
  ```

  To run ping over the same link:

-

  ```
  $ mm-delay 50 mm-loss uplink 0.2 sh -c 'ping -c 10 -n $MAHIMAHI_BASE'
  PING 100.64.0.1 (100.64.0.1) 56(84) bytes of data.
  64 bytes from 100.64.0.1: icmp_seq=1 ttl=63 time=101 ms
  64 bytes from 100.64.0.1: icmp_seq=2 ttl=63 time=100 ms
  64 bytes from 100.64.0.1: icmp_seq=4 ttl=63 time=101 ms
  64 bytes from 100.64.0.1: icmp_seq=5 ttl=63 time=100 ms
  64 bytes from 100.64.0.1: icmp_seq=7 ttl=63 time=101 ms
  64 bytes from 100.64.0.1: icmp_seq=8 ttl=63 time=101 ms
  64 bytes from 100.64.0.1: icmp_seq=9 ttl=63 time=101 ms
  64 bytes from 100.64.0.1: icmp_seq=10 ttl=63 time=101 ms
  --- 100.64.0.1 ping statistics ---
  10 packets transmitted, 8 received, 20% packet loss, time 8999ms
  rtt min/avg/max/mdev = 100.910/101.009/101.092/0.279 ms
  ```

  To record a page load from *www.nytimes.com*:

-

  ```
  $ mm-webrecord /tmp/nytimes chromium-browser --ignore-certificate-errors --user-data-dir=/tmp/nonexistent$(date +%s%N) www.nytimes.com
  ```

  The use of *--user-data-dir=/tmp/nonexistent$(date +%s%N)* is to prevent the browser from reusing an existing chromium-browser process.

  To make Chrome retrieve the saved website over a delayed, lossy link whose throughput is limited to 1 full-sized packet per millisecond:

-

  ```
  $ mm-webreplay /tmp/nytimes mm-delay 50 mm-loss uplink 0.1 mm-link <(echo 1) <(echo 1) -- chromium-browser --ignore-certificate-errors --user-data-dir=/tmp/nonexistent$(date +%s%N) www.nytimes.com
  ```

  To emulate a variable cellular network and visualize a process's use of the network:

-

  ```
  $ mm-delay 20 mm-link --meter-all /usr/share/mahimahi/traces/Verizon-LTE-short.up /usr/share/mahimahi/traces/Verizon-LTE-short.down
  [delay 20 ms] [link] $
  ```

## SEE ALSO

[**mm-link**(1)](/mm-link/1.md)

Project home page: *http://mahimahi.mit.edu*

## AUTHOR

Mahimahi was written by Ravi Netravali, Anirudh Sivaraman, Greg D. Hill, Deepak Narayanan, and Keith Winstein.

## BUGS

Please report bugs to *mahimahi@mit.edu*.
