perf script: Add drop monitor script
A while back I created the dropmonitor protocol, which allowed users to get reports of dropped frames communicated to them via a netlink socket. While useful, several people have now asked that I integrate the ability to do drop monitoring with perf, so they don't have to run additional tools. This patch adds a drop monitor script to the perf suite, and provides the same output that the netlink socket does. Cc: Ingo Molnar <mingo@elte.hu> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1309801217-22450-1-git-send-email-nhorman@tuxdriver.com Signed-off-by: Neil Horman <nhorman@tuxdriver.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
		
					parent
					
						
							
								98dfd55d80
							
						
					
				
			
			
				commit
				
					
						63e03724b5
					
				
			
		
					 3 changed files with 78 additions and 0 deletions
				
			
		
							
								
								
									
										2
									
								
								tools/perf/scripts/python/bin/net_dropmonitor-record
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										2
									
								
								tools/perf/scripts/python/bin/net_dropmonitor-record
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,2 @@ | |||
| #!/bin/bash | ||||
| perf record -e skb:kfree_skb $@ | ||||
							
								
								
									
										4
									
								
								tools/perf/scripts/python/bin/net_dropmonitor-report
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										4
									
								
								tools/perf/scripts/python/bin/net_dropmonitor-report
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,4 @@ | |||
| #!/bin/bash | ||||
| # description: display a table of dropped frames | ||||
| 
 | ||||
| perf script -s "$PERF_EXEC_PATH"/scripts/python/net_dropmonitor.py $@ | ||||
							
								
								
									
										72
									
								
								tools/perf/scripts/python/net_dropmonitor.py
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										72
									
								
								tools/perf/scripts/python/net_dropmonitor.py
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,72 @@ | |||
| # Monitor the system for dropped packets and proudce a report of drop locations and counts | ||||
| 
 | ||||
| import os | ||||
| import sys | ||||
| 
 | ||||
| sys.path.append(os.environ['PERF_EXEC_PATH'] + \ | ||||
| 		'/scripts/python/Perf-Trace-Util/lib/Perf/Trace') | ||||
| 
 | ||||
| from perf_trace_context import * | ||||
| from Core import * | ||||
| from Util import * | ||||
| 
 | ||||
| drop_log = {} | ||||
| kallsyms = [] | ||||
| 
 | ||||
| def get_kallsyms_table(): | ||||
| 	global kallsyms | ||||
| 	try: | ||||
| 		f = open("/proc/kallsyms", "r") | ||||
| 		linecount = 0 | ||||
| 		for line in f: | ||||
| 			linecount = linecount+1 | ||||
| 		f.seek(0) | ||||
| 	except: | ||||
| 		return | ||||
| 
 | ||||
| 
 | ||||
| 	j = 0 | ||||
| 	for line in f: | ||||
| 		loc = int(line.split()[0], 16) | ||||
| 		name = line.split()[2] | ||||
| 		j = j +1 | ||||
| 		if ((j % 100) == 0): | ||||
| 			print "\r" + str(j) + "/" + str(linecount), | ||||
| 		kallsyms.append({ 'loc': loc, 'name' : name}) | ||||
| 
 | ||||
| 	print "\r" + str(j) + "/" + str(linecount) | ||||
| 	kallsyms.sort() | ||||
| 	return | ||||
| 
 | ||||
| def get_sym(sloc): | ||||
| 	loc = int(sloc) | ||||
| 	for i in kallsyms: | ||||
| 		if (i['loc'] >= loc): | ||||
| 			return (i['name'], i['loc']-loc) | ||||
| 	return (None, 0) | ||||
| 
 | ||||
| def print_drop_table(): | ||||
| 	print "%25s %25s %25s" % ("LOCATION", "OFFSET", "COUNT") | ||||
| 	for i in drop_log.keys(): | ||||
| 		(sym, off) = get_sym(i) | ||||
| 		if sym == None: | ||||
| 			sym = i | ||||
| 		print "%25s %25s %25s" % (sym, off, drop_log[i]) | ||||
| 
 | ||||
| 
 | ||||
| def trace_begin(): | ||||
| 	print "Starting trace (Ctrl-C to dump results)" | ||||
| 
 | ||||
| def trace_end(): | ||||
| 	print "Gathering kallsyms data" | ||||
| 	get_kallsyms_table() | ||||
| 	print_drop_table() | ||||
| 
 | ||||
| # called from perf, when it finds a correspoinding event | ||||
| def skb__kfree_skb(name, context, cpu, sec, nsec, pid, comm, | ||||
| 			skbaddr, protocol, location): | ||||
| 	slocation = str(location) | ||||
| 	try: | ||||
| 		drop_log[slocation] = drop_log[slocation] + 1 | ||||
| 	except: | ||||
| 		drop_log[slocation] = 1 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Neil Horman
				Neil Horman