RFC/RFP Nagios command workers

Matthieu Kermagoret mkermagoret at merethis.com
Mon May 23 11:37:24 CEST 2011


On Wed, May 18, 2011 at 4:43 PM, Andreas Ericsson <ae at op5.se> wrote:
> Since discussion on the last requests for comments and patches has
> splintered off and gotten somewhere, it's time for the next mail in
> the series of what us awesome gods of the Nagios core decided to
> work on for the next grand version of Nagios.
>

Congratulations ! I'm glad to see Nagios' development moving forward !

> This idea comes from Shinken, mod_gearman and DNX which have all
> implemented versions of it, so creds and kudos to the authors of
> those projects.
>
> Currently, Nagios eats quite a lot of I/O when writing, scanning for
> and reading the check result files. This becomes especially noticeable
> in large installations. There's also the problem of Nagios using a
> lot more copied memory per fork than it's supposed to, and the fact
> that embedding scripting languages inside the Nagios core to speed
> up execution is a potentially disastrous action (as the debacle with
> embedded Perl has proven to be).
>

Good analysis to which I totally agree.

> The idea to solve all of that is to fork() off a set of worker
> threads at startup that free()'s all possible memory and re-connects
> to the master process via a unix domain socket (or network socket
> that by default only listens to the localhost address) to receive
> requests to run commands and return the results of those commands.
>

While I agree that distributing check execution among multiple
processes can be a really good idea, I don't know if this should be
implemented in the Core. This can add significant complexity to the
code while not being useful to all Nagios users. The Core already have
a proper API that allows modules to execute checks themselves, so why
not rely on it for distribution and improve the existing command
execution mechanism ?

As you say, one of the root problem of the current implementation, is
the use of temporary files, as this consumes much I/O when writing,
scanning and reading them. Also the Nagios Core process is fork()ed
multiple times and this might consume unnecessary CPU time. So I
propose the following :

1) Remove the multiple fork system to execute a command. The Nagios
Core process forks directly the process that will exec the command
(more or less sh's parsing of command line, don't really know if this
could/should be integreted in the Core).

2) The root process and the subprocess are connected with a pipe() so
that the command output can be fetched by reading the pipe. Nagios
will maintain a list of currently running commands.

3) The event loop will multiplex processes' I/O and process them as necessary.

> This has several benefits, although they're not immediately user
> visible.
> * I/O load will decrease significantly, leaving more disk throughput
>  capacity for performance data graphing or status data database
>  solutions.

Still holds but to a smaller extent, as the "problem of Nagios using a
lot more copied memory per fork than it's supposed to" is not solved.
This could be solved with a module however, see below.

> * Scripting languages can be embedded regardless of memory leaks and
>  whatnot, since worker daemons can be killed off and respawned every
>  50000 checks (or something), thus causing the kernel to clean up
>  any and all leaked memory.

There could be modules that override checks and forward them to
interpreter daemons on a per-language basis for example.

> * Nagios core can be single-threaded, which means higher portability,
>  less memory usage and more robust code.

Still holds.

> * Eventbroker modules that use a socket to communicate with an external
>  daemon can instead register a handler for inbound packets and then
>  simply "own" that connection and get all future packets from it
>  forwarded as eventbroker events. This will ofcourse reduce the module
>  complexity quite a bit for nearly all much-used modules today (Merlin,
>  livestatus, DNX, mod_gearman, NDOUtils, etc...)

Still holds, instead of multiplexing on socket FD, multiplex on pipe FD.

> * It becomes possible to receive responses from Nagios when submitting
>  commands (the current FIFO pipe is one-way communication only).
>

See discussion about the command pipe below.

> Drawbacks:
> * It's quite a large and invasive change to the nagios core which
>  will require a lot of testing.
>

This would be a less invasive and smaller change but would still
require testing ;-)

The worker system could still be implemented and used only by users
who need it (but that's what DNX and mod_gearman do). I believe it is
better to leave the default command execution system as simple as it
is right now (but improve it) and leave distribution algorithms to
modules. I can imagine multiple reasons for which one would want to
distribute checks among workers :

  - less overhead per fork() (the problem you raised)
  - embedded interpreter (your raised this also)
  - per network (the worker closer to a node execute its check)
  - randomly (clustering)
  - ...

So I don't know if embedding a particular policy within the Core is a
good thing. I'd rather see an official module (that might be included
by default) for the workers system.

> Please note that a compatibility daemon which continues to parse the
> simple FIFO will ofcourse have to be implemented so that current scripts
> and whatnot keep on working, and the API to scan for and read check
> result files will also remain for the foreseeable future, although
> possibly implemented as an external helper program which can ship
> check results into the Nagios socket instead.
>

So in fact you plan removing the old FIFO and doing all stuffs through
the socket ? What about acknowledgements or downtimes ? Could they be
sent through the socket too or would there be another system ?

Best regards,

-- 
Matthieu KERMAGORET | Développeur

mkermagoret at merethis.com

MERETHIS est éditeur du logiciel Centreon.

------------------------------------------------------------------------------
What Every C/C++ and Fortran developer Should Know!
Read this article and learn how Intel has extended the reach of its 
next-generation tools to help Windows* and Linux* C/C++ and Fortran 
developers boost performance applications - including clusters. 
http://p.sf.net/sfu/intel-dev2devmay
_______________________________________________
Nagios-devel mailing list
Nagios-devel at lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nagios-devel


More information about the Developers mailing list