symon(8) manual:
SYMON(8) System Manager's Manual SYMON(8)
NAME
symon – system monitor
SYNOPSIS
symon [-dtuv] [-f filename]
DESCRIPTION
symon is a lightweight system monitor that measures cpu, load,
filesystem, interface, disk, memory, pf, pf queues, mbuf, proc and sensor
statistics every 5 seconds. This information is then spooled to symux(8)
for further processing.
symon has been designed to inflict minimal performance and security
impact on the system it monitors. symux(8) has performance impact
proportional to the amount of streams it needs to manage. Ideally symux
should live on a different system and collect data from several symon
instances in a LAN.
By default, symon will drop privileges and chroot(2) to home of the
_symon user. This behaviour is not strictly needed for the cpu, mem,
mbuf, disk debug and interface probes as these will work even when symon
is started as nobody.
The options:
-d Stop symon from becoming a daemon and show debug information on
stdout.
-f filename
Read configuration from filename instead of /etc/symon.conf.
-t Test configuration file and exit.
-u By default symon will chroot(2) into _symon user home directory.
The -u disables this behaviour.
-v Show version information.
CONFIGURATION
symon obtains configuration data from /etc/symon.conf. The configuration
file contains monitor stanzas that define what resources should be
monitored and to which symux(8) the information should be streamed to.
Multiple monitor statements are allowed. Whitespace, newlines and text
behind '#' are ignored. The format in BNF:
monitor-rule = "monitor" "{" resources "}" [every]
"stream" ["from" host] ["to"] host [ port ]
resources = resource [ version ] ["(" argument ")"]
[ ","|" " resources ]
resource = "cpu" | "cpuiow" | "debug" | "df" | "flukso" |
"if" | "io" | "load" | "mbuf" | "mem" | "pf" |
"pfq" | "proc" | "sensor" | "smart"
version = number
argument = number | name
every = "every" time
time = "second" | number "seconds"
host = ip4addr | ip6addr | hostname
port = [ "port" | "," ] portnumber
Note that symux(8) data files default to receiving data every 5 seconds.
Adjusting the monitoring interval will also require adjusting the
associated symux(8) datafile(s).
The pf probe will return data that is collected for the loginterface set
in /etc/pf.conf(5).
The Linux io, df, and smart probes support device names via id, label,
path and uuid.
The FreeBSD io, df, and smart probes support gpt names, ufs names, ufs
ids and paths.
The OpenBSD io probe supports device uuids.
EXAMPLE
Here is an example OpenBSD symon.conf that monitors cpu, memory, pf,
interfaces xl0/de0/lo0/wi0, disks wd[0-3]/cd[0-1], debug variables debug0
to debug19 and streams that information to localhost on port 2100.
monitor { cpu(0), mem, pf, if(xl0), if(de0),
if(lo0), if(wi0), io(wd0), io(wd1),
io(wd2), io(wd3), io(cd0), io(cd1),
io(ccd0), df(sd0a), df(sd0d), df(sd0e),
debug, proc(httpd) } stream to 127.0.0.1 2100
EXAMPLE
Here is an example Linux symon.conf that monitors cpu including iowait,
memory, load, interface eth0, io and df for a set of disks every 5
seconds. Smart data is to be collected every 60 seconds. Disks in the
smart and io statements are identified using ids, filesystem volumes in
df using labels.
monitor { smart(ata-Hitachi_HDS722020ALA330_JK1130ABABABAB),
smart(ata-Hitachi_HDS722020ALA330_JK1130ACACACAC),
} every 60 seconds stream to 192.168.0.2 port 2100
monitor { cpuiow(0), cpuiow(1), mem, if(eth0),
io(ata-Hitachi_HDS722020ALA330_JK1130ABABABAB),
io(ata-Hitachi_HDS722020ALA330_JK1130ACACACAC),
df(data_1),
df(data_2),
df(data_3),
df(home),
df(var),
load
} stream to 192.168.0.2 port 2100
SIGNALS
SIGHUP Causes symon to read /etc/symon.conf. symon will keep the old
configuration if errors occured during parsing of the
configuration file. Note that the chroot(2) may cause resources
to become unattainable, most notably the configuration file
itself.
FILES
/var/run/symon.pid
Contains the program id of the symon daemon.
/etc/symon.conf
symon system wide configuration file.
BUGS
Every monitored resource mentioned /etc/symon.conf gets queried.
Mentioning, for example, cpu(0) twice for different muxes will result in
two distinct cpu(0) measurement actions.
The proc module is too simple: memory shared between two instances of the
same process is simply counted twice.
symon does not check whether all resources mentioned in /etc/symon.conf
exist.
AUTHOR
Willem Dijkstra <wpd@xs4all.nl>. Daniel Hartmeier helped to port to big-
endian architectures. Matthew Gream helped to port symon to other BSD
platforms.
Port contributors: Marc Balmer, Tito Dal Canton, Matthew Gream, Daniel
Hartmeier, Lars Kotthoff, Constantine A. Murenin, J. Martin Petersen,
Fredrik Soderblom, Harm Schotanus and Martin van der Werff.
Valeriy Leshchinskiy maintains a windows symon client at
https://github.com/ValHazelwood/SymonClient .
SEE ALSO
symux(8)
Linux 6.13.5-arch1-1 April 4, 2012 Linux 6.13.5-arch1-1
symux(8) manual:
SYMUX(8) System Manager's Manual SYMUX(8)
NAME
symux – symon stream multiplexer
SYNOPSIS
symux [-dltv] [-f filename]
DESCRIPTION
symon(8) is a lightweight system monitor that measures cpu, load,
filesystem, interface, disk, memory, pf, pf queues, mbuf, proc and sensor
statistics every 5 seconds. This information is then spooled to symux for
further processing.
symon(8) has been designed to inflict minimal performance and security
impact on the system it monitors. symux has performance impact
proportional to the amount of streams it needs to manage. Ideally symux
should live on a different system and collect data from several symon(8)
instances in a LAN. symux stores the incoming streams in .rrd files and
distributes the information to connected listeners. Listeners can connect
to symux on a fifo and receive incoming symon(8) transmissions decoded
into ascii.
symux needs no specific privileges besides being able to open it's ports
and the rrd files. It should be run as nobody.
The options:
-d Stop symux from becoming a daemon and show debug information on
stdout. Use this setting to find hosts or specific statistics
that do get sent, but are ignored due to configuration.
-f filename
Read configuration from filename instead of /etc/symux.conf.
-l List rrd files found in active configuration.
-t Test configuration file and exit.
-v Show version.
CONFIGURATION
symux obtains configuration data from /etc/symux.conf. The configuration
file contains one mux stanza that defines on what host address and port
symux should listen to for incoming monitored data. There is a source
section for every host that is to be monitored. The source section
defines what data to accept and where to write that data to. In the case
that a source is of another address family than the mux stanza, i.e.
source = ipv6 with mux = ipv4, a listen port of the sources' family is
opened using the unspecified address. Whitespace, newlines and text
behind '#' are ignored. The format in BNF:
stmt = mux-stmt | source-stmt
mux-stmt = "mux" host [ port ]
host = ip4addr | ip6addr | hostname
port = [ "port" | "," ] portnumber
source-stmt = "source" host "{"
accept-stmts
[ write-stmts ]
[ datadir-stmt ] "}"
accept-stmts = accept-stmt [accept-stmts]
accept-stmt = "accept" "{" resources "}"
resources = resource [ version ] ["(" argument ")"]
[ ","|" " resources ]
resource = "cpu" | "cpuiow" | "debug" | "df" | "flukso" |
"if" | "io" | "load" | "mbuf" | "mem" | "pf" |
"pfq" | "proc" | "sensor" | "smart"
version = number
argument = number | interfacename | diskname
datadir-stmt = "datadir" dirname
write-stmts = write-stmt [write-stmts]
write-stmt = "write" resource "in" filename
Note that
port in the mux-stmt specifies the port-number for the udp port
(incoming symon(8) traffic).
version
is needed to distinguish between the same type of information
(i.e. io ) coming from different versions of OpenBSD. If no
version number is supplied, the latest will be assumed.
datadir
will guess filenames for all accepted streams. write statements
always take precendence over a datadir statement.
EXAMPLE
Here is an example symux.conf that listens to udp port 2100 on lo0, and
accepts cpu, memory, pf, interfaces xl0/de0/lo0/wi0, disks
wd[0-3]/cd[0-1], disk free blocks of three partition streams from a
symon(8) on localhost.
mux 127.0.0.1 2100
source 127.0.0.1 {
accept { cpu(0), mem, pf,
if(xl0), if(de0),
if(lo0), if(wi0),
io(wd0), io(wd1), io(wd2),
io(wd3), io(cd0), io(cd1),
df(sd0a), df(sd0d), df(sd0e) }
datadir "/var/www/symon/rrds/localhost"
}
LISTENERS
symux offers received symon(8) data to other programs via a fifo. An
example of a listener session:
nexus:~/project/symon$ cat /var/run/symux.fifo
10.0.0.1;mem::1077662160:7630848:53850112:469417984:0:25600;cpu:0:
1077662160:0.00:0.00:0.30:0.20:99.50;io:wd0:1077662160:2074:12759:
0:30736384:131780608;
10.0.0.2;mbuf::1077658247:138:74:0:0:41:0:23:0:90:360:868352:25:0:
0:0;pf::1077658247:700930123:535398451:0:352:1107229:706391:119833
9:4:0:0:2:3:29:4109383:83291:83262:980325:0:1:6:0:0;mem::107765824
7:79155200:131956736:391430144:0:536739840;cpu:0:1077658247:0.50:0
552:0;if:lo0:1077658247:147104:147104:45868177:45868177:0:0:0:0:0:
0;if:xl0:1077658247:284267:452077:150620236:273265863:372:89478:0:
0:0:0;if:de0:1077658247:1813721:1197722:729054136:568900227:101:2:
0:0:198:0;
^C
The format is symon-version : symon-host-ip : stream-name :
stream-argument : timestamp : data
Data formats:
cpu Time spent in ( user, nice, system, interrupt, idle ). Total time
is 100, data is offered with precision 2.
cpuiow Time spent in ( user, nice, system, interrupt, idle, iowait ).
Total time is 100, data is offered with precision 2.
debug Kernel variables debug0 to debug19. ( debug0 : ... : debug19 ).
Values are 32 bit unsigned integers.
df Disk free statistics ( blocks : bfree : bavail : files : ffree :
syncwrites : asyncwrites ). Values are 64 bit unsigned integers.
load Load averages for the last 1, 5, and 15 minutes ( load1, load5,
load15 ). Data is offered with prec ision 2 and a maximum of 655.
if Alias for if2. See below.
if1 Pre OpenBSD 4.3 interface counters ( packets_in, packets_out,
bytes_in, bytes_out, multicasts_in, multicasts_out, errors_in,
errors_out, collisions, drops ). Values are 32 bit unsigned
integers.
if2 Interface counters ( ipackets, opackets, ibytes, obytes, imcasts,
omcasts, ierrors, oerrors, collisions, drops ). Values are 64 bit
unsigned integers.
io Alias for io2. See below.
io1 Pre OpenBSD 3.5 io/disk counters ( total_transfers, total_seeks,
total_bytes ). Values are 64 bit unsigned integers.
io2 Io/disk counters ( rxfer, wxfer, seeks, rbytes, wbytes). Values
are 64 bit unsigned integers.
mbuf Mbuf statistics ( totmbufs : mt_data : mt_oobdata : mt_control :
mt_header : mt_ftable : mt_soname : mt_soopts : pgused : pgtotal
: totmem : totpct : m_drops : m_wait : m_drain ).
mem Alias for mem2. See below.
mem1 Pre symon 2.78 memory counters ( real_active, real_total, free,
swap_used, swap_total ). All values are in bytes rounded to page
boundaries. Values are 32 bit unsigned integers.
mem2 Memory in ( real_active, real_total, free, swap_used, swap_total
). All values are in bytes rounded to page boundaries. Values are
64 bit unsigned integers.
pf Packet filter statistics ( bytes_v4_in : bytes_v4_out :
bytes_v6_in : bytes_v6_out : packets_v4_in_pass :
packets_v4_in_drop : packets_v4_out_pass : packets_v4_out_drop :
packets_v6_in_pass : packets_v6_in_drop : packets_v6_out_pass :
packets_v6_out_drop : states_entries : states_searches :
states_inserts : states_removals : counters_match :
counters_badoffset : counters_fragment : counters_short :
counters_normalize : counters_memory ). Values are 64 bit
unsigned integers.
pfq pf/altq queue statistics ( sent_bytes : sent_packets : drop_bytes
: drop_packets ). Values are 64 bit unsigned integers.
proc Process statistics ( number : uticks : sticks : iticks : cpusec :
cpupct : procsz : rsssz ).
sensor Single sensor measurement offered with 7.6 precision. Value
depends on sensor type.
smart SMART attributes ( read_error_rate: reallocated_sectors:
spin_retries: air_flow_temp: temperature: reallocations:
current_pending: uncorrectables: soft_read_error_rate:
g_sense_error_rate: temperature2: free_fall_protection ). Values
depend on drive model and may change between models.
flukso Average pwr sensor value offered with 7.6 precision. Value is a
moving average and will depend on the number of measurements seen
in a particular symon interval.
SIGNALS
SIGHUP Causes symux to read /etc/symux.conf or the file specified by the
-f flag. symux will keep the old configuration if errors occured
during parsing of the configuration file.
FILES
/var/run/symux.pid
Contains the program id of the symux daemon.
/var/run/symux.fifo
The named pipe / fifo that transmits an ascii version of the
incoming measurements.
/etc/symux.conf
symux system wide configuration file.
LEGACY FORMATS
symux supports symon(8) clients that send
pre OpenBSD 3.5 disk statistics.
These streams should be identified as io1(<disk>) instead of
io(<disk>) in /etc/symux.conf. Also note that symon(8) measures
io1 or io2 depending on whether it was compiled on a host that
supports version 1 or 2. The rrd datastructures of these streams
differ and there is no easy way to change an io1 rrd into an io2
rrd.
pre symon 2.78 mem/if statistics.
These streams should be identified as if1(<interface>) and mem1()
in /etc/symux.conf. symon versions 2.78 and up will always report
if2 and mem2 statistics. The rrd files for the old and new probes
are identical and need not be changed.
symux will output what version of information it is offered by symon(8)s
on the network when started with the -d flag.
BUGS
symux writes incoming data to rrd files "in process". An rrdupdate on a
somewhat stale rrdfile -- with the last data from quite some time in the
past -- is a very expensive operation. This can cause symux to lockup
while rrdupdate is updating the rrd file. symux will be unresponsive
during this process.
AUTHOR
Willem Dijkstra <wpd@xs4all.nl>. Daniel Hartmeier helped to port to big-
endian architectures. Matthew Gream helped to port symon to other BSD
platforms.
Port contributors: Marc Balmer, Tito Dal Canton, Matthew Gream, Daniel
Hartmeier, Lars Kotthoff, Constantine A. Murenin, J. Martin Petersen,
Fredrik Soderblom, Harm Schotanus and Martin van der Werff.
SEE ALSO
symon(8)
Linux 6.13.5-arch1-1 April 4, 2012 Linux 6.13.5-arch1-1
Installation instructions for symon, also accessable as the file README.md inside the symon-version.tar.gz:
() ()
symon
symon is a lightweight system monitor that measures cpu, load,
filesystem, interface, disk, memory, pf, pf queues, mbuf, proc and
sensor statistics every 5 seconds. This information is then spooled to
symux(8) for further processing.
symon has been designed to inflict minimal performance and security
impact on the system it monitors. symux(8) has performance impact
proportional to the amount of streams it needs to manage. Ideally
symux should live on a different system and collect data from several
symon instances in a LAN.
By default, symon will drop privileges and chroot(2) to home of the
symon user. This behaviour is not strictly needed for the cpu, mem,
mbuf, disk debug and interface probes as these will work even when
symon is started as nobody.
symon has been ported to FreeBSD, NetBSD, OpenBSD and Linux.
Rationale
There are many system monitoring tools; what is unique to symon: -
lightweight, aim is to get the data at minimum cpu cost - measure every
5 seconds, this high measurement speed makes e.g. network burst
throttling visible - can be used to feed real-time dashboards that show
health of all hosts in a deployment
Suite
Currently the suite consists of these parts: - symon - lightweight
system monitor. Can be run with privleges equivalent to nobody on the
monitored host. Offers no functionality but monitoring and forwarding
of measured data. - symux - persists data. Incoming symon streams are
stored on disk in rrd files. symux offers systems statistics as they
come in to 3rd party clients. - SymuxClient.pm - generic perl symux
client. Could, for instance, be used to get the hourly amount of data
that was transmitted on a particular interface. - syweb - draws
rrdtool pictures of the stored data. syweb is a php script that can
deal with chrooted apaches. It can show all systems that are monitored
in one go, or be configured to only show a set of graphs. (separate
package) - sylcd - symux client that drives CrystalFontz and HD44780
lcds. sylcd shows current network load on a specific host. (separate
package)
Building & Installing
Privileges
symux needs read and write access to its rrdfiles.
symon needs to interface with your kernel. Depending on your host
system this leads to different privilege requirements:
OpenBSD: - no privs: cpu, debug, df, if, io, mbuf, mem, proc, sensor -
rw on /dev/pf for pf
NetBSD: - no privs: cpu, debug, df, if, io, mbuf, proc - r on
/dev/sysmon for sensor
FreeBSD: - no privs: all - non-chroot on FreeBSD 5.x for CPU ticks in
proc - rw on /dev/pf for pf and pfq
Linux: - r on /proc/net/dev: if - r on /proc/stat: cpu, cpuiow - r on
/proc/meminfo: mem
all: - r on chroot/etc/localtime for proper timezone logging
Real quick on OpenBSD
Install binary packages using:
pkg_add symon # on all monitored hosts
pkg_add symux # on the loghost
pkg_add syweb # also on the loghost
Or build from source:
/usr/ports/net/rrdtool && make install) &&
make &&
make install &&
vi /etc/symux.conf /etc/symon.conf &&
~symon/symux/c_smrrds.sh all &&
/usr/local/libexec/symux &&
useradd -d /var/empty -L daemon -c 'symon Account' -s /sbin/nologin _symon
/usr/local/libexec/symon
Note that the syweb package to show the data stored in the rrd files is
a separate package.
Less quick, but all OSes
• Install rrdtool on the host that will also run your symux gatherer.
BSDs: cd /usr/ports/net/rrdtool && make install
• Check Makefile.inc for settings. Things to watch out for are:
• PREFIX = Where does the installation tree start. Defaults to
/usr/local.
• BINDIR = Where should the daemons be put, relative to $PREFIX.
Defaults to libexec.
• MANDIR = Where should the manuals be installed, relative to
$PREFIX. Defaults to man.
• SHRDIR = Where are the example configurations to be installed.
Defaults to share/symon.
• RRDDIR = $RRDDIR/include should yield rrd.h. Define SYMON_ONLY in
the environment or on the make command line to render this mute.
• INSTALLUSER / GROUPDIR / GROUPFILE = user and groups that install
should use.
• you can define SYMON_ONLY if you do not want to compile symux / do
not have rrdtool installed.
• symon/platform/os/Makefile.inc is read before Makefile.inc; define
your vars in the environment, or in Makefile.inc with != to force
overwriting the defaults.
BSDs: Run make && make install
Linux: Run pmake && pmake install || bmake && bmake install
• Create an /etc/symon.conf for each monitored host and one symux.conf
for the gatherer host. See the manual pages on how to specify
alternative configuration file locations, if necessary. Note that
there are example configurations for both in $PREFIX/$SHRDIR.
• Create the rrd files where the incoming symon data is to be stored.
$PREFIX/$SHRDIR/c_smrrds.sh and symux -l are your friends. Note that
syweb expects an .../machine/*.rrd style directory structure
somewhere under /var/www.
• Ensure that /etc/localtime is accessible by symon/symux. Failing
this you will get log messages in GMT. Note that etc is chroot/etc
when symon chroots.
• Both symon and symux will daemonize if started normally. Start them
with debugging on initially to iron out any configuration problems:
$PREFIX/$BINDIR/symux -d &
$PREFIX/$BINDIR/symon -d
• Remove -d flags and check system logs for any failures.
• Only if you need the web interface: download and install syweb.
Getting measurements without the web
The client directory contains a perl module SymuxClient.pm that can be
used to read measurements as they come in at the symux host. A sample
Perl program called getsymonitem.pl shows how to use the module.
Example:
nexus$ cat /var/run/symux.fifo | getsymonitem.pl 127.0.0.1 2100 127.0.0.1 "cpu(0)" "idle"
93.40
Historical data can be gathered using rrdfetch(1) from symux’s rrd
files.
Portability
This package was originally built as an OpenBSD application. It now
has support for FreeBSD, NetBSD and Linux.
My mental rules for extensions
• Cpu cost matters more than storage.
• Structures are not overloaded in functionality even if that would be
possible memberwise. Overloading = code can be understood in more
than one way and that leads to more maintenance and bugs.
• Defined values are not overloaded in functionality if possible. Same
reason as above.
• Error messages carry __FILE__, __LINE__ if they are failed assertions
and plain English if they can be attributed to the end-user.
• Marshalling is hard. Alignment is carried out by bcopy.
• Support improvements of kernel structures by adding a new stream
type. Goal is to support both the old and the new, so that a
deployment can slowly move towards newer installations without losing
metrics.
• add a new stream id with a postfix (i.e. IO2)
• make old stream accessable via lex with previous postfix (i.e. io1)
()
Installation instructions for syweb, also accessable as the file INSTALL inside the syweb-version.tar.gz:
Installation ------------ Requirements to show a graph: - PHP: Language version needed is 7.4+. - Program files: Download syweb-version.tar.gz from the website and copy htdocs/ and symon/ from the archive into ~www. - Data files: Make your symon rrds accessable to php as run by your http server. Move them into ~www/symon/rrds and update symux. - Configuration: Customise ~www/htdocs/syweb/setup.inc. The supplied setup.inc is intended for chrooted httpd using php-fpm on OpenBSD. - RRDtool: Must be available in whatever web container you are using. E.g. for OpenBSD chrooted httpd, rrdtool must be available inside the chroot. - Date & time: chrooted httpd may have a different idea of timezone. Add etc/localtime to chroot if needed. Point your browser to http://127.0.0.1/syweb/configtest.php to test the configuration. This page will show if the application cannot deal with a setting in setup.inc. Point your browser to http://127.0.0.1/syweb/index.php for the main page. You can move index_noui.php to index.php if you do not need the ui. RRDTool and chrooted httpd -------------------------- RRDTool has a large number of requirements that it must be able to access in order to run. This can require copying a fair number of files inside your chrooted httpd. - Dynamically linked libraries: find out using ldd rrdtool - Dynamically linking kit: ld.so must be available inside chroot to do the dynamic linking, and must be fed a chroot adjusted ~www/var/run/ld.so.hints - Fonts data: a subset of fonts from /usr/X11R6/lib/X11/fonts/TTF/DevaVuSansMono* must be available in a ~www/fontdirectory. - Font configuration: "fontdirectory" must be specified in chroot ~www/etc/fonts/fonts.conf. And finally: - sh binary: this is needed by PHP to be able to execute rrdtool. All these steps are detailed for OpenBSD in install_rrdtool.sh.
![[symon]](img/symon.png)