/
usr
/
share
/
systemtap
/
examples
/
memory
/
/usr/share/systemtap/examples/memory
mkdir
upload
Name
Size
Mode
Actions
cachestat.meta
545
0644
edit
dl
rm
cachestat.stp
1318
0755
edit
dl
rm
glibc-malloc.meta
381
0644
edit
dl
rm
glibc-malloc.stp
2486
0755
edit
dl
rm
hugepage_clear_delays.meta
946
0644
edit
dl
rm
hugepage_clear_delays.stp
483
0755
edit
dl
rm
hugepage_collapse.meta
718
0644
edit
dl
rm
hugepage_collapse.stp
159
0755
edit
dl
rm
hugepage_cow_delays.meta
1106
0644
edit
dl
rm
hugepage_cow_delays.stp
475
0755
edit
dl
rm
hugepage_split.meta
756
0644
edit
dl
rm
hugepage_split.stp
153
0755
edit
dl
rm
hw_watch_addr.meta
787
0644
edit
dl
rm
hw_watch_addr.stp
167
0755
edit
dl
rm
hw_watch_addr.tcl
97
0644
edit
dl
rm
hw_watch_sym.meta
715
0644
edit
dl
rm
hw_watch_sym.stp
167
0755
edit
dl
rm
hw_watch_sym.tcl
97
0644
edit
dl
rm
kmalloc-top
3888
0755
edit
dl
rm
kmalloc-top.meta
695
0644
edit
dl
rm
last_100_frees.meta
420
0644
edit
dl
rm
last_100_frees.stp
803
0755
edit
dl
rm
last_100_frees.tcl
79
0644
edit
dl
rm
last_100_frees.txt
774
0644
edit
dl
rm
mmanonpage.meta
1225
0644
edit
dl
rm
mmanonpage.stp
1816
0755
edit
dl
rm
mmfilepage.meta
1033
0644
edit
dl
rm
mmfilepage.stp
3537
0755
edit
dl
rm
mmreclaim.meta
606
0644
edit
dl
rm
mmreclaim.stp
5232
0755
edit
dl
rm
mmwriteback.meta
1114
0644
edit
dl
rm
mmwriteback.stp
1900
0755
edit
dl
rm
numa_faults.meta
702
0644
edit
dl
rm
numa_faults.stp
973
0755
edit
dl
rm
numa_faults.txt
1710
0644
edit
dl
rm
overcommit.meta
584
0644
edit
dl
rm
overcommit.stp
217
0755
edit
dl
rm
pfaults.meta
744
0644
edit
dl
rm
pfaults.stp
875
0755
edit
dl
rm
pfaults.txt
558
0644
edit
dl
rm
vm.tracepoints.meta
608
0644
edit
dl
rm
vm.tracepoints.stp
414
0755
edit
dl
rm
vm.tracepoints.txt
557
0644
edit
dl
rm
Edit:
/usr/share/systemtap/examples/memory/kmalloc-top
(3888B)
#!/usr/bin/perl # # This script accumulates the execution paths of all calls to kmalloc # in the kernel. On Ctrl-C (or exit of the command provided by -c option), # it sorts, filters and displays them on # stdout. # # The -e (exclude) option can be used to specify a comma-separated list # - any stack with contents matching any of the items in the list will # be excluded from the output. # # The -m (min) option can be used to specify the minimum number of # occurrences a stack needs to be included in the output. # # The -t (top) option can be used to specify printing only the # top N stack traces. # # The -c (command) option runs starts the command and script # only runs for the duration of the command. # # The -o (options) option passes the options to systemap. # # Usage: ./kmalloc-top [-m min] [-e exclude list] [-t top_n] [-c command] # [-o options] # Ctrl-c use Getopt::Std; my $kmalloc_stacks; my $total_kmallocs; my $filtered_kmallocs; my $sorted_stacks; my $first_n = 1000000000; my $min_count = 1; my $exclude; my $options; $SIG{INT} = \&sigint_handler; getopts('c:e:m:t:o:'); if ($opt_e) { $exclude = join('|', split(/,/, $opt_e)); print "Will exclude stacks containing: $exclude\n"; } if ($opt_t) { $first_n = $opt_t; print "Will print only the top $first_n stacks.\n"; } if ($opt_m) { $min_count = $opt_m; } if ($opt_c) { $command="-c \"$opt_c\"" } if ($opt_o) { $options=$opt_o } print "Will print stacks with counts >= $min_count.\n"; print STDERR "Press Ctrl-C to stop.\n"; #The systemtap script that instruments the kmalloc $script=" global kmalloc_stack probe kernel.function(\"__kmalloc\") { kmalloc_stack[backtrace()]++ } probe timer.ms(100), end { foreach (stack in kmalloc_stack) { printf(\"<hashkey>\\n\") print_syms(stack) printf(\"</hashkey>\\n\") printf(\"<hashval>%d</hashval>\\n\", kmalloc_stack[stack]) } delete kmalloc_stack } "; open STREAM, "stap $options -e '$script' $command|" or die "Couldn't get output stream $!"; while (<STREAM>) { if (/<hashval>(.*?)<\/hashval>/) { update_hash($key, $1); $key = ""; } elsif ($_ !~ (/<hashkey>|<\/hashkey>/)) { $key .= $_; } } $num_keys_before_filtering = scalar keys %kmalloc_stacks; $total_kmallocs = count_kmallocs(); filter_stacks(); sort_stacks(); top_stacks(); sort_stacks(); $num_keys_after_filtering = scalar keys %kmalloc_stacks; $filtered_kmallocs = count_kmallocs(); summarize(); exit(); sub update_hash { my($key, $val) = @_; $kmalloc_stacks{$key} += $val; } sub filter_stacks { while (($stack, $count) = each %kmalloc_stacks) { if ($count < $min_count) { delete $kmalloc_stacks{$stack}; } elsif ($exclude && $stack =~ /$exclude/) { delete $kmalloc_stacks{$stack}; } } } sub top_stacks { $count=0; foreach $stack(@sorted_stacks) { $count+=1; if ($count > $first_n) { delete $kmalloc_stacks{$stack}; } } } sub sort_stacks { @sorted_stacks = sort { $kmalloc_stacks{$b} <=> $kmalloc_stacks{$a} } keys %kmalloc_stacks; } sub count_kmallocs { $count = 0; foreach $stack(%kmalloc_stacks) { $count += $kmalloc_stacks{$stack}; } return $count; } sub summarize { print "\n"; foreach $stack(@sorted_stacks) { print "This path seen $kmalloc_stacks{$stack} times:\n$stack\n"; } if ($total_kmallocs > 0) { $percent = ($filtered_kmallocs)*100/$total_kmallocs; } else { $percent = 0; } print "Num stacks before filtering: $num_keys_before_filtering\n"; print "Num stacks after filtering: $num_keys_after_filtering\n"; print "Total kmallocs (before filtering): $total_kmallocs\n"; print "Total kmallocs (after filtering): $filtered_kmallocs\n"; print "The filter stacks have $percent of the total kmallocs\n"; close(STREAM); } sub sigint_handler { system("pkill kmalloc-stacks"); }
Save
cmd:
run