Better Cacti memory usage graphs

Cacti is a wonderful tool, but many of the default graphs are ugly. Worse, the “ucd/net Memory Usage” graph is totally useless. It displays memory which is free, or dedicated to cache or buffers. But it doesn’t display the actual used memory or total. And it uses the wrong base, assuming there are 1000 bytes in a kilobyte of memory. I can’t imagine why this graph template is even included with Cacti by default. So, I set out to make a better one.

The implementation for “used memory” in the SNMP OID is inconsistent across devices. But you can fetch “total memory”, and do the math:

Used memory = Total – (Free + Cache + Buffers)

Many people have used this method to make better memory usage templates. Eric A. Hall made a much prettier graph, but it relies on an external script to fetch the data and do the math. This is unnecessary, and (slightly) slower than using Cacti CDEF functions. Hans Fugal used CDEF functions, but his graphs use an eye-searing colour scheme. He also uses the wrong base; there are 1024 bytes in a kilobyte of RAM, not 1000 as in hard drives or network data rate.

Here are mine:

My implementation uses Eric Hall’s colour scheme and Hans Fugal’s CDEF method, but graphs real memory and swap as two separate graphs. It also uses the correct unit base of 1024. These graphs are also intended for Linux. Unix operating systems won’t report Buffers or Cache, but they’ll graph correctly as long as they report Free and Total.

Only after making my own did I discover fmangeant‘s graphs. These use the CDEF method and correct base, although I’m not fond of the colours. The “Memory Usage Unix” graph would be useful if your device doesn’t report Buffers or Cache and you don’t want to see zero values on your graph.

Used Memory is calculated from the other values. Are any of them showing NaN?

Did you get the CDEF “Memory Usage – Calculate Memory Used” in the import?

Are you polling at 1 minute or 5? Since this uses multiple data sources, if your poller runs every minute but you only poll for this graph every five, you’ll have a problem. The easiest solution is to make sure this

I’ve replaced the XML files on this post with my latest versions. Changes:
– Removed the maximum values on RAM, which default to 10 GB. That’s too low on modern equipment.
– Changed to polling every minute. Should work on 5-minute polling. To change back, edit all Memory Usage data templates and change Step from 60 to 300 and Heartbeat from 120 to 600.

A default Cacti install has Poller Internal set to 5 minutes, but higher end users often set this to 1 minute (and update cron). After that, they edit any data source templates and add the “Hourly (1 Minute Average)” RRA, and lower Step to 60 and Heartbeat to 120. If you’re using the default config, consider editing my Data Source Templates and change Step to 300 and Heartbeat to 600 in all places.

Please try the new XMLs on this post.

If that fails, turn on graph debugging and post what it prints here. Mine looks like this:

Sometimes updating or importing graph templates causes errors where CDEFs aren’t correctly applied. If you see any lines lacking the “cdef” prefixes where they do exist in my example, that’s your issue. The workaround is to edit the Graph Template, edit each item, and save.

The lines that say “:cdefbd#74C366FF:”Free”:STACK” are in error. They should begin with “AREA”. Try editing each of those lines and change them to AREA for the first item and STACK for the others. You may need to change them to LINE1 and then back again for this to fix itself.