[PATCH] ldv/unwind: enable cache feature of libunwind

Masatake YAMATO yamato at redhat.com
Tue Nov 12 09:27:44 UTC 2013


With turning on cache feature of libunwind, stack tracing
becomes two times faster(in my small test).

Target program:

    #include <unistd.h>
    #include <sys/types.h>

    #define N 0xfff

    int
    main(void)
    {
      uid_t uid;
      int i;

      for (i = 0; i < N; i++)
	getuid();

      return 0;
    }

With enabling cache of libunwind:

    % /usr/bin/time ./strace -o /dev/null -e'getuid' -k ./a.out
    0.61user 1.33system 0:01.97elapsed 98%CPU (0avgtext+0avgdata 1376maxresident)k
    0inputs+0outputs (0major+590269minor)pagefaults 0swaps

Without enabling cache of libunwind:

    % /usr/bin/time ./strace -o /dev/null -e'getuid' -k ./a.out
    0.80user 2.61system 0:03.46elapsed 98%CPU (0avgtext+0avgdata 1372maxresident)k
    0inputs+0outputs (0major+639381minor)pagefaults 0swaps

Signed-off-by: Masatake YAMATO <yamato at redhat.com>
---
 unwind.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/unwind.c b/unwind.c
index 4cb6325..ed2d141 100644
--- a/unwind.c
+++ b/unwind.c
@@ -80,6 +80,7 @@ init_unwind_addr_space(void)
 	libunwind_as = unw_create_addr_space(&_UPT_accessors, 0);
 	if (!libunwind_as)
 		error_msg_and_die("failed to create address space for stack tracing");
+	unw_set_caching_policy(libunwind_as, UNW_CACHE_GLOBAL);
 }
 
 static void
@@ -135,6 +136,8 @@ build_mmap_cache(struct tcb *tcp)
 	struct mmap_cache_t *cache_head;
 	FILE *fp;
 
+	unw_flush_cache (libunwind_as, 0, 0);
+
 	sprintf(filename, "/proc/%d/maps", tcp->pid);
 	fp = fopen(filename, "r");
 	if (!fp) {
-- 
1.8.3.1





More information about the Strace-devel mailing list