Changeset 21d3542
- Timestamp:
- 06/02/15 16:50:48 (9 years ago)
- Branches:
- master
- Children:
- 6444e03
- Parents:
- 192a260
- git-author:
- Hal Finkel <hfinkel@…> (06/02/15 16:50:48)
- git-committer:
- Hal Finkel <hfinkel@…> (06/02/15 16:50:48)
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
memlog.cpp
r22f928f r21d3542 6 6 #include <cstdio> 7 7 #include <cstring> 8 #include <cstdint> 8 9 9 10 // NOTE: This source makes very minimal use of C++11 features. It can still be … … 29 30 #ifdef __bgq__ 30 31 #include <spi/include/kernel/location.h> 32 #include <spi/include/kernel/memory.h> 31 33 #endif 32 34 … … 45 47 static char self_path[PATH_MAX+1] = { '\0' }; 46 48 49 #ifdef __bgq__ 50 int on_bgq = 0; 51 #endif 52 53 void *initial_brk = 0; 54 47 55 __attribute__((__constructor__)) 48 56 static void record_init() { … … 54 62 // If we're really running on a BG/Q compute node, use the job rank instead 55 63 // of the pid because the node name might not really be globally unique. 56 if (!strcmp(u.sysname, "CNK") && !strcmp(u.machine, "BGQ")) 64 if (!strcmp(u.sysname, "CNK") && !strcmp(u.machine, "BGQ")) { 57 65 id = (int) Kernel_GetRank(); 66 on_bgq = 1; 67 } 58 68 #endif 59 69 … … 81 91 const char *link_name = "/proc/self/exe"; 82 92 readlink(link_name, self_path, PATH_MAX); 93 94 initial_brk = sbrk(0); 83 95 } 84 96 … … 128 140 fprintf(log_file, "\t%ld.%06ld %ld %ld", usage.ru_utime.tv_sec, 129 141 usage.ru_utime.tv_usec, usage.ru_maxrss, syscall(SYS_gettid)); 142 143 // Some other memory stats (like with maxrss, report these in KB). 144 size_t arena_size = ((size_t) sbrk(0)) - (size_t) initial_brk; 145 146 uint64_t mmap_size = 0; 147 #ifdef __bgq__ 148 if (on_bgq) 149 (void) Kernel_GetMemorySize(KERNEL_MEMSIZE_MMAP, &mmap_size); 150 #endif 151 152 fprintf(log_file, " %ld %ld", arena_size >> 10, mmap_size >> 10); 130 153 131 154 if (!show_backtrace) -
memlog_analyze
rc83befc r21d3542 64 64 my $state = shift(@parts); 65 65 66 my ($time, $then_max_rss, $tid) = split(/\s+/, $state); 66 my ($time, $then_max_rss, $tid, $then_arena, $then_mmap) = 67 split(/\s+/, $state); 67 68 if ($pot_max_rss < $then_max_rss) { 68 69 $pot_max_rss = $then_max_rss; … … 94 95 # The first step is to determine the high-water mark. 95 96 my $max_rss = 0; 97 my $arena = 0; 98 my $mmap = 0; 96 99 foreach my $line (<MEMLOG>) { 97 100 chomp($line); … … 101 104 my $state = shift(@parts); 102 105 103 my ($time, $then_max_rss, $tid) = split(/\s+/, $state); 106 my ($time, $then_max_rss, $tid, $then_arena, $then_mmap) = 107 split(/\s+/, $state); 104 108 if ($max_rss < $then_max_rss) { 105 109 $max_rss = $then_max_rss; 110 $arena = $then_arena; 111 $mmap = $then_mmap; 106 112 } 107 113 } … … 131 137 } 132 138 133 my ($time, $then_max_rss, $tid) = split(/\s+/, $state); 139 my ($time, $then_max_rss, $tid, $then_arena, $then_mmap) = 140 split(/\s+/, $state); 134 141 $active_alloc_time = $time; 135 142 … … 146 153 # Convert maxrss, currently in KB, to bytes. 147 154 $max_rss *= 1024; 155 if (defined $arena) { 156 $arena *= 1024; 157 } 158 if (defined $mmap) { 159 $mmap *= 1024; 160 } 148 161 149 162 my $total_size = 0; … … 162 175 163 176 my ($size, $ptr) = ($op =~ /^M: (\d+) 0x(\w+)/); 164 my ($time, $then_max_rss, $tid) = split(/\s+/, $state); 177 my ($time, $then_max_rss, $tid, $then_arena, $then_mmap) = 178 split(/\s+/, $state); 165 179 166 180 $total_size += $size; … … 249 263 } 250 264 265 sub format_bytes_or_unk($) { 266 my $b = $_[0]; 267 return defined($b) ? format_bytes($b) : "(unknown)"; 268 } 269 251 270 print DOT ("digraph \"memlog\" {\n"); 252 271 print DOT ("size=\"8,11\";\n"); … … 254 273 255 274 my $find_type = $find_leaks ? " (leaks)" : ""; 256 printf DOT ("Legend [shape=box, fontsize=100, shape=oval," . 257 "label=\"Total: %s active$find_type at maxrss = %s after %s s\"];\n", 275 print DOT "subgraph cluster_key {\n"; 276 print DOT "\trank=min;\n"; 277 print DOT "\tlabel=\"memlog\";\n"; 278 print DOT "\tfontsize=100;\n"; 279 print DOT "\trankdir=UR;\n"; 280 printf DOT ("Legend [shape=box, fontsize=100, shape=plaintext," . 281 "label=\"Total: %s active$find_type at maxrss = %s after %s s\\narena: %s\\nmmap: %s\"];\n", 258 282 format_bytes($total_size), format_bytes($max_rss), 259 $active_alloc_time); 260 261 printf TXT ("memlog: Total: %s active$find_type at maxrss = %s after %s s\n\n", 283 $active_alloc_time, format_bytes_or_unk($arena), 284 format_bytes_or_unk($mmap)); 285 print DOT "}\n"; 286 287 printf TXT ("memlog: Total: %s active$find_type at maxrss = %s after %s s\n\tarena: %s\tmmap: %s\n\n", 262 288 format_bytes($total_size), format_bytes($max_rss), 263 $active_alloc_time); 289 $active_alloc_time, format_bytes_or_unk($arena), 290 format_bytes_or_unk($mmap)); 264 291 265 292 my %cached_names;
Note: See TracChangeset
for help on using the changeset viewer.