[PATCH 2/3] Print the hit rate of socket address cache with -C option

Masatake YAMATO yamato at redhat.com
Thu Mar 19 16:17:29 UTC 2015


This patch extends -C option to print the hit rate of socket address cache.
It is printed only if both -C and -yy options are given.

Example output:

	$ time ./strace -yy -C -o /tmp/LOG ./a.out; tail -5 /tmp/LOG
	  0.07    0.000004           4         1           brk
	  0.05    0.000003           3         1           arch_prctl
	------ ----------- ----------- --------- --------- ----------------
	100.00    0.006060                  5231         1 total
	socket info cache hit: 10100/10153

Changes:
* socketutils.c (scache_hit_count, scache_mishit_count): New variables.
  (sockaddr_cache_summary): New function.
  (print_sockaddr_in_cache): Count the hits and mishit.

* strace.c (cleanup): Print the hit rate of socket address cache if
  -C option is given.

* defs.h (sockaddr_cache_summary): New declaration.

Signed-off-by: Masatake YAMATO <yamato at redhat.com>
---
 defs.h        |  1 +
 socketutils.c | 15 ++++++++++++++-
 strace.c      |  5 ++++-
 3 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/defs.h b/defs.h
index 5915da1..91ac41a 100644
--- a/defs.h
+++ b/defs.h
@@ -492,6 +492,7 @@ extern void printsiginfo(const siginfo_t *, int);
 extern void printsiginfo_at(struct tcb *tcp, long addr);
 extern void printfd(struct tcb *, int);
 extern bool print_sockaddr_in_cache(const unsigned long);
+extern void sockaddr_cache_summary(FILE *);
 extern bool print_sockaddr_by_inode(const unsigned long, const char *);
 extern void print_dirfd(struct tcb *, int);
 extern void printsock(struct tcb *, long, int);
diff --git a/socketutils.c b/socketutils.c
index 1c7c69d..7d8df75 100644
--- a/socketutils.c
+++ b/socketutils.c
@@ -481,14 +481,27 @@ unix_print(int fd, const unsigned long inode)
 		&& receive_responses(fd, inode, "UNIX", unix_parse_response);
 }
 
+static unsigned long scache_hit_count;
+static unsigned long scache_mishit_count;
+
+void
+sockaddr_cache_summary(FILE * outf)
+{
+	fprintf(outf, "socket info cache hit: %lu/%lu\n",
+		scache_hit_count, scache_hit_count + scache_mishit_count);
+}
+
 bool
 print_sockaddr_in_cache(const unsigned long inode)
 {
 	struct scache_entry *r;
 
 	r = scache_entries_find(inode);
-	if (r)
+	if (r) {
 		scache_entry_print(r);
+		scache_hit_count++;
+	} else
+		scache_mishit_count++;
 
 	return r? true: false;
 }
diff --git a/strace.c b/strace.c
index b714255..3304cdb 100644
--- a/strace.c
+++ b/strace.c
@@ -1807,8 +1807,11 @@ cleanup(void)
 		}
 		detach(tcp);
 	}
-	if (cflag)
+	if (cflag) {
 		call_summary(shared_log);
+		if (show_fd_path)
+			sockaddr_cache_summary(shared_log);
+	}
 }
 
 static void
-- 
2.1.0





More information about the Strace-devel mailing list