debugging frequent kernel panics on 8.2-RELEASE
killing at multiplay.co.uk
Wed Aug 17 23:26:40 UTC 2011
----- Original Message -----
From: "Andriy Gapon" <avg at FreeBSD.org>
> Thanks to the debug that Steven provided and to the help that I received from
> Kostik, I think that now I understand the basic mechanics of this panic, but,
> unfortunately, not the details of its root cause.
> It seems like everything starts with some kind of a race between terminating
> processes in a jail and termination of the jail itself. This is where the
> details are very thin so far. What we see is that a process (http) is in
> exit(2) syscall, in exit1() function actually, and past the place where P_WEXIT
> flag is set and even past the place where p_limit is freed and reset to NULL.
> At that place the thread calls prison_proc_free(), which calls prison_deref().
> Then, we see that in prison_deref() the thread gets a page fault because of what
> seems like a NULL pointer dereference. That's just the start of the problem and
> its root cause.
Thats interesting, are you using http as an example or is that something thats
been gleaned from the debugging of our output? I ask as there's only one process
running in each of our jails and thats a single java process.
Now given your description there may be something I can add that may help
clarify what the cause could be.
In a nutshell the jail manager we're using will attempt to resurrect the jail
from a dieing state in a few specific scenarios.
Here's an exmaple:-
1. jail restart requested
2. jail is stopped, so the java processes is killed off, but active tcp sessions
may prevent the timely full shutdown of the jail.
3. if an existing jail is detected, i.e. a dieing jail from #2, instead of
starting a new jail we attach to the old one and exec the new java process.
4. if an existing jail isnt detected, i.e. where there where not hanging tcp
sessions and #2 cleanly shutdown the jail, a new jail is created, attached to
and the java exec'ed.
The system uses static jailid's so its possible to determine if an existing
jail for this "service" exists or not. This prevents duplicate services as
well as making services easy to identify by their jailid.
So what we could be seeing is a race between the jail shutdown and the attach
of the new process?
Now man 2 jail seems to indicate this is a valid use case for jail_set, as
it documents its support for JAIL_DYING as a valid option for flags, but I
suspect its something quite out of the ordinary to actually do, which may be
why this panic hasnt been seen before now.
As some background the reason we use static jailid's is to ensure only one
instance of the jailed service is running, and the reason we re-attach to
the dieing jail is so that jails can be restarted in a timely manor. Without
using the re-attach we would need to wait of all tcp sessions which have
been aborted to timeout.
> So, of course, Steven is interested in finding and fixing the root cause. I
> hope we will get to that with some help from the "prison guards" :-)
Does the above potentially explain how we're getting to the situation
which generates the panic?
If so we can certainly look at using alternatives to the current design to
workaround this issue. Flagging the jail as permanent and using manual process
management and additional external locking to prevent duplicates, is what
instantly springs to mind.
This e.mail is private and confidential between Multiplay (UK) Ltd. and the person or entity to whom it is addressed. In the event of misdirection, the recipient is prohibited from using, copying, printing or otherwise disseminating it or any information contained in it.
In the event of misdirection, illegible or incomplete transmission please telephone +44 845 868 1337
or return the E.mail to postmaster at multiplay.co.uk.
More information about the freebsd-jail