Re: Flight recorder mode

Jan Kiszka <[email protected]> Tue, 26 Feb 2008 15:39:30 +0100
Newsgroups gmane.linux.kernel.tracing
Message-ID <[email protected]>
Mathieu Desnoyers wrote:
> * Jan Kiszka ([email protected]) wrote:
>> Mathieu Desnoyers wrote:
>>> Ah, am I dumb... sorry..
>>>
>>> to take a flight recorder trace, making sure everything is read
>>> correctly :
>>>
>>> armall
>>> lttctl -n trace -c -m flight
>>> lttd -n -d -t /tmp/trace -c /sys/kernel/debug/ltt
>>> lttctl -n trace -s
>>> .. do stuff
>>> lttctl -n trace -q
>>> lttd -f -d -t /tmp/trace -c /sys/kernel/debug/ltt
>>> lttctl -m trace -r
>>>
>>> This should work also for hybrid traces if you replace -m flight with -m
>>> hybrid.
>>>
>>> Maybe I should adapt lttctl so we can use it in the same way for hybrid
>>> and flight recorder traces without calling lttd explicitly.
>> What would be even nicer (considering our old, custom setup) is lttd in
>> standby until someone issues a trace stop, via lttctl or directly from
>> some application that detected a trace-worthy event. Then the daemon
>> should dump the flight channels and terminate. A script could catch
>> this, archive the trace, and even restart the whole thing if desired.
>>
>> OK, that may not fit smoothly into the current interface. But what I'm
>> currently looking for as a minimum requirement is a way to detect that
>> the trace was stopped by someone. Then I could live also with the
>> explicit lttd/lttctl invocations. Do I have to extend the netlink
>> interface with some wait-on-event service?
>>
>> Jan
>>
> 
> Sorry for late reply about this one, I was on a small trip in the last
> days.
> 
> Let's see what we can do here. First, one thing I would like to keep in
> mind is that, as a design philosophy, I try to keep the "trace control"
> kernel interface (liblttctl, ltt-control.ko, through netlink) as
> separate as possible from the "data extraction" kernel interface (lttd,
> ltt-relay.ko, through relay). The idea is that we want to allow data
> extraction from ltttd, an lttd network daemon, crash dump to work the
> the same "trace control" interface, without having to specialize it for
> any kind of these data extraction mechanisms.
> 
> Another thing we have to keep in mind is that tracing for a set of
> buffers can be started/stopped/restarted/stopped... multiple times. If a
> lttd daemon is reading the buffers, it will simply read them and wait
> for data when they have no more data to provide, and will stay alive
> until the channels are destroyed.
> 
> That being said, let's try to address your requirements, or first try to
> understand them correctly.
> 
> What I understand is that you would like to :
> do {
> 1- create trace channels, in hybrid mode
> 2- hook a lttd on the channels to gather the "normal" channels.
> 3- start tracing (it will fill the normal channels with state dump
>    information)
> some event occurs...
> 4- stop tracing
> 5- hook a lttd on the channels to gather the "flight recorder" channels.
> 6- destroy trace channels
> } while (continue_tracing);
> 
> What I understand is that you would like to have steps 5, 6 executed
> automatically after step 4.
> 
> I also see that the use case you propose stops the trace from a trigger
> within the kernel (compared to an lttctl invocation), am I right ?

Might become interesting as well one day, but right now it's all about
issuing a stop command (via netlink) from some application.

> 
> So we would have to find a way to execute steps 4, 5, 6 from the kernel.
> My initial thought would be to create a "trigger" kernel module : when
> the ltt_trigger("trace name") function would be called from within the
> kernel, it would set a flag in the trace structure telling a periodical
> timer to perform steps 4, 5, 6 (probably from a kernel thread). The
> reason for using a flag an not directly creating a kernel thread is that
> we would want the trigger to be reentrant from any execution context.
> Step 5 would be optional. We would have to record the lttd path
> somewhere in the ltt-trigger module. This module would have to be
> flexible enough to eventually execute a script, a network lttd or any
> other operation upon trigger.
> 
> Any thoughts ?

Let's focus on the user thingy first: We used to have a script that
looped like that:

while true; do
	start-our-tracer -in-foreground
	tar cjf trace-$date.tar.bz2 trace-dir
done


Now I could imagine something like this:

while true; do
	lttctl -n mytrace -d ...
	lttclt -n mytrace --wait-for-trace-being-stopped
	lttctl -n mytrace -f ...
	tar cjf trace-$date.tar.bz2 trace-dir
done

Means: I would like to block my script until someone else stopped
mytrace, ie. I need some event channel via netlink to track the trace state.

Jan

-- 
Siemens AG, Corporate Technology, CT SE 2
Corporate Competence Center Embedded Linux