[Nagios-devel] Optimize status.cgi

Support forum for Nagios Core, Nagios Plugins, NCPA, NRPE, NSCA, NDOUtils and more. Engage with the community of users including those using the open source solutions.
Locked
Guest

[Nagios-devel] Optimize status.cgi

Post by Guest »

--------------030400080507070307080300
Content-Type: multipart/alternative;
boundary="------------050909090802030607000606"

--------------050909090802030607000606
Content-Type: text/plain; charset="ISO-8859-1"; format=flowed
Content-Transfer-Encoding: 7bit

With nagios 3.2.0 at my site, it took over a minute from when I entered
a host name in the Web UI's "Quick Search:" box and hit Enter, until
when the status details for the host were actually displayed.

The attached patch reduces the time to do exactly the same work to under
five seconds.

It adds the following optimizations to the code base:

1. When iterating through the lines in the status.dat file, use a
persistent buffer to read lines rather than freeing and
reallocating a new buffer for every line. This reduces
fragmentation of the malloc pool and reduces the amount of time
spent in malloc() and free(). This is implemented by adding a new
function, mmap_fgets_buf(), which is like mmap_fgets() except it
takes an optional buffer to reuse if possible. I added this to
both cgiutils.c and utils.c so that it can be used elsewhere in
the code.
2. When parsing the status.dat file, reduce the number of unnecessary
calls to strcmp() by keeping track of when we know we're in a
block and not checking for block-start sequences unnecessarily.
3. Defer the sorting of the comment and scheduled downtime linked
lists until they've all been read from status.dat. This makes a
*/huge/* difference in performance -- it dwarfs by orders of
magnitude the optimizations listed above. The way this is
implemented is invisible to programs aside from status.cgi that
call add_comment() or add_downtime(), but those programs can
easily be modified to take advantage of the new functionality if
they need to be sped up.

I sincerely hope that the maintainers of Nagios will make an effort to
include these changes in the next release. They represent a dramatic
improvement in the performance and usability of the Web UI.

Thanks,

Jonathan Kamens


--------------050909090802030607000606
Content-Type: text/html; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit








With nagios 3.2.0 at my site, it took over a minute from when I entered
a host name in the Web UI's "Quick Search:" box and hit Enter, until
when the status details for the host were actually displayed.

The attached patch reduces the time to do exactly the same work to
under five seconds.

It adds the following optimizations to the code base:

When iterating through the lines in the status.dat file, use a
persistent buffer to read lines rather than freeing and reallocating a
new buffer for every line.  This reduces fragmentation of the malloc
pool and reduces the amount of time spent in malloc() and free().  This
is implemented by adding a new function, mmap_fgets_buf(), which is
like mmap_fgets() except it takes an optional buffer to reuse if
possible.  I added this to both cgiutils.c and utils.c so that it can
be used elsewhere in the code.
When parsing the status.dat file, reduce the number of
unnecessary calls to strcmp() by keeping track of when we know we're in
a block and not checking for block-start sequences unnecessarily.
Defer the sorting of the comment and scheduled downtime linked
lists until they've all been read from status.dat.  This makes a huge
difference in performance -- it dwarfs by orders of magnitude the
optimizations listed above.  The way this is implemented is invisible
to programs aside from status.cgi that call add_comment() or
add_downtime(), but those programs can easily be modified to take
advantage of the new functionality if they need to be sped up.

I sincerely hope that the maintainers of Nagios will make an effort to
include these changes in the next release.  They represent a dramatic
improvement in the

...[email truncated]...


This post was automatically imported from historical nagios-devel mailing list archives
Original poster: [email protected]
Locked