TechEarl

nload: Watch Live Network Bandwidth in the Terminal

The nload command draws a live graph of incoming and outgoing bandwidth per interface, right in the terminal. Install it, run nload, switch interfaces with the arrow keys, and read the In/Out, Avg, and Max numbers. The -m multi-interface view, the -u/-U unit flags, the refresh interval, and where iftop and nmap fit instead.

Ishan Karunaratne⏱️ 11 min readUpdated
Share thisCopied
The nload command shows live network bandwidth per interface in the terminal. Install nload, switch interfaces with arrow keys, read In/Out/Avg/Max, plus -m multi-view, -u unit flags, and the refresh interval.

nload draws a live, scrolling graph of incoming and outgoing bandwidth on a network interface, right in your terminal. Run nload with no arguments and it picks the first non-loopback interface, shows two graphs (In and Out), and updates a few times a second with the current rate plus the average, min, max, and total transferred. It is the fastest way to answer "is this box actually saturating its link right now" without leaving the shell.

The thing to know up front: nload is a traffic-rate monitor, not a per-connection or per-process one. It tells you the interface is moving 400 Mbit/s; it does not tell you which host or which process is responsible. For that you reach for iftop (per-connection) or tools like nethogs (per-process). nload is the glance-at-the-pipe tool, and that narrow job is exactly why it is so quick to read.

Install nload

It is not in the base install on most distros, so grab it from the package manager first.

bash
# Debian / Ubuntu
sudo apt install nload

# Fedora / RHEL / Rocky (EPEL on RHEL family)
sudo dnf install nload

# Arch
sudo pacman -S nload

# macOS (Homebrew)
brew install nload

The package is the same upstream project everywhere: Roland Riegel's nload. There is no daemon and nothing to configure; it reads counters straight out of /proc/net/dev on Linux, so it works the moment it is installed.

Run it

bash
nload

That opens the full-screen display on the first real interface it finds. The top half is incoming traffic, the bottom half outgoing, each with a scrolling bar graph and a stats block to the right:

code
Device eth0 [192.0.2.10] (1/2):
======================================
Incoming:
                                         Curr: 412.18 MBit/s
   .|||                                  Avg: 388.04 MBit/s
  .||||.   .|                            Min: 0.00 Bit/s
.|||||||| .|||.                          Max: 451.77 MBit/s
||||||||||||||||                         Ttl: 18.42 GByte
--------------------------------------
Outgoing:
                                         Curr: 6.91 MBit/s
                                         Avg: 5.88 MBit/s
   .|                                    Min: 0.00 Bit/s
.|.||.  .|                               Max: 12.04 MBit/s
||||||||||||                             Ttl: 1.07 GByte

Curr is the rate right now, Avg is the running average over the averaging window, Min and Max are the lowest and highest rates seen, and Ttl is the cumulative bytes transferred while nload has been running. The (1/2) in the header means interface 1 of 2; the left and right arrow keys cycle between them.

Press q or Ctrl+C to quit. F2 opens the options screen; F5 saves the current settings; F6 reloads them.

Switch interfaces

Two ways. Cycle live with the arrow keys, or name the interface on the command line so nload starts on it directly:

bash
nload eth0

You can pass several and nload will let you page through just those with the arrows:

bash
nload eth0 wg0 docker0

To see them all at once instead of one per screen, use the multiple-devices view.

Show every interface at once with -m

bash
nload -m

-m switches to multiple-device mode: each interface gets a compact two-line In/Out summary stacked on one screen, no scrolling graph. This is the view I actually use on a busy host, because the question is usually "which interface is hot", and a wall of small In/Out readouts answers that faster than paging through full graphs one at a time.

Fix the scale and the units

The graph's 100% mark defaults to a fixed 10240 kBit/s (10 Mbit/s), so on a gigabit link the bars peg to the top constantly and tell you nothing. Set the mark to your link's real rate so the height means something:

bash
nload -i 102400 -o 102400 eth0

-i sets the top of the incoming graph and -o the outgoing, both in kBit/s. 102400 kBit/s is 100 Mbit/s, so a full-height bar now means a saturated 100 Mbit link. Passing -i 0 switches that graph to auto-scaling instead, where the bars always fill the height and the y-axis label tracks traffic up and down: handy on a link whose ceiling you do not know, distracting on one you do.

The display units are controlled separately:

bash
nload -u M -U G eth0

