[OLSR-users] CPU load
Roar Bjørgum Rotvik
(spam-protected)
Thu Jan 20 14:51:21 CET 2005
Thomas Lopatic wrote:
> Hi there,
[...]
> * It would be interesting which parts of olsrd cause the high load. If
> increasing the poll interval makes much of a difference, then it's the
> periodically executed tasks like expelling timed out nodes from the
> internal data structures. If increasing the HELLO intervals of all
> surrounding nodes makes much of a difference, then it's the processing
> of incoming packets.
>
> * I've thought through the linear list thing again. True, there are more
> efficient data structures and I have a gut feeling that we could save a
> few lookups by caching the results of previous lookups. But then again,
> the performance problems start already at fifty nodes, which shouldn't
> be a problem for the existing data structures. (For potentially larger
> sets we use a hash function to distribute the set elements over a number
> of linear lists.)
>
> To sum up, I don't have any idea why we have such a high CPU load. :-)
> So, let's find out. I guess that the easiest change would be to lower
> the debug level on a single node and see what this does to the CPU load
> on this node. The next change could then be to increase the poll
> interval length on the node and see whether this makes any difference.
>
> If this still doesn't make any difference, we should come up with a
> profiling version of olsrd. Has anyone ever used the profiling features
> of GCC? Are they supported by the cross-compiler? I guess that this
> would give us a good idea in which functions olsrd spends most of its
> CPU cycles.
I have profiled some programs before, but not using cross-platform tools.
In short:
* Compile and link the code with GCC option "-pg -g -a" (-g and -a may
be omitted, but they give extra information).
Code not compiled/linked with -pg will not be profiled.
* Run olsrd some time (longer run means more correct numbers) and then
let olsrd exit normally (through return from main() or exit()). I think
"kill <olsrd-pid>" will work.
* After olsrd quits, a profile-file (gmon.out?) is generated in the same
directory as the olsrd binary run from.
* Then use "gprof olsrd" from the same directory to see profiling data.
gprof has lots of options, where -p option for "flat profile" gives a
list over functions called most (%-time, seconds used and number of
times called).
* Then try to optimize the functions that have used most of the time, if
possible, or try to optimize the way the function is used.
* It is possible to link the application agains profile-version of
system libraries like glibc to include system calls like read/write, but
this is not neccessary.
See http://sources.redhat.com/binutils/docs-2.10/gprof.html for easy
user manual for gprof.
Regarding cross-plattform profiling, I think gprof need to be run with
the olsrd binary used to profile and gprof.mon from the profile run and
I don't think that running gprof in i386 on a non-i386 binary olsrd will
work.
I guess you either have to run gprof on the target platform (the
embedded platform), or run the profiling and testing on a standard
computer where you have access to all the compiling and profiling tools
easily (for example include a i386-laptop as a routing node for a while).
--
Roar Bjørgum Rotvik
More information about the Olsr-users
mailing list