Maximillian Laumeister
Illustration of Miku the bird-fox shouting through a megaphone while flying in the sky

How to Limit the Bandwidth of Bitcoin Core on Windows, Mac OS X, and Linux

In this article, we will learn how to limit the outgoing bandwidth of Bitcoin Core (formerly Bitcoin-qt), so we can leave it listening in the background without completely saturating our internet connection.

For many of us, leaving Bitcoin Core running isn’t just a way for us to keep tabs on incoming bitcoin transactions, but a way to contribute resources to the Bitcoin network. By running Bitcoin Core in the background, your computer acts as a “full node”, forwarding new transactions, providing blocks to other nodes, and generally helping keep the Bitcoin network healthy. To do this, your internet connection needs to be able to accept incoming connections on TCP port 8333.

After you have the port forwarded for a few hours, however, you may notice your internet connection becoming unresponsive for other things like web surfing. This is because Bitcoin Core uses all your connection’s upload bandwidth and your router isn’t smart enough to sort out the traffic. Some routers support QoS, which is a way of prioritizing important traffic (like web browsing) over baseline traffic (like bitcoin traffic). If your router supports QoS, then you should use it instead of following this guide to limit bandwidth – this guide is for those of us whose routers choke up when Bitcoin Core is running.

IMPORTANT NOTE: If you limit the bandwidth of Bitcoin Core far below your actual upload speed, it can actually harm the Bitcoin network instead of helping it. To be a responsible maintainer of the Bitcoin network, you should test your upload speed and then set your outgoing bandwidth limit to be as close to your actual speed as possible (e.g. 90%). This guide is intended solely for people whose internet connections go unresponsive due to Bitcoin Core completely saturating their upload bandwidth.


Section Navigation


Limiting Bitcoin Bandwidth on Windows

On Windows, there are a few choices available for limiting the bandwidth of an application. Two of the more popular ones are NetLimiter ($29.95, 30-day trial) and NetBalancer (Free version with limitations, full version $49.95). The free version of NetBalancer allows the user to limit the bandwidth of up to 3 apps at once, and since we only need to limit bandwidth on one app (Bitcoin Core), NetBalancer will be sufficient for this tutorial.

How to Limit Bandwidth on Windows:

  1. Download and Install NetBalancer.

  2. Start Bitcoin Core if it isn’t already running.

  3. Run NetBalancer and you should see a GUI that looks similar to this:

    NetBalancer GUI

  4. Find “bitcoin-qt.exe” in the list of running applications in the NetBalancer dialog and double-click it to change its bandwidth rules.

  5. Under “Upload Priority” choose “Limited”, and set the maximum amount of bandwidth for Bitcoin Core to use. Keep in mind that 1KB/s (Kilobyte per second, note the uppercase “B”) is 8 times as much as 1Kb/s (Kilobit per second, lowercase “b”). NetBalancer measures in Kilobytes (KB) by default, but your internet connection is likely measured in Megabits (Mb). So for example, if you want to limit Bitcoin Core’s bandwidth to 8Mb/s, you will need to enter 1000KB/s into NetBalancer.

    NetBalancer Bandwidth Rules

    The “bitcoin-qt.exe” entry should show the new rule under the “Priority” column:

    NetBalancer Bitcoin-qt Bandwidth

  6. You’re done! NetBalancer will now sit in the background and make sure Bitcoin Core doesn’t use more bandwidth than you want it to.

Limiting Bandwidth on Mac OS X

In OS X versions before 10.10, there was a handy tool for shaping traffic bandwidth called ipfw. In OS X 10.10 and later, Apple replaced the ipfw tool with pfctl, and there is limited documentation on how to use the new tool to limit bandwidth on an app-by-app basis (if you know how, please share in the comments or on Stack Exchange!) Apple provides their own method of limiting bandwidth for developers (Network Link Conditioner), but unfortunately it affects the network speed system-wide, rather than allowing the user to choose which apps to throttle.

The result is that on OS X 10.9 Mavericks and earlier, we will be able to control the bandwidth of Bitcoin Core specifically, but on OS X 10.10 Yosemite and later, we will only be able to limit the overall system bandwidth.

OS X 10.10 Yosemite and later

