Tools Software Engineers Should Know: MTR: A network diagnostic tool


We software developers are good at debugging code related issues but when it comes to issues that require fighting with infrastructure or network then we find ourselves in a difficult position. We can solve these issues if we know the right tool to use. I faced a similar position this week. I am starting a new series where every week or two I will write about a new tool that can help us debug these kind of issues.

This week I was debugging an issue where few requests to the destination server were timing out. These types of issues typically fall under networking errors and require you to use a network diagnostic tool. Most developers start diagnosing the issue using ping and traceroute tool. Both these tools are useful but you have to run them both together to debug the issue. Recently, I discovered MTR which combines ping and traceroute tools in a single tool. I found that most developers that I work with are not unaware of this tool so I decided to document it for future me and others.

mtr stands for My traceRoute. It is useful when you need to figure out number of hops to the destination server or latency at each hop. It also help you see packet loss at each hop so that you can narrow down the place where you might be facing issue. MTR collects information regarding the state, connection, and latency of the intermediate hosts. Thus giving a complete overview of the connection between two hosts on the network.

Installing mtr

To install mtr on Mac you can use brew package manager.

brew install mtr

Once you have installed mtr, you need to create two symbolic links

sudo ln /usr/local/Cellar/mtr/0.92/sbin/mtr /usr/local/bin/mtr
sudo ln /usr/local/Cellar/mtr/0.92/sbin/mtr-packet /usr/local/bin/mtr-packet

If you get either mtr: Failure to start mtr-packet: Invalid argument or mtr: Failure to start mtr-packet: Invalid argument error message that means you have not run above two commands.

For Linux

Ubuntu users

apt update && apt upgrade
apt install mtr-tiny

Centos

yum update
yum install mtr

Windows

Windows users can download from here.

Once you have done that you can run the mtr tool. We cover that in next section.

Using mtr

We use mtr to find number of hops to destination server and if there is any latency or packet loss at any hop.

To use mtr, you can run the following command.

sudo mtr google.com

The above command will run mtr will continuously in an interactive manner. The output is shown below

Host                                                                                                                                                                                    Loss%   Snt   Last   Avg  Best  Wrst StDev
 1. 192.168.1.1                                                                                                                                                                         0.0%    10    3.7   3.2   1.2  10.6   3.1
 2. abts-north-static-236.220.160.122.airtelbroadband.in                                                                                                                                  0.0%    10    7.2  10.9   5.6  36.0   9.7
    125.18.20.101
 3. 72.14.205.93                                                                                                                                                                          0.0%    10    7.4   9.9   6.1  19.7   4.6
 4. 108.170.251.113                                                                                                                                                                       0.0%    10    9.4  10.3   8.3  21.1   3.8
 5. 108.170.229.1                                                                                                                                                                         0.0%     9    9.2   9.1   8.1  11.1   1.1
 6. del03s01-in-f14.1e100.net                                                                                                                                                             0.0%     9    7.2   8.0   7.0  10.1   1.2

Please scroll to the right to see complete output.

The first column shows the IP or DNS of the server receiving the request. As you can see there are 6 hops before request is served by a Google server del03s01-in-f14.1e100.net. If you see 0% packet loss under the Loss% column throughout all the hops of the MTR trace, this indicates that there likely is not a networking issue between your computer and destination host. In the output shown above, we can see that there is no packet loss. This is good thing!

The table also shows the latency in milliseconds at each hop in terms of last, average, best, worst, and standard deviation. Last is the latency of the last packet sent, Avg is average latency of all packets, while Best and Wrst display the best (shortest) and worst (longest) round trip time for a packet to this host.

To exit out from this, you can type q

If you don’t want to see domain names under host and only want to see IP address then you can use -n option.

sudo mtr -n google.com
1. 192.168.1.1                                                                                                                                                                           0.0%     9    1.7   1.8   1.3   2.4   0.3
 2. 122.160.220.236                                                                                                                                                                       0.0%     8    5.5   7.0   5.5  10.4   1.5
    125.18.20.101
 3. 72.14.205.93                                                                                                                                                                          0.0%     8    6.1   9.3   6.1  18.8   4.3
 4. 108.170.251.113                                                                                                                                                                       0.0%     8    8.8   9.7   8.7  11.1   1.0
 5. 108.170.229.1                                                                                                                                                                         0.0%     8   15.6  10.0   8.2  15.6   2.4
 6. 172.217.31.14                                                                                                                                                                         0.0%     8    7.3   9.1   6.7  16.7   3.3

Please scroll to the right to see complete output.

To exit type q.

The above mentioned way to use mtr is not user friendly. Most of the times we want to see results in a user friendly report format. For that, mtr supports report format that you can use as mentioned below.

sudo mtr -r -c 30 google.com

The c option flag sets how many packets are sent and recorded in the report. When not used, the default will generally be 10, but for faster intervals you may want to set it to 30 or 100. The report can take longer to finish when doing this.

The output is shown below

Start: 2019-06-01T23:23:22+0530
HOST: XE-TMac-Shekhar-Gulati.loca Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- 192.168.1.1                0.0%    30    1.4   2.1   1.3   9.0   2.0
  2.|-- abts-north-static-236.220  0.0%    30    8.8   6.9   5.5  11.0   1.3
  3.|-- 182.79.217.89              0.0%    30    7.4  14.6   6.5  39.8  10.8
  4.|-- 72.14.243.0                0.0%    30   10.3  10.1   8.8  19.7   2.0
  5.|-- 74.125.244.194             0.0%    30   11.0  10.9   9.6  16.2   1.5
  6.|-- 216.239.42.48              0.0%    30   33.5  33.5  32.0  40.4   1.8
  7.|-- 209.85.245.151             0.0%    30   33.1  33.9  33.0  38.7   1.2
  8.|-- 108.170.248.177            0.0%    30   33.5  35.1  33.0  46.1   3.2
  9.|-- 209.85.242.111             0.0%    30   31.9  33.2  31.4  43.0   2.5
 10.|-- bom05s15-in-f14.1e100.net  0.0%    30   32.7  33.5  32.6  36.2   1.0

The command will take 30 seconds to run as it will send request every 1 second for 30 times.

As you can see in the above output, route for this request was different from the previous one. The destination server that served our request has host name bom05s15-in-f14.1e100.net which in previous run was del03s01-in-f14.1e100.net.

1e100.net is a Google-owned domain name used to identify the servers in their network.

There are many other options in mtr that you can see under the man page of mtr.

Things to know

In the previous section you learnt how to use mtr. There are few things that you know when you are trying to debug issues.

  1. If you see a packet loss at any hop in the mtr report that may indicate a problem with that particular router. Before you are sure that it is an issue please check the subsequent hop. If that hop shows 0.0% then the issue could be ICMP rate limiting by the service providers. ICMP messages are sent during ping. These messages are given low priority so service provides can ignore them. So, this might give illusion of packet loss when there is no loss.
  2. You should also try to run mtr is reverse direction as well i.e. from destination to host. This will help you understand return path.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s