[Oisf-users] Suricata pegs a detect thread and drops packets
Duarte Silva
duarte.silva at serializing.me
Mon Jun 23 14:32:14 UTC 2014
On Monday 23 June 2014 09:08:45 David Vasil wrote:
> Here is the result after removing all of the -O2's from the libhtp makefile
> and waiting for a detect thread to hit 100%.
>
> http://pastebin.com/aHp415HV
Hi Dave,
the print doesn't say much other than the memory address of the variable :P
Instead, could you do a:
(gdb) print *l
It should print all of the members of the htp_list_array_t structure. If not,
do this:
(gdb) print l->max_size
(gdb) print l->current_size
Cheers,
Duarte
>
> Also, setting transparent hugepages to always did not seem to prevent this
> from occurring.
>
> -dave
>
>
> On Fri, Jun 20, 2014 at 10:36 PM, Anoop Saldanha <anoopsaldanha at gmail.com>
>
> wrote:
> > Dave,
> >
> > Nice! You did manage to catch that thread inside the get() function.
> > From the perf-top it indicates that it's the same issue, although it
> > would be nice if I could look at the contents of the variable "l"
> > inside that get() function. Unfortunately from your gdb output it
> > looks like you forgot to compile libhtp without(i typed it wrongly as
> > "with" in my previous mail, instead of "without", although I did
> > specify -g3 later on) optimization.
> >
> > Can you get the output of "print l" inside the get() function, but
> > without optimization enabled in the libhtp library.
> >
> > You will have to rebuild libhtp without optimization. Go to your
> > libhtp build directory. Run the "configure" command like you have
> > before. Before you type "make", search for "Makefile" in the libhtp
> > root/base directory and the "htp" subdirectory, and replace "-g -O2"
> > with just "-g". Now run the make command. Confirm during the build
> > stage on the console that you don't have "-g -o2" with any of the gcc
> > commands and instead have just "-g".
> >
> > You can then do a "make install", OR manually copy the .so files
> > directory from "htp/.libs/" directory, to replace the libhtp libraries
> > that you are linking with suricata.
> >
> > If you still can't see the symbols inside libhtp's functions when you
> > run suricata, your suricata binary is pointing to the wrong/old libhtp
> > library.
> >
> >
> > On Sat, Jun 21, 2014 at 12:42 AM, David Vasil <davidvasil at gmail.com>
> >
> > wrote:
> > > I was able to do this after Detect5 hit 100% and stayed there. I
> >
> > reverted
> >
> > > back to my originally compiled suricata 2.0.1 deb package (without
> > > --enable-debug) as that flag created a ton of overhead - as you
> >
> > mentioned,
> >
> > > probably due to not being compiled with optimization - and it also ended
> >
> > up
> >
> > > core dumping several times. I copied the unstripped libhtp lib and
> >
> > suricata
> >
> > > binary (again, without --enable-debug) to the appropriate destinations
> >
> > and
> >
> > > was able to see the debugging symbols as expected. Attached is a 'perf
> >
> > top'
> >
> > > drilling into the annotated code within htp_list_array_get showing where
> >
> > the
> >
> > > time is being spent (I assume). 9d99, not in the screenshot, shows the
> > >
> > > following:
> > > 0.08 : 9d99: repz retq
> > >
> > > : free(l->elements);
> > > : free(l);
> > > :
> > > : }
> > >
> > > GDB from this is thread here: http://pastebin.com/3tfjTsL0
> > >
> > > Thanks!
> > > -dave
> > >
> > >
> > > On Fri, Jun 20, 2014 at 9:41 AM, Anoop Saldanha <anoopsaldanha at gmail.com
> > >
> > > wrote:
> > >> I don't think --enable-debug compiles it with optimization. Instead
> > >> compile it without optimization, i.e. either -g -O0 or -g -03. Copy
> > >> the new binaries over, like you previously did. You will also have to
> > >> compile libhtp the same way. You can either specify this in the
> > >> environment variable with configure or manually edit the configure
> > >> script and the makefiles, replacing all "-g -o2" with just "-g".
> > >>
> > >> 1. You can start suricata, and wait for one of the detect threads to
> > >> hit the 100% cpu utilization mark(make a note of the detect
> > >> threadname).
> > >> 2. One you see that, attach gdb to the running process, and print the
> > >> threads using "info threads". If you see the offending thread stuck
> > >> in the libhtp get() function call, switch over to that thread using "t
> > >> <thread_number>" and do a "print l". The symbol "l" is inside the
> > >> libhtp get() function call. Unless you have the detect thread inside
> > >> the libhtp get() function scope that we are trying to trace, you won't
> > >> have the symbol available for printing.
> > >> 3. If when you do a "info threads", you don't see any of the threads
> > >> currently inside htp get() function(gone out of scope at that instance
> > >> of time t), continue the process in gdb, and keep a tab on the threads
> > >> with top/htop, till you see the detect thread(s) again hit the 100%
> > >> cpu mark, post which you can interrupt the process inside gdb again
> > >> and hopefully find the detect thread still inside the libhtp get()
> > >> function context.
> > >>
> > >> With the issue at hand, once the thread gets pegged, you should be
> > >> able to zero-in on the thread pretty quickly. In case you can't, I'll
> > >> provide a debug patch to corner the issue.
> >
> > --
> > -------------------------------
> > Anoop Saldanha
> > http://www.poona.me
> > -------------------------------
More information about the Oisf-users
mailing list