| $Id$ |
| |
| = profiling = |
| |
| == what information is interesting? == |
| * pipeline throughput |
| if we know the cpu-load for a given datastream, we could extrapolate what the |
| system can handle |
| -> qos profiling |
| * load distribution |
| which element causes which cpu load/memory usage |
| |
| |
| = qos profiling = |
| * what data is needed ? |
| * (streamtime,propotion) pairs from sinks |
| draw a graph with gnuplot or similar |
| * number of frames in total |
| * number of audio/video frames dropped from each element that support QOS |
| * could be expressed as percent in relation to total-frames |
| |
| * query data (e.g. via. gst-launch) |
| * add -r, --report option to gst-launch |
| * during playing we capture QOS-events to record 'streamtime,proportion' pairs |
| gst_pad_add_event_probe(video_sink->sink_pad,handler,data) |
| * during playback we like to know when an elemnt drops frames |
| what about elements sending a qos_action message? |
| * after EOS, send qos-queries to each element in the pipeline |
| * qos-query will return: |
| number of frames rendered |
| number of frames dropped |
| * print a nice table with the results |
| * QOS stats first |
| * writes a gnuplot data file |
| * list of 'streamtime,proportion,<drop>' tuples |
| |
| |
| = core profiling = |
| * scheduler keeps a list of usecs the process function of each element was |
| running |
| * process functions are: loop, chain, get, they are driven by gst_pad_push() and |
| gst_pad_pull_range() |
| * scheduler keeps a sum of all times |
| * each gst-element has a profile_percentage field |
| |
| * when going to play |
| * scheduler sets sum and all usecs in the list to 0 |
| * when handling an element |
| * remember old usecs t_old |
| * take time t1 |
| * call elements processing function |
| * take time t2 |
| * t_new=t2-t1 |
| * sum+=(t_new-t_old) |
| * profile_percentage=t_new/sum; |
| * should the percentage be averaged? |
| * profile_percentage=(profile_percentage+(t_new/sum))/2.0; |
| |
| * the profile_percentage shows how much CPU time the element uses in relation |
| to the whole pipeline |
| |
| = rusage + pad-probes = |
| * check get_rusage() based cpu usage detection in buzztard |
| this together with pad_probes could gives us decent application level profiles |
| * different elements |
| * 1:1 elements are easy to handle |
| * 0:1 elements need a start timer |
| * 1:0 elements need a end timer |
| * n:1, 1:m and n:m type elemnts are tricky |
| adapter based elements might have a fluctuating usage in addition |
| |
| // result data |
| struct { |
| beg_min,beg_max; |
| end_min,end_max; |
| } profile_data; |
| |
| // install probes |
| gst_bin_iterate_elements(pipeline) |
| gst_element_iterate_pads(element) |
| if (gst_pad_get_direction(pad)==GST_PAD_SRC) |
| gst_pad_add_buffer_probe(pad,end_timer,profile_data) |
| else |
| gst_pad_add_buffer_probe(pad,beg_timer,profile_data) |
| |
| // listen to bus state-change messages to |
| // * reset counters on NULL_TO_READY |
| // * print results on READY_TO_NULL |
| |
| = PerformanceMonitor = |
| Write a ld-preload lib that can gather data from gstreamer and logs it to files. |
| The idea is not avoid adding API for performance measurement to gstreamer. |
| |
| == Services == |
| library provides some common services used by the sensor modules. |
| * logging |
| * timestamps |
| |
| == Sensors == |
| Sensors do measurements and deliver timestampe performance data. |
| * bitrates and latency via gst_pad_push/pull per link |
| * qos ratio via gst_event_new_qos(), gst_pad_send_event() |
| * cpu/mem via get_rusage |
| * when (gst_clock_get_time) ? |
| * we want it per thread |
| * queue fill levels |
| * number of |
| * threads |
| * open files |
| |
| == Wanted Sensors == |
| * dropped buffers |
| |
| == Log Format == |
| * we have global data, data per {link,element,thread} |
| |
| <timestamp> [<sensor-data>] [<sensor-data>] |
| |
| * sample |
| timestamp [qos-ratio] [cpu-load={sum,17284,17285}] |
| 00126437 [0.5] [0.7,0.2,0.5] |
| 00126437 [0.8] [0.9,0.2,0.7] |
| |
| * questions |
| ** should we have the log config in the header or in some separate config? |
| - if config, we just specify the config when capturing put that |
| in the first log line |
| - otherwise the analyzer ui has to parse it from the first line |
| |
| == Running == |
| LD_PRELOAD=libgstperfmon.so GST_PERFMON_DETAILS="qos-ratio,cpu-load=all" <application> |
| LD_PRELOAD=libgstperfmon.so GST_PERFMON_DETAILS="qos-ratio,cpu-load=sum" <application> |
| LD_PRELOAD=libgstperfmon.so GST_PERFMON_DETAILS="*" <application> |
| |
| == Exploration |
| pygtk ui, mathplotlib |
| |
| == Ideas == |
| * can be used in media test suite as a monitor |
| |