From 9233ee67446fafd0d1ffd02cf3e0dc7b7aa59137 Mon Sep 17 00:00:00 2001 From: Geunsik Lim Date: Wed, 21 Nov 2018 13:51:40 +0900 Subject: [PATCH] Tools/gst-instruments: Added how to profile a bottleneck among elements Fixed issue #132 (Epic: Performance- Profiling) This commit is to append how to use a gst-instruments tool in order to do a profiling for performance optimization of NNStreamer. This guide is experimented on Ubuntu 16.04 x86_64 distribution. **Changes proposed in this PR:** 1. Added gst-top to display a performance report in real time such as top, perf-top 2. Added gst-report-1.0 to generate the trace file the below two goals as following: a. It display CPU usage, time usage, and execution time amon the elements. b. It generate a performance graph from a GStreamer pipeline. 3. Added screenshot of gst-top, gst-report, and generating pipeline graph Signed-off-by: Geunsik Lim --- tools/profiling/README.md | 98 ++++++++++++++++++++++++++----- tools/profiling/gst-instruments-perf.png | Bin 0 -> 31723 bytes 2 files changed, 83 insertions(+), 15 deletions(-) create mode 100644 tools/profiling/gst-instruments-perf.png diff --git a/tools/profiling/README.md b/tools/profiling/README.md index 2332102..949eb73 100644 --- a/tools/profiling/README.md +++ b/tools/profiling/README.md @@ -1,29 +1,97 @@ ## Profiling -### Using $GST_DEBUG_DUMP_TRACE_DIR -The gst-instruments tool is an easy-to-use profiler for GStreamer. -* https://github.com/kirushyk/gst-instruments.git -* gst-instruments displays the trace file. -* gst-top is inspired by top and perf-top, this utility displays performance report for the particular command, analyzing GStreamer ABI calls. +### gst-instruments +The [gst-instruments](https://github.com/kirushyk/gst-instruments) tool is an easy-to-use profiler for GStreamer. +This guide is experimented on Ubuntu 16.04 x86_64 distribution. +* gst-top displays performance report in real time such as top and perf-top utility. +* gst-report-1.0 generates the trace file the below two goals as following: + * It display CPU usage, time usage, and execution time amon the elements. We can easily profile who spends CPU resource mostly. + * It generate a performance graph from a GStreamer pipeline. The graph shows a transfer size as well as CPU usage, time usage, and execution time. #### Prerequisite +```bash +$ sudo apt install autoreconf pkg-config automake libtool +``` -- autoreconf -- pkg-config -- automake -- libtool -- gst-instruments - +#### How to build source code ```bash $ git clone https://github.com/kirushyk/gst-instruments.git $ cd gst-instruments -$ ./autogen.sh -$ make -$ sudo make install +$ git checkout -v 0.2.3 0.2.3 +$ vi ./autogen.sh +--------------- patch: start ---------------------------------- +@@ -19,7 +19,7 @@ which "aclocal" 2>/dev/null || { + } + + echo "Checking for libtool..." +-which "libtool" 2>/dev/null || { ++which "libtoolize" 2>/dev/null || { + echo "Please install libtool." + exit 1 + } +--------------- patch: end ---------------------------------- +$ ./autodgen.sh +$ ./configure +$ make -j`nproc` +$ sudo make install +$ ls /usr/local/lib/libgstintercept.* -al +-rw-r--r-- 1 root root 232492 Nov 21 11:49 /usr/local/lib/libgstintercept.a +-rwxr-xr-x 1 root root 1039 Nov 21 11:49 /usr/local/lib/libgstintercept.la +lrwxrwxrwx 1 root root 24 Nov 21 11:49 /usr/local/lib/libgstintercept.so -> libgstintercept.so.0.0.0 +lrwxrwxrwx 1 root root 24 Nov 21 11:49 /usr/local/lib/libgstintercept.so.0 -> libgstintercept.so.0.0.0 +-rwxr-xr-x 1 root root 121312 Nov 21 11:49 /usr/local/lib/libgstintercept.so.0.0.0 +``` + +#### gst-top +```bash +$ gst-top-1.0 gst-launch-1.0 audiotestsrc num-buffers=1000 ! vorbisenc ! vorbisdec ! fakesink +Setting pipeline to PAUSED ... +Pipeline is PREROLLING ... +Redistribute latency... +Pipeline is PREROLLED ... +Setting pipeline to PLAYING ... +New clock: GstSystemClock +Got EOS from element "pipeline0". +Execution ended after 0:00:00.301137359 +Setting pipeline to PAUSED ... +Setting pipeline to READY ... +Setting pipeline to NULL ... +Freeing pipeline ... +ELEMENT %CPU %TIME TIME +vorbisenc0 60.1 86.9 204 ms +vorbisdec0 8.0 11.6 27.3 ms +fakesink0 1.0 1.5 3.48 ms +audiotestsrc0 0.0 0.0 0 ns +pipeline0 0.0 0.0 0 ns +``` + +#### gst-report + +##### How to display a performanc report with a trace file +```bash +$ LD_PRELOAD=/usr/local/lib/libgstintercept.so \ + GST_DEBUG_DUMP_TRACE_DIR=. \ + gst-launch-1.0 audiotestsrc num-buffers=1000 ! vorbisenc ! vorbisdec ! fakesink +$ ls -al *.gsttrace +$ gst-report-1.0 pipeline0.gsttrace +ELEMENT %CPU %TIME TIME +vorbisenc0 59.8 86.6 200 ms +vorbisdec0 8.2 11.9 27.5 ms +fakesink0 1.1 1.5 3.58 ms +pipeline0 0.0 0.0 0 ns +audiotestsrc0 0.0 0.0 0 ns ``` -#### How to run +##### How to generate an instrumentation graph +```bash +$ gst-report-1.0 --dot pipeline0.gsttrace | dot -Tpng > perf.png +$ eog ./perf.png +``` + + + +#### Case study: Unit test in NNStreamer ```bash nnstreamer/test$ ./testAll.sh 1 diff --git a/tools/profiling/gst-instruments-perf.png b/tools/profiling/gst-instruments-perf.png new file mode 100644 index 0000000000000000000000000000000000000000..dc294b80906848e538d7349db4183055ccaa6e4e GIT binary patch literal 31723 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 NP{%J-KMnK>`48y6LP7ul literal 0 HcmV?d00001 -- 2.7.4