Hello my friend,
Continuing our discussion about the network troubleshooting tools we can’t pass by one of the most popular and widely used, which is named SpeedTest.
1
2
3
4
5 No part of this blogpost could be reproduced, stored in a
retrieval system, or transmitted in any form or by any
means, electronic, mechanical or photocopying, recording,
or otherwise, for commercial purposes without the
prior permission of the author.
Can automation help with performance troubleshooting?
Doing the collection and initial analysis of the information during the troubleshooting could be quite a time-consuming task. On the other hand, the troubleshooting of the live outages should be as quick as possible to minimise the downtime of the affected services. That’s where the automation can help you.
In our network automation training we explain how to use existing open-source tools and create your own with Ansible, Bash and Python. Leveraging them and all possible interfaces (CLI, NETCONF, RESTCONF, gNMI) we teach you how to effectively build, operate and troubleshoot your network.
Brief description
From the name of the tool, SpeedTest, it is obvious that the main goal is to measure the “speed”. In fact, it measures the following parameters:
- Download bandwidth
- Upload bandwidth
- Latency and jitter
- Packet drop
All these measurements are done against the SpeedTest server, which is chosen based on your geographical location (the server closer to you is preferable) and the server load. Those servers are hosted in various networks across the globe. The whole solution is developed and supported by Ookla.
It is possible to manually choose the test server out of list, if you have specific needs (e.g., you want to measure speed to a different country).
The very important consideration here is that the Speedtest results are NOT absolute. Instead, they just show you connectivity to a specific server in a specific point in time. There are various components contributing to the end results:
- Connectivity to the Internet where you are measuring that from (your home, office, data centre, etc).
- Network path from your provider till the server (yes, it is very possible that the test server is in different network), which may include several networks (different ASNs).
- Connectivity to the Internet of the Speedtest server (the load of network infrastructure in the data centre hosting the Speedtest server)
- Load on the speed test server itself.
Therefore, if you suspect that you have problems with the speed Internet connectivity, we advise to do several tests to several servers to have more data.
Usage
Let’s take a look how to use Speedtest.
#1. Installation
The installation of the official Speedtest CLI is described in the official documentation at quite a good level of details. In our lab we are using CentOS; hence, we use CentOS path for installation, which consist of two major steps:
- Add the path towards repository containing the Speedtest CLI
- Install it using the package manager (yum in our case).
Here is the sample installation process for your reference:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 $ wget https://bintray.com/ookla/rhel/rpm -O bintray-ookla-rhel.repo
--2020-12-28 08:37:08-- https://bintray.com/ookla/rhel/rpm
Resolving bintray.com (bintray.com)... 108.168.194.93
Connecting to bintray.com (bintray.com)|108.168.194.93|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/plain]
Saving to: ‘bintray-ookla-rhel.repo’
bintray-ookla-rhel.repo [ <=> ] 172 --.-KB/s in 0s
2020-12-28 08:37:08 (123 MB/s) - ‘bintray-ookla-rhel.repo’ saved [172]
[aaa@nnat ~]$ sudo mv bintray-ookla-rhel.repo /etc/yum.repos.d/
[sudo] password for aaa:
[aaa@nnat ~]$ sudo yum install speedtest
bintray--ookla-rhel 2.5 kB/s | 1.4 kB 00:00
Dependencies resolved.
===========================================================================================================================================================================================
Package Architecture Version Repository Size
===========================================================================================================================================================================================
Installing:
speedtest x86_64 1.0.0.2_1.5ae238b-1 bintray--ookla-rhel 910 k
Transaction Summary
===========================================================================================================================================================================================
Install 1 Package
Total download size: 910 k
Installed size: 2.2 M
Is this ok [y/N]: y
Downloading Packages:
ookla-speedtest-1.0.0-x86_64-linux.rpm 857 kB/s | 910 kB 00:01
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 853 kB/s | 910 kB 00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : speedtest-1.0.0.2_1.5ae238b-1.x86_64 1/1
Running scriptlet: speedtest-1.0.0.2_1.5ae238b-1.x86_64 1/1
Verifying : speedtest-1.0.0.2_1.5ae238b-1.x86_64 1/1
Installed products updated.
Installed:
speedtest-1.0.0.2_1.5ae238b-1.x86_64
Complete!
Once installed, you can check that it is installed indeed and what is the version:
1
2
3
4
5 $ speedtest -V
Speedtest by Ookla 1.0.0.2 (5ae238b) Linux/x86_64-linux-musl 4.18.0-240.1.1.el8_3.x86_64 x86_64
The official command line client for testing the speed and performance
of your internet connection.
#2. Simple tests
To run the test you just need to type speedtest in CLI without further parameter. However, before you run your first test after installation, you will be asked to accept the End User License Agreement:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 $ speedtest
==============================================================================
You may only use this Speedtest software and information generated
from it for personal, non-commercial use, through a command line
interface on a personal computer. Your use of this software is subject
to the End User License Agreement, Terms of Use and Privacy Policy at
these URLs:
https://www.speedtest.net/about/eula
https://www.speedtest.net/about/terms
https://www.speedtest.net/about/privacy
==============================================================================
Do you accept the license? [type YES to accept]: YES
License acceptance recorded. Continuing.
==============================================================================
Ookla collects certain data through Speedtest that may be considered
personally identifiable, such as your IP address, unique device
identifiers or location. Ookla believes it has a legitimate interest
to share this data with internet providers, hardware manufacturers and
industry regulators to help them understand and create a better and
faster internet. For further information including how the data may be
shared, where the data may be transferred and Ookla's contact details,
please see our Privacy Policy at:
http://www.speedtest.net/privacy
==============================================================================
Do you accept the license? [type YES to accept]: YES
License acceptance recorded. Continuing.
Speedtest by Ookla
Server: Mauritius Telecom Ltd - London (id = 17418)
ISP: BT
Latency: 21.97 ms (13.06 ms jitter)
Download: 11.31 Mbps (data used: 10.2 MB)
Upload: 0.91 Mbps (data used: 1.7 MB)
Packet Loss: 0.0%
Result URL: https://www.speedtest.net/result/c/e7fecd74-d235-4258-80cd-9e18aab3dbe1
In the end of the snippet you see the results of the test:
- The Server has an integer identifier (id = xxx) inside the Speedtest solution, which can be used to run the tests against a specific one. The tool also names the organisation hosting the server. The IP address of the destination server is not shared (but obviously you can see that in tcpdump).
- ISP is your Internet provider. It is identified based on your IP addresses. Your IP address is also used for a search in the geo databases to figure out your physical location and, therefore, choose the Speedtest server for you.
- Latency, Download, and Upload are the main results showing the connectivity parameters for this specific measurement. Packet Loss is optional and depends on the support by the test server.
- The results are published online and you are getting the link (Result URL), in case you need to share that with your support.
The second and further tests doesn’t require you accepting EULA anymore. It is also quite possible that the next test will be run against different server:
1
2
3
4
5
6
7
8
9
10
11 $ speedtest
Speedtest by Ookla
Server: Inovedia Outsourcing - London (id = 37471)
ISP: BT
Latency: 21.95 ms (18.28 ms jitter)
Download: 9.54 Mbps (data used: 12.2 MB)
Upload: 0.95 Mbps (data used: 1.4 MB)
Packet Loss: Not available.
Result URL: https://www.speedtest.net/result/c/c8ef3047-7ee6-4431-8902-ec982c80e80c
As you can see, two consecutive measurements were performed against different servers and show different speeds.
#3. Advanced tests
The Speedtest by Ookla gives you a few parameters, which you can specify, which may influence the results of the measurement or the representation of the results. You can see them in the inline help:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 $ speedtest --help
Speedtest by Ookla is the official command line client for testing the speed and performance of your internet connection.
Version: speedtest 1.0.0.2
Usage: speedtest [<options>]
-h, --help Print usage information
-V, --version Print version number
-L, --servers List nearest servers
-s, --server-id=# Specify a server from the server list using its id
-I, --interface=ARG Attempt to bind to the specified interface when connecting to servers
-i, --ip=ARG Attempt to bind to the specified IP address when connecting to servers
-o, --host=ARG Specify a server, from the server list, using its host's fully qualified domain name
-p, --progress=yes|no Enable or disable progress bar (Note: only available for 'human-readable'
or 'json' and defaults to yes when interactive)
-P, --precision=# Number of decimals to use (0-8, default=2)
-f, --format=ARG Output format (see below for valid formats)
-u, --unit[=ARG] Output unit for displaying speeds (Note: this is only applicable
for ‘human-readable’ output format and the default unit is Mbps)
-a Shortcut for [-u auto-decimal-bits]
-A Shortcut for [-u auto-decimal-bytes]
-b Shortcut for [-u auto-binary-bits]
-B Shortcut for [-u auto-binary-bytes]
--selection-details Show server selection details
--ca-certificate=ARG CA Certificate bundle path
-v Logging verbosity. Specify multiple times for higher verbosity
--output-header Show output header for CSV and TSV formats
Valid output formats: human-readable (default), csv, tsv, json, jsonl, json-pretty
Machine readable formats (csv, tsv, json, jsonl, json-pretty) use bytes as the unit of measure with max precision
Valid units for [-u] flag:
Decimal prefix, bits per second: bps, kbps, Mbps, Gbps
Decimal prefix, bytes per second: B/s, kB/s, MB/s, GB/s
Binary prefix, bits per second: kibps, Mibps, Gibps
Binary prefix, bytes per second: kiB/s, MiB/s, GiB/s
Auto-scaled prefix: auto-binary-bits, auto-binary-bytes, auto-decimal-bits, auto-decimal-bytes
If you want to run the test against a specific server, you can list what are your options:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 $ speedtest -L
Closest servers:
ID Name Location Country
==============================================================================
37471 Inovedia Outsourcing London United Kingdom
11445 Structured Communications London United Kingdom
26922 toob Ltd London United Kingdom
30690 Community Fibre Limited London United Kingdom
6032 fdcservers.net London Great Britain
7352 Redraw Internet London Great Britain
30904 GMCHosting LLC London United Kingdom
17418 Mauritius Telecom Ltd London GB
30376 UK Dedicated Servers London United Kingdom
11123 Spitfire Network Services London United Kingdom
Ookla claims that they have more than 13 thousands of test servers worldwide, which is quite good. However, you would see in the list only the closest to you. To run the test against any of the listed, you pick up its ID and run the speedtest with the key -s:
1
2
3
4
5
6
7
8
9
10
11 $ speedtest -s 11123
Speedtest by Ookla
Server: Spitfire Network Services - London (id = 11123)
ISP: BT
Latency: 23.32 ms (0.95 ms jitter)
Download: 11.16 Mbps (data used: 19.6 MB)
Upload: 0.87 Mbps (data used: 1.4 MB)
Packet Loss: 0.0%
Result URL: https://www.speedtest.net/result/c/bffccd86-845c-4abd-904a-6d0764334259
Depending on your business type (say if you are a streaming or gaming platform), you might be interested in having ideas, how are you services available in different part of the world. The trick here is to get list of servers from other countries. Unfortunately, the Speedtest CLI doesn’t provide a possibility for you to list that. It is possible to find unofficial dump of the server IDs in the internet, but there is no guarantee they are working. So the best advise (if you have such a possibility) is to ask some you friends in the destination country to run speedtest -L and give you a list of servers they see :-). Here is a list of servers how does they look like from New York:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 FriendInNewYork$ speedtest -L
Closest servers:
ID Name Location Country
==============================================================================
5029 AT&T New York, NY United States
13098 Pilot New York, NY United States
16976 Spectrum New York, NY United States
10546 Sprint New York, NY United States
16888 Natural Wireless New York, NY US
16686 CCleaner New York, NY United States
24374 GTT.net New York, NY United States
21313 Data Room New York, NY United States
6030 fdcservers.net New York, NY United States
21016 Starry, Inc. New York, NY United States
Once you have the ID, you can run the speedtest over the globe:
1
2
3
4
5
6
7
8
9
10
11 $ speedtest -s 21016
Speedtest by Ookla
Server: Starry, Inc. - New York, NY (id = 21016)
ISP: BT
Latency: 90.24 ms (1.24 ms jitter)
Download: 8.31 Mbps (data used: 14.8 MB)
Upload: 0.81 Mbps (data used: 1.3 MB)
Packet Loss: 0.0%
Result URL: https://www.speedtest.net/result/c/555174dc-bda7-4a87-841a-f43f62ebb8cc
If your host has multiple IP addresses (e.g. if you have multiple interfaces or just have secondary IP addresses), you can specify which source IP you use to test the speed. It is generally pointless if your host is located behind the NAT, but could be useful if your IP addresses are public, especially if they are from different public ranges. You would do that as:
1
2
3
4
5
6
7
8
9
10
11 $ speedtest -i 10.0.2.6
Speedtest by Ookla
Server: GMCHosting LLC - London (id = 30904)
ISP: BT
Latency: 22.56 ms (0.98 ms jitter)
Download: 10.12 Mbps (data used: 19.2 MB)
Upload: 0.87 Mbps (data used: 1.5 MB)
Packet Loss: 0.0%
Result URL: https://www.speedtest.net/result/c/d1eb795c-cbec-4418-9902-db263fcd8957
#4. Changing the output format
The standard output is human readable, which is good for manual troubleshooting, but is not good for automated workflows, because you would need to parse the text. To solve that the Speedtest CLI allows you changing the output format to CSV or JSON:
1
2
3
4
5
6 $ speedtest -f csv
"Mauritius Telecom Ltd - London","17418","21.585","4.213","0","1401882","113009","9503140","1601620","https://www.speedtest.net/result/c/b9bcd7db-475f-461b-ae50-0e5cd3d4ec0c"
$ speedtest -f json
{"type":"result","timestamp":"2020-12-28T15:21:52Z","ping":{"jitter":3.569,"latency":21.946999999999999},"download":{"bandwidth":1150832,"bytes":10311268,"elapsed":8809},"upload":{"bandwidth":116023,"bytes":1449140,"elapsed":15014},"isp":"BT","interface":{"internalIp":"10.0.2.6","name":"enp0s3","macAddr":"08:00:27:F7:42:60","isVpn":false,"externalIp":"5.80.15.152"},"server":{"id":37471,"name":"Inovedia Outsourcing","location":"London","country":"United Kingdom","host":"speedtest.inovedia.com","port":8080,"ip":"154.51.158.15"},"result":{"id":"3a90fee2-ee31-42e5-b7c2-ddd0a764b95b","url":"https://www.speedtest.net/result/c/3a90fee2-ee31-42e5-b7c2-ddd0a764b95b"}}
The JSON output contains even more details, which you can use for your troubleshooting. Moreover, you can save it in file or just call test from the Ansible or Python script.
Learn more about Asible, Python, JSON for the network configuration and troubleshooting in our Network Automation Training.
#5. Ideas for automation
As said, the JSON output is perfect for automation and, therefore, you can create some Python script, which will test the connectivity and mail the results to you.
Take me to the examplesLessons learned
Previously the Speedtest CLI was distributed as Python software. You still can download and use it from the PyPI or the Git repo. However, Ookla recommends to use the official one distributed via package managers as explained earlier in this blogpost.
Conclusion
Having data about the internet connectivity at your home, office, or data centre is an important part of both general operation of your service and troubleshooting if something doesn’t work correctly. Speedtest allows to collect you such data. In addition, it is free of charge for users; therefore, it is one of the most popular tools for such tasks. Take care and good bye.
Support us
P.S.
If you have further questions or you need help with your networks, I’m happy to assist you, just send me message. Also don’t forget to share the article on your social media, if you like it.
BR,
Anton Karneliuk