-u sets the unit for the traffic rates (the Curr/Avg/Max lines) and -U the unit for the totals (Ttl). The letters are: b k m g for bits (Bit/s, kBit/s, ...) and B K M G for bytes, plus h (or H) for human-readable auto-scaling. The defaults are -u k (rates in kBit/s) and -U M (totals in MByte), so -u M forces rates into MBit/s and -U G forces totals into GByte, which keeps the numbers steady instead of flipping units as traffic changes.

Change the refresh interval

bash
nload -t 200 eth0

-t is the refresh interval in milliseconds (default 500). Lower it to 200 for a twitchier graph that reacts faster to bursts; raise it to 2000 for a calmer, more averaged readout on a noisy link. It only affects the display refresh, not how often the kernel counters update.

Flag reference

FlagMeaningDefault
-mMultiple-device view (compact In/Out per interface, no graph)off (single device, graphed)
-t MSRefresh interval in milliseconds500
-i KBITS100% mark for the incoming graph in kBit/s (0 = auto-scale)10240
-o KBITS100% mark for the outgoing graph in kBit/s (0 = auto-scale)10240
-u UNITUnit for traffic rates (b k m g bits, B K M G bytes, h/H auto)k
-U UNITUnit for totals (same letters as -u)M
-a SECONDSLength of the averaging window for the Avg figure300
devices...Restrict to named interfaces (e.g. eth0 wg0)all real interfaces

-a is the one people miss: it sets how many seconds of history the Avg line covers. The default is 300, so Avg is a five-minute mean. Shorten it if a long average is hiding short spikes you care about.

Say a backup over the network feels slow and I want to know whether the link is the bottleneck or something upstream is throttling. I pin the scale to the link's rated speed and force MBit/s so the reading does not jump around:

bash
nload -u M -i 1024000 -o 1024000 eth0

1024000 kBit/s is roughly 1 Gbit/s, so the incoming graph now fills the height only when the link is genuinely maxed. If Curr parks at ~940 MBit/s and the bar is pinned to the top, the wire is the limit and there is nothing to tune on this box. If it sits at 300 MBit/s with the bar a third of the way up while the transfer crawls, the bottleneck is elsewhere (disk, the sender, a shaper in the path), and nload has just saved me from chasing the wrong thing.

When NOT to use nload

nload is great at one question and silent on the rest. Reach for something else when:

  • You need per-connection detail. "The interface is busy" is not "host X is hammering port 443". iftop breaks the same traffic down by connection with source, destination, and per-flow rates. See iftop: per-connection bandwidth in the terminal.
  • You need per-process attribution. When you want to know which program is using the bandwidth, nethogs groups traffic by PID. nload has no concept of processes.
  • You are auditing what is listening, not what is flowing. Open ports and reachable services are a scanning job, not a rate-monitoring one. nmap (and ss -tlnp locally) answer that. See nmap command examples.
  • You want history and alerting. nload only shows the live window; it stores nothing. For graphs over days and threshold alerts you want a real collector (Prometheus + node_exporter, vnstat for long-term totals, or your monitoring stack).
  • The bottleneck is the disk, not the wire. A slow transfer with the link nowhere near saturated usually means I/O is the limit. iotop tells you which process is hammering the disk, which is the natural next check after nload rules out the network.

For a quick "is the pipe full right now" check on any box you can SSH into, nload is exactly the right amount of tool.

See also

FAQ

Sources

Authoritative references this article was fact-checked against.

TagsnloadBandwidth MonitoringCLILinuxNetworkingSystem Administration

Found this useful? Pass it on.

Copied

Ishan Karunaratne

Software Systems Architect · Senior Software Engineer · Engineering Leadership

Software systems architect and senior software engineer with more than two decades designing, building, and running production software, Linux systems, and DevOps infrastructure, and lately working AI into the stack. Now a CTO, though what I write here is drawn from the full arc of that work, across architecture, engineering, and operations, not any single job.

Keep reading

Related posts

Download an entire YouTube playlist or channel free with yt-dlp: use a download archive for incremental re-runs, organize files with output templates, grab item ranges, and rate-limit big channels.

Download a YouTube Playlist or Entire Channel with yt-dlp

Download a whole YouTube playlist or entire channel free with yt-dlp: point it at a playlist or @handle, use a download archive so re-runs skip what you already have, organize files with output templates, and rate-limit to dodge the bot wall.