System Monitoring with Sar

sar is part of the sysstat project, a suite of programs for system monitoring. With sar, we can log system activity, build performance reports and even make plots.
sar is available on Linux, Solaris, AIX and HP-UX.
We can choose to run sar automatically, as an unattended script. Or interactively and get system metrics on the spot.
Unattended Mode
With a simple cron entry we can log system activity. If possible, as root, otherwise some data may be missing.
# cron entries, take a sample every 10 minutes
@reboot /usr/lib/sa/sa1 --boot
*/10 * * * * /usr/lib/sa/sa1 1 1 -S DISK
The @reboot line is kind of optional, but if the cron supports it’s good to have since it ensures the counters are reset
on boot.
sa1 is script that calls sadc, which does the actual collection.
To prevent the files from growing too large not everything is stored, however
additional counters can be enabled with -S.
Optional collection options for sadc:
- DISK block devices
- XDISK block devices and partitions
- INT system interrupts
- IPV6 network IPV6 statistics
- POWER power management
- SNMP is for the SNMP statistics
- ALL everything except XDISK
- XALL everthing including XDISK
Also check sysstat’s config for compression and retention options. /etc/conf.d/sysstat or /etc/default/sysstat
To access the stored data we have two alternatives:
sa2 is a script that generates an activity report for the previous day (/var/log/sarNN). This can be croned easily:
# generate daily activity report
00 18 * * * /usr/lib/sa/sa2 -A
The other way is calling sar directly, this lets us choose the view:
# sar views with extended options
-u [ALL] CPU utilization (default view)
-b I/O rates
-d block device activity
-F mounted filesystem statistics
-n ALL network statistics
-P ALL per processor statistics
-q queue and load average
-r [ALL] memory utilization
-H hugepages utilization
-S swap space utilization
-B paging statistics
-W swapping activity
-v inode and kernel tables
-w task/process creation
-y TTY device activity
-m ALL power management statistics
-I ALL interrupts
-A Everything
Some views have additional options, for example -n ALL shows all network activity (including protocols) while -n DEV
only shows network devices.
sar by default shows today’s logs, -1 brings yesterday’s, -2 the day before yesterday and so on.
We can specify the day’s starting -s and end times -e in HH:MM:SS format
# yesterday's cpu report, with start and end time
sar -1 -s 2:58:05 -e 2:58:55
Linux 4.19.8-arch1-1-ARCH (ix) 12/26/2018 _x86_64_ (4 CPU)
02:58:05 PM CPU %user %nice %system %iowait %steal %idle
02:58:10 PM all 10.89 0.00 7.82 0.00 0.00 81.29
02:58:15 PM all 9.82 0.00 7.35 0.00 0.00 82.83
02:58:20 PM all 11.28 0.00 6.33 0.05 0.00 82.34
02:58:25 PM all 10.69 0.00 7.06 0.05 0.00 82.21
02:58:30 PM all 10.27 0.00 7.02 0.00 0.00 82.71
02:58:35 PM all 11.49 0.00 8.22 0.00 0.00 80.30
02:58:40 PM all 11.90 0.00 6.66 0.05 0.00 81.39
02:58:45 PM all 14.38 0.00 7.14 0.05 0.00 78.43
02:58:50 PM all 10.66 0.00 6.63 0.00 0.00 82.71
02:58:55 PM all 15.01 0.00 6.63 0.00 0.00 78.35
Average: all 11.63 0.00 7.09 0.02 0.00 81.26
Interactive Sar
A quicker alternative is running sar interactively. We can log system activity while doing some other tasks. Perhaps while running a benchmark or doing some troubleshooting.
With the -o option, sar stores/appends data in a file or directory.
sar takes a sample interval (in seconds) and count that works as a stop condition.
# collect activity in my_metrics file, 1 sample per second, 60 samples total
sar -o my_metrics 1 60
Linux 4.19.8-arch1-1-ARCH (ix) 12/24/2018 _x86_64_ (4 CPU)
07:01:06 PM CPU %user %nice %system %iowait %steal %idle
07:01:07 PM all 11.08 0.00 4.79 0.00 0.00 84.13
07:01:08 PM all 13.71 0.00 7.11 0.25 0.00 78.93
07:01:09 PM all 13.62 0.00 6.43 0.00 0.00 79.95
07:01:10 PM all 13.99 0.00 6.36 0.00 0.00 79.64
...
If you’ve used mpstat before, you’ll recognize the format, it’s exactly the same.
To retrieve the results we use -f.
We can use a different interval or count and the output will be filtered appropiately.
# print report from my_metrics file
sar -f my_metrics -s 14:00:00 1 5
Linux 4.19.8-arch1-1-ARCH (ix) 12/24/2018 _x86_64_ (4 CPU)
14:00:00 PM CPU %user %nice %system %iowait %steal %idle
14:00:01 PM all 9.47 0.00 6.01 0.00 0.00 84.52
14:00:02 PM all 11.11 0.00 5.05 0.00 0.00 83.84
14:00:03 PM all 29.62 0.00 9.87 0.00 0.00 60.51
14:00:04 PM all 12.85 0.00 3.27 0.00 0.00 83.88
14:00:05 PM all 20.00 0.00 8.86 0.00 0.00 71.14
Average: all 16.09 0.00 6.57 0.00 0.00 77.35
# print memory activity from my_metrics file
sar -r -f my_metrics
Linux 4.19.8-arch1-1-ARCH (ix) 12/24/2018 _x86_64_ (4 CPU)
07:45:47 PM kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
07:45:48 PM 755544 5216144 5525576 47.27 876804 3773928 14648100 83.48 7714540 2267792 4404
07:45:49 PM 753728 5214328 5527772 47.29 876804 3773548 14648100 83.48 7716816 2267400 4420
07:45:50 PM 734512 5195136 5546088 47.45 876804 3774448 14651412 83.49 7734560 2268308 4432
07:45:51 PM 717524 5178164 5562876 47.59 876804 3774648 14670976 83.61 7750836 2268504 4448
07:45:52 PM 711580 5172232 5568900 47.65 876804 3774568 14670976 83.61 7757748 2268428 4460
Average: 734578 5195201 5546242 47.45 876804 3774228 14657913 83.53 7734900 2268086 4433
Exporting Sar’s Data
Wouldn’t it be great to be able to export the collected data? Maybe to a database or a spreasheet?
Don’t we deserve some nice plots? No worries, sadf has us covered.
sadf syntax is a bit quirkier:
sadf [options] [ <interval> [ <count> ] ] [ <datafile> | -[0-9]+ ] -- [sar options]
options:
-p table
-d CSV
-r raw CSV (as read from the kernel)
-x XML
-d JSON
-g SVG
The options to the right of the -- are sent to sar for printing the report, here we can choose what views to export.
To select the log file we can use either 0, -1, etc for daily logs (as in the unattended mode) or just
provide the path to the datafile.
# export yesterday's I/O activity in CSV
sadf -d -1 -- -b
# hostname;interval;timestamp;tps;rtps;wtps;bread/s;bwrtn/s
ix;1;2018-12-26 17:58:06 UTC;20.00;0.00;20.00;0.00;168.00
ix;1;2018-12-26 17:58:07 UTC;0.00;0.00;0.00;0.00;0.00
ix;1;2018-12-26 17:58:08 UTC;0.00;0.00;0.00;0.00;0.00
ix;1;2018-12-26 17:58:09 UTC;71.00;0.00;71.00;0.00;624.00
...
# export CPU activity from my_metrics file in JSON
sadf -j my_metrics -- -u
{"sysstat": {
"hosts": [
{
"nodename": "ix",
"sysname": "Linux",
"release": "4.19.8-arch1-1-ARCH",
"machine": "x86_64",
"number-of-cpus": 4,
"file-date": "2018-12-26",
"file-utc-time": "17:58:05",
"statistics": [
{
"timestamp": {"date": "2018-12-26", "time": "17:58:06", "utc": 1, "interval": 1},
"cpu-load": [
{"cpu": "all", "user": 16.11, "nice": 0.00, "system": 10.58, "iowait": 0.00, "steal": 0.00, "idle": 73.32}
]
},
...
With -g we get SVG output that we can redirect into a file.
# export CPU activity as SVG plot
sadf -g -- -u > cpu.svg

# export network activity for device eth0 as SVG plot
sadf -g -- -n DEV --iface=eth0 > a.svg

Related Links
- sysstat website: http://pagesperso-orange.fr/sebastien.godard
- sysstat github: https://github.com/sysstat/sysstat
- manpages
Wrapping Up
For sure, there are a lot of more options available, I just can’t cover them all, but I think the basics were covered.
That’s all for now. If interested on system monitoring, sure to check my previous article about vmstat.
Have a good one.
Tomas