For OS X 10.10 Yosemite and later, there is no easy way to limit the bandwidth of a particular application, but the overall system bandwidth can be limited as follows:

  1. Visit Apple Developer Downloads and log in with your Apple ID.

  2. Search for “Hardware IO Tools for Xcode” and download the latest stable (non-beta) version. As of writing, the download was “Hardware IO Tools for Xcode 6.3”.

  3. Open the .dmg and double-click “Network Link Conditioner.prefpane” to install the prefpane. From now on, you can enable/disable Network Link Conditioner from System Preferences.

  4. From the Network Link Conditioner pane in System Preferences, click “Manage Profiles”, then click the “+” button to add a new profile. I named mine “Bitcoin Core”.

  5. Edit the profile and add your desired maximum upload speed:

    Network Link Conditioner  - Profile

  6. Save your edit, exit the profile manager, choose your new profile, and flip the big switch to enable the limiter:

    Network Link Conditioner - Main

Mac OS will place an icon in your notification tray so you remember that it’s on. Unlike the Windows/Linux solutions, this will limit the bandwidth for your entire system, so be sure to turn it off you’re not running Bitcoin Core.

OS X 10.9 Mavericks and earlier

For OS X 10.9 Mavericks, use IceFloor to configure bandwidth rules. For OS X 10.8 Mountain Lion and earlier, use WaterRoof to configure bandwidth rules. We want to limit outgoing traffic on TCP Port 8333. Alternatively, if you want a simple way to control the overall system bandwidth limit instead of just Bitcoin Core, follow the instructions above for OS X 10.10 Yosemite and later.

Limiting Bandwidth on Linux

There are comparatively many tools for limiting bandwidth on Linux compared to Windows and Mac OS, but I’ve found that not all of them are as reliable as others. Trickle is a popular way to limit a program’s bandwidth, but after a few tests under Linux Mint 17.1, I found it to consistently crash Bitcoin Core after a few hours of uptime. Wondershaper is another “plug and go” bandwidth limiting solution, but only allows bandwidth limiting on an entire adapter, not for a specific application or port. Tc isn’t as user-friendly as the other two, but in my tests it has been the most reliable, so that’s what we will use for this tutorial.

  1. Make sure you have tc installed by typing tc at the command line. If you get “command not found”, install tc using your favorite package manager. If you’re on a Debian-based distribution, the easiest way to install tc is by using apt-get:

    sudo apt-get update
    
    sudo apt-get install iproute2
    
  2. Download the tc.sh script from the official Bitcoin Core repository using wget:

    wget https://raw.githubusercontent.com/bitcoin/bitcoin/master/contrib/qos/tc.sh
    
  3. Open the script in a text editor. Find the line that says IF="eth0" and change eth0 to reflect the network interface that your internet connection runs through. To get a list of your computer’s network interfaces, use ifconfig on the command line. My computer is connected wirelessly through wlan1, so the IF line of my tc.sh looks like this:

    IF="wlan1"
    
  4. LINKCEIL should reflect the limit of the network interface, and most likely does not need to be changed.

    LINKCEIL="1gbit"
    
  5. Change LIMIT to be the maximum bandwidth you want Bitcoin Core to use (I chose 1mbit). If you don’t have any other Bitcoin Core nodes in your local network, you can delete the line that says LOCALNET. This line is there to make a bandwidth exception for port 8333 communications within your local network (i.e. not out to the internet).

    LIMIT="1mbit"
    

    Leave the rest of the commands in tc.sh alone unless you know what you’re doing. The final top section of my tc.sh ended up looking like this:

     #network interface on which to limit traffic
     IF="wlan1"
    
     #limit of the network interface in question
     LINKCEIL="1gbit"
    
     #limit outbound Bitcoin protocol traffic to this rate
     LIMIT="1mbit"
    
  6. Exit your editor and make the script executable with the following command:

    chmod +x ./tc.sh
    
  7. Run the script as superuser:

    sudo ./tc.sh
    

    Your Bitcoin Core bandwidth will be throttled until you reboot your computer!

Optionally, you can set the script to run every time you start your computer. Instructions for running scripts on boot will vary depending on your Linux distribution. On Ubuntu, one of the ways to run a script on boot is by adding the script to your /etc/rc.local file.

Conclusion

Now you can contribute your extra bandwidth to the Bitcoin network no matter what OS you’re running, and without slowing down the connection for your housemates. Hope you enjoyed this tutorial, and please leave any thoughts in the comments!

More Articles Tagged #cryptocurrency

Comments