Managing Network Bandwidth
Trickle
The trickle command-line utility helps you shape network traffic.
Special Thanks: This article was made possible by support from Linux Professional Institute
If you have ever been in a situation where one application ate all your bandwith, then you will appreciate the trickle bandwidth shaper application. With trickle, you can control an application's upload and download speeds so that no single application hogs all the bandwidth. For example, you can ensure that downloading from Firefox doesn’t interfere with downloading a file from FTP.
Shaping bandwidth traffic is one of the mundane but essential tasks of a system administrator, be it in a large corporate setting or a small office. trickle enables you to control the network traffic rate on a per-application basis, as opposed to per-user control (the most familiar type of bandwidth shaping in a client-server environment).
trickle is available in the official repositories of most RPM- or deb-based distributions. For RHEL-based rollouts, including CentOS servers, you’ll first have to install and enable the Extra Packages for Enterprise Linux (EPEL) repository before pulling in trickle.
trickle regulates speeds by delaying the data transferred over a socket. trickle provides an alternate version of the BSD socket API, causing socket calls to be handled now by trickle. Speed is limited by controlling the amount of the data written or read from a socket.
A word of warning, trickle has some limitations. It only works on TCP connections, so you can’t use it to regulate UDP stream connections (to learn more about dynamic linking and the technical details behind trickle, see the trickle technical paper). Additionally, trickle doesn’t work with all TCP connections either. Since trickle uses dynamic linking and loading, it can only work with applications that use dynamic libraries (specifically glibc). In other words, trickle will not work with statically linked applications or binaries with the SUID or SGID bits set, because it uses dynamic linking and loading to place itself between the shaped processes and their associated network socket -- trickle acts as a proxy between these two components.
In order to determine whether or not you can use trickle, use the ldd command (Figure 1), which lists the dynamic dependencies of all the shared libraries. Specifically, look for the presence of the GNU C library (glibc) in the list of dynamic dependencies for any given application, since this library defines the system calls that are invoked when communicating via sockets.
For example, if you’re wondering whether trickle will work with the cURL downloader, use the following command:
$ ldd /usr/bin/curl | grep libc.so
This command should return a result resembling:
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc532022000)
You can similarly test for other network applications. As long as you get a result, trickle can regulate the speeds for those applications. If the command doesn’t print a result, it means that the binary it was run against does not use libc; thus trickle cannot be used as bandwidth shaper in that instance. As shown in the example, trickle can regulate bandwidth for both graphical and command-line apps and utilities. This means you can use it to throttle the Transmission BitTorrent downloader just as easily as the command-line based Apt and DNF package managers.
Using trickle
When using trickle, you can choose appropriate download and upload speeds to limit applications. You don’t have to do anything fancy – just use the -d and the -u switches to tell trickle the respective download and upload speeds for an application.
For instance, the command
trickle -d 1024 wget -c https://archive.org/download/CharlieChaplin/Chaplin_512kb.mp4
will download the Charlie Chaplin movie (available as public domain from the Internet Archive) with the Wget downloader limiting the download speed to 1024Kbps. (I’ve used Wget here to illustrate trickle’s ability – you can use Wget’s --limit-rate option to regulate its download speed.) In the same vein, use the -u switch to regulate the upload speed.
If setting per-application speeds seems too much of a chore, you can set global speed caps with the trickled command, such as
trickled -d 2048 -u 1024
trickled runs trickle in the daemon mode, allowing you to define download and upload limits to be shared by all the applications run through trickle without the need for specifying limits each time. The trickled daemon monitors all connections; once you’ve set up trickled, you don’t need to bother setting speeds for Wget, FTP, browsers ,and everything else that uses TCP. So,
trickle apt upgrade
will now update the Ubuntu installation while respecting the limits set by the trickled.
You can similarly use trickled to regulate the bandwidth for a particular app instead of specifying it at every invocation. For instance, if you wish to limit the download speed available to the Wget downloader to 1Mbps, you can do it as follows:
trickled -d 1024 wget
Once set, whenever you call wget, such as
trickle wget -c somefile.iso
trickle will ensure the downloads don’t exceed the specified limit (1Mbps in this case). Note that when you fix speeds for a particular application, like the BitTorrent client, the allotted bandwidth gets split between all the files you download simultaneously. So if you’ve allocated 1Mbps upload speed to Transmission and have two seeding torrents, their combined upload speed will not exceed the specified limit.
Permanent Settings
If you think setting upload and download speeds is all that trickle does, you’re wrong. This nifty little tool lets you set per-application priority, and you can also define time- and length-smoothing parameters.
With time-smoothing, you can define the time interval for a particular application to transfer data. Large values will produce bursts in sending and receiving data, while smaller values ensure a smooth and continuous data transfer. Use the -t option to define the time-smoothing values in seconds. The default value is 5s. According to the trickled man page, a smoothing time of under 1s is ideal for interactive applications and anywhere from 1–10s is recommended for applications that transfer large amounts of data.
Like time smoothing, you can also define length smoothing with the -l command switch. Length smoothing is based on the length of the I/O operation. It’s usually used as a fallback option to time smoothing; if trickled is unable to meet the interval specified with time smoothing, it’ll instead try to meet the transfer size specified with length smoothing (the default value is 10KB).
As previously mentioned, defining global speeds (i.e., setting speed limits for all applications) is done with the trickled command. But what if you need to define custom time- and length-smoothing values for several applications? To achieve this ,you’ll need to specify the value in trickle’s configuration file, /etc/trickled.conf (Figure 2). In fact, when you run trickle, it checks to see if the trickled daemon is running and implements the parameters defined in the file for the application it is called to throttle. Remember that trickle will override the options defined in /etc/trickled.conf if you specify values with the trickle command.
Each section in the configuration file is demarcated by square brackets, and the format of the file is pretty straightforward:
[service] Priority = <value> Time-Smoothing = <value> Length-Smoothing = <value>
The first important parameter in the trickled.conf file is the Priority parameter. Priorities are set relative to other services. An application with a lower value means it has a higher priority. Applications with a higher priority get more bandwidth than the others.
Here’s how an actual configuration file looks:
[ssh] Priority = 1 Time-Smoothing = 0.1 Length-Smoothing = 1 [www] Priority = 2 Time-Smoothing = 5 Length-Smoothing = 10 [ftp] Priority = 5
In this example, traffic over SSH has the highest priority; to make sure that the remote sessions don’t have any unnecessary delays, both the time-smoothing and length-smoothing parameters are also set to the lowest values. Web browsing also has a high priority for a smooth experience. Finally, FTP gets the lowest priority, since I am in no particular hurry for my downloads to complete.
Linux offers other bandwidth shapers besides trickle, including wondershaper, which is useful for enforcing limits directly on the network interfaces (see the “Shape Network Adapters” box).
Another way of controlling network traffic is to limit bandwidth on individual network interface cards (NICs). wondershaper is a small Bash script that uses the tc command-line utility in the background to let you regulate the amount of data flowing through a particular NIC. As you can imagine, while you can use wondershaper on a machine with a single NIC, its real advantage is on a machine with multiple NICs.
Just like trickle, wondershaper too is available in the official repositories of mainstream distributions. To limit network traffic with wondershaper, specify the NIC on which you wish to restrict traffic with the download and upload speed in kilobits per second. For example,
wondershaper enp5s0 4096 1024
will restrict the download speed on the first wired adapter to 4Mbps and the upload speed to 1Mbps. If you specify a NIC with the wondershaper command, it’ll return the status of traffic shaping on that NIC, such as wondershaper enp5s0. Use the clear option to remove all custom restrictions from a network interface:
wondershaper clear enp5s0
Unlike trickle, however, wondershaper requires superuser privileges, so you’ll either have to run the above commands with sudo or as the root user.
trickle packs quite a punch despite its minuscule size. You can use trickle in standalone or daemon mode, which gives you more control and flexibility over its operations (Figure 3). It does have its limitations, in that it can only handle TCP streams and apps that use dynamic libraries. However, trickle is still a wonderful utility for anyone looking to control network traffic on a per-application basis.
Buy Linux Magazine
Subscribe to our Linux Newsletters
Find Linux and Open Source Jobs
Subscribe to our ADMIN Newsletters
Support Our Work
Linux Magazine content is made possible with support from readers like you. Please consider contributing when you’ve found an article to be beneficial.
News
-
AlmaLinux 10.0 Beta Released
The AlmaLinux OS Foundation has announced the availability of AlmaLinux 10.0 Beta ("Purple Lion") for all supported devices with significant changes.
-
Gnome 47.2 Now Available
Gnome 47.2 is now available for general use but don't expect much in the way of newness, as this is all about improvements and bug fixes.
-
Latest Cinnamon Desktop Releases with a Bold New Look
Just in time for the holidays, the developer of the Cinnamon desktop has shipped a new release to help spice up your eggnog with new features and a new look.
-
Armbian 24.11 Released with Expanded Hardware Support
If you've been waiting for Armbian to support OrangePi 5 Max and Radxa ROCK 5B+, the wait is over.
-
SUSE Renames Several Products for Better Name Recognition
SUSE has been a very powerful player in the European market, but it knows it must branch out to gain serious traction. Will a name change do the trick?
-
ESET Discovers New Linux Malware
WolfsBane is an all-in-one malware that has hit the Linux operating system and includes a dropper, a launcher, and a backdoor.
-
New Linux Kernel Patch Allows Forcing a CPU Mitigation
Even when CPU mitigations can consume precious CPU cycles, it might not be a bad idea to allow users to enable them, even if your machine isn't vulnerable.
-
Red Hat Enterprise Linux 9.5 Released
Notify your friends, loved ones, and colleagues that the latest version of RHEL is available with plenty of enhancements.
-
Linux Sees Massive Performance Increase from a Single Line of Code
With one line of code, Intel was able to increase the performance of the Linux kernel by 4,000 percent.
-
Fedora KDE Approved as an Official Spin
If you prefer the Plasma desktop environment and the Fedora distribution, you're in luck because there's now an official spin that is listed on the same level as the Fedora Workstation edition.