LibreNMS vs Zabbix on Cisco IOS XE: Same Devices, Same SNMPv3, Honest Results

LibreNMS 26.10.2 and Zabbix 7.0.32 monitoring the same IOS XE routers and switch over SNMPv3: autodiscovery, graphs, a real BGP alert test and measured memory, with where each tool fits.

LibreNMS vs Zabbix on Cisco IOS XE: Same Devices, Same SNMPv3, Honest Results

I've run Zabbix 7.0.32 against my lab routers for the whole Zabbix series. LibreNMS keeps coming up as the "just point it at the subnet" alternative, so I put LibreNMS 26.10.2 next to it and monitored the same three devices with the same SNMPv3 user: two Cisco IOS XE 17.18.2 WAN routers and an IOS XE 17.18.2 access switch, built in my home lab.

This post covers discovery, graphs, a BGP alert and the memory each one used. It doesn't pick a winner. The two tools are good at different jobs, and the lab shows where each one fits.

LibreNMS 26.10.2 device list showing acc-sw1.lab, wan-rtr1.lab and wan-rtr2.lab, all Cisco IOS-XE 17.18.2
All three devices found by one subnet scan.
Lab diagram: LibreNMS 26.10.2 and Zabbix 7.0.32 LTS poll the same three IOS XE 17.18.2 devices (wan-rtr1, wan-rtr2 and acc-sw1) over SNMPv3 on the 10.66.20.0/24 management network. wan-rtr1 and wan-rtr2 use authPriv SHA/AES and peer over eBGP (10.0.12.1 to .2); acc-sw1 uses authNoPriv SHA. LibreNMS runs web plus dispatcher with MariaDB 11.4 and Redis 7.2, about 338 MiB, polling every 5 minutes. Zabbix runs server, MySQL, web, agent and SNMP traps, about 873 MiB, with per-item intervals. A note says the pollers must use a source IP allowed by the SNMP ACL. In the BGP test (PST) the neighbour was shut at 9:14:02 AM, Zabbix raised a problem at 9:15:01 (59 s later), LibreNMS alerted at 9:19:36, the session was restored at 9:20:44 and the alert cleared at 9:24:36. LibreNMS lost a poll during the test, so the gap is not a benchmark.
Both tools poll the same three devices over SNMPv3. In the BGP test Zabbix raised the problem 59 s after the shutdown, but LibreNMS lost a poll, so this is not a benchmark.

Setup and versions

  • LibreNMS 26.10.2 (GPL-3.0), the official librenms/librenms container with MariaDB 11.4, Redis 7.2 and a separate dispatcher container that runs the pollers.
  • Zabbix 7.0.32 LTS with MySQL, as built in the earlier posts.
  • Devices: wan-rtr1 (AS65001), wan-rtr2 (AS65002) and acc-sw1. SNMPv3 user zbxmon is authPriv (SHA/AES) on the routers and authNoPriv (SHA) on the switch. I kept the switch that way on purpose, so both tools had to handle two security levels.

One gotcha cost me twenty minutes. The routers only accept SNMP from a short ACL, and the dispatcher container polled from its own IP, so every poll timed out and LibreNMS marked the devices down. Running the dispatcher in the web container's network namespace (network_mode: "service:librenms") made both poll from the one allowed address. If your devices filter SNMP by source, check where the pollers actually live.

Autodiscovery

LibreNMS stores SNMPv3 credentials as an ordered list and tries each one. I added the authPriv entry first and the authNoPriv entry second, then set the subnet and turned on CDP/LLDP discovery:

lnms config:set nets.+ 10.66.20.0/24
lnms config:set snmp.version v3
lnms config:set snmp.v3.0 '{"authlevel":"authPriv","authname":"zbxmon","authpass":"<AUTH>","authalgo":"SHA","cryptopass":"<PRIV>","cryptoalgo":"AES"}'
lnms config:set snmp.v3.1 '{"authlevel":"authNoPriv","authname":"zbxmon","authpass":"<AUTH>","authalgo":"SHA"}'
lnms config:set autodiscovery.xdp true

Then one scan of the management subnet, run as the librenms user in /opt/librenms:

$ ./snmp-scan.py 10.66.20.0/24
Scanned 254 IPs: 0 known devices, added 3 devices, failed to add 5 devices
Runtime: 30.13 seconds

The five failures are Linux hosts on that subnet with no SNMP agent, which is what you want. LibreNMS named the devices from reverse DNS, so give your devices proper PTR records (or host entries) before the first scan. Renaming later works, but deleting and rescanning was faster for me.

In Zabbix the same job is a discovery rule plus an action, or the API, as in the auto-discovery and API onboarding post. That takes longer to set up, but you control exactly which template, host group and tags each device gets. LibreNMS picks the OS module for you and starts graphing everything it finds.

What you get with no templates

Each device page has ports, processors, memory, BGP, OSPF, CEF, VRFs and CDP neighbours, all from SNMP, without me choosing a template. The ports view picks up interface descriptions, IPs, VRF and the neighbour on each link:

LibreNMS port list for wan-rtr1.lab with Ethernet0/0 to Ethernet0/3, traffic rates, speed, MAC address and CDP neighbours wan-rtr2.lab and acc-sw1.lab
wan-rtr1 ports. The neighbour column comes from CDP.
LibreNMS overview page for wan-rtr1.lab showing hardware ciscoGatewayServer, Cisco IOS-XE 17.18.2, processor and traffic graphs and recent BGP events
Device overview about twenty minutes after the first scan, so the graphs are short.

Zabbix gets the same data through the Cisco IOS SNMP template, but you decide what's collected, how often, and what's a trigger. That's more work up front and much more control later. I relied on that control in the trigger dependencies post, and LibreNMS has nothing quite like it.

A BGP alert in both

LibreNMS ships with no alert rules enabled out of the box. I made two through the API: "Port down (admin up)" and "BGP session down", which fires when bgpPeerState isn't established and bgpPeerAdminStatus is start. No transport is set up, so the alerts only appear in the web UI.

The test: shut the eBGP neighbour on wan-rtr2 and watch wan-rtr1's view of it.

wan-rtr2(config)# router bgp 65002
wan-rtr2(config-router)# neighbor 10.0.12.1 shutdown
Time (PST)Event
9:14:02 AMNeighbour shut on wan-rtr2
9:15:01 AMZabbix problem: BGP peer 10.0.12.2 (AS 65002) not established on wan-rtr1
9:19:36 AMLibreNMS alert: BGP session down on wan-rtr1.lab
9:20:44 AMNeighbour re-enabled
9:24:36 AMLibreNMS alert cleared
LibreNMS alert log with two BGP session down entries for wan-rtr1.lab, raised at 9:19:36 AM and cleared at 9:24:36 AM
The alert log: raised, then cleared one poll after the session came back.

Don't read the gap as a benchmark. My dispatcher problem was still being fixed during this test, so LibreNMS lost a poll. The real difference is the polling model. LibreNMS polls every device every five minutes by default, so a BGP drop shows up somewhere between a few seconds and five minutes later. In Zabbix, each item has its own interval, and my BGP state item raised the problem 59 seconds after the shutdown. You can shorten LibreNMS polling, but it applies to the whole device and needs RRD changes, so most people leave it alone. If minute-level alerting on a few key items matters, Zabbix does that better. For "graph everything and tell me when something breaks", five minutes is usually fine.

LibreNMS BGP page for wan-rtr1.lab showing peer 10.0.12.2 AS65002 established, with last error Cease - Administrative Shutdown
After the restore. LibreNMS keeps the last error from the peer.

Memory, measured

Both stacks were idle with the same three devices, measured with docker stats:

StackContainersMemory
LibreNMS 26.10.2web 130 MiB, MariaDB 143 MiB, dispatcher 58 MiB, Redis 7 MiBabout 338 MiB
Zabbix 7.0.32MySQL 605 MiB, server 193 MiB, web 48 MiB, agent 15 MiB, SNMP traps 13 MiBabout 873 MiB

That's not quite like for like. My Zabbix has been running for weeks with more hosts, history and a bigger InnoDB buffer pool. On a fresh install with three devices, the gap would be smaller. What it does show is that LibreNMS is light enough to run next to everything else on a small box.

Side by side

LibreNMS 26.10.2Zabbix 7.0.32
First device graphedMinutes: set credentials, scan the subnetLonger: hosts, templates, macros, or a discovery action
SNMPv3 with mixed levelsOrdered credential list, tried in turnPer-host or per-macro credentials
PollingEvery device every 5 min by defaultPer item, set as short as you need
AlertsRule builder on collected data, none enabled by defaultTriggers with dependencies, hysteresis and escalations
Network viewsPorts, BGP, OSPF, CDP neighbours, maps built inWhatever the templates collect, plus your own maps
Beyond the networkMostly network devicesServers, apps and agents as well

Where LibreNMS is better: getting from nothing to graphs for a pile of network gear, and having routing and neighbour views ready without any template work. Where Zabbix is better: tuning alerts so they don't spam, fast checks on the few items that matter, and monitoring servers and applications from the same place. In a real network I'd happily run LibreNMS as the network team's discovery-and-graphs tool and keep Zabbix for alerting that pages people.

Caveats

  • Three devices and twenty minutes of data is enough to judge setup and alerting, but not how either one scales.
  • LibreNMS alerting needs a transport (email, Slack, webhook) before it tells anyone anything. Mine only shows in the UI.
  • Name your devices in DNS first, because LibreNMS takes the reverse lookup as the hostname.

Now live: Netdisco on Cisco IOS XE, CDP topology plus MAC and ARP search on the same lab.

Read next