Skip to content
Browse files

Development code: per-Thread Hot Cold Graphs

  • Loading branch information...
1 parent 2c8cdcc commit 607b32bdfdece1a7f9995f28912528e7c5f1ce3e Brendan Gregg committed Mar 28, 2013
Showing with 126 additions and 0 deletions.
  1. +5 −0 dev/README
  2. +32 −0 dev/gatherthc-kern.d
  3. +89 −0 dev/thcstackcollapse.pl
View
5 dev/README
@@ -6,3 +6,8 @@ Hot Cold Graphs
These show both on-CPU time (in shades of red) and off-CPU time (blocked time;
in shades of blue) in a similar style to the Flame Graph.
+Thread Hot Cold Graphs
+======================
+These are per-Thread Hot Cold Graphs, which helps separate logical functions
+that are managed by their threads, and helps you estimate speed up for the
+threads of interest.
View
32 dev/gatherthc-kern.d
@@ -0,0 +1,32 @@
+#!/usr/sbin/dtrace -s
+
+#pragma D option stackframes=100
+#pragma D option defaultargs
+
+profile:::profile-999
+/arg0/
+{
+ @[stack(), (uint64_t)curthread, pid, tid, execname, 1] = sum(1000);
+}
+
+sched:::off-cpu
+{
+ self->start = timestamp;
+}
+
+sched:::on-cpu
+/(this->start = self->start)/
+{
+ this->delta = (timestamp - this->start) / 1000;
+ @[stack(), (uint64_t)curthread, pid, tid, execname, 0] = sum(this->delta);
+ self->start = 0;
+}
+
+profile:::tick-60s,
+dtrace:::END
+{
+ normalize(@, 1000);
+ printa("%kthread:%d pid:%d tid:%d name:%s oncpu:%d ms:%@d\n", @);
+ trunc(@);
+ exit(0);
+}
View
89 dev/thcstackcollapse.pl
@@ -0,0 +1,89 @@
+#!/usr/bin/perl -w
+#
+# thcstackcollapse.pl collapse thread hot/cold multiline stacks into
+# single lines.
+#
+# EXPERIMENTAL: This is a work in progress, and may not work properly.
+#
+# Parses a multiline stack followed by thread ID, PID, TID, name, oncpu status,
+# and ms on a separate line (see example below) and outputs a comma separated
+# stack followed by a space and the numbers. If memory addresses (+0xd) are
+# present, they are stripped, and resulting identical stacks are colased with
+# their counts summed.
+#
+# USAGE: ./thcstackcollapse.pl infile > outfile
+#
+# Example input:
+#
+# mysqld`_Z10do_commandP3THD+0xd4
+# mysqld`handle_one_connection+0x1a6
+# libc.so.1`_thrp_setup+0x8d
+# libc.so.1`_lwp_start
+# thread:0x78372480 pid:826 tid:3 name:mysqld oncpu:1 ms:2664
+#
+# Example output:
+#
+# libc.so.1`_lwp_start,libc.so.1`_thrp_setup,mysqld`handle_one_connection,mysqld`_Z10do_commandP3THD 0x78372480 826 3 mysqld 1 2664
+#
+# Input may contain many stacks, and can be generated using DTrace. The
+# first few lines of input are skipped (see $headerlines).
+#
+# Copyright 2013 Joyent, Inc. All rights reserved.
+# Copyright 2013 Brendan Gregg. All rights reserved.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# 14-Aug-2011 Brendan Gregg Created this.
+
+use strict;
+
+my %collapsed;
+my $headerlines = 2;
+
+sub remember_stack {
+ my ($stack, $thread, $pid, $tid, $name, $oncpu, $count) = @_;
+ $collapsed{"$stack $thread $pid $tid $name $oncpu"} += $count;
+}
+
+my $nr = 0;
+my @stack;
+
+foreach (<>) {
+ next if $nr++ < $headerlines;
+ chomp;
+
+ next if (m/^\s*$/);
+
+ if (m/^thread:(\d+) pid:(\d+) tid:(\d+) name:(.*?) oncpu:(\d+) ms:(\d+)$/) {
+ remember_stack(join(",", @stack), $1, $2, $3, $4, $5, $6) if $6 > 0;
+ @stack = ();
+ next;
+ }
+
+ my $frame = $_;
+ $frame =~ s/^\s*//;
+ $frame =~ s/\+.*$//;
+ $frame = "-" if $frame eq "";
+ unshift @stack, $frame;
+}
+
+foreach my $k (sort { $a cmp $b } keys %collapsed) {
+ printf "$k $collapsed{$k}\n";
+}

0 comments on commit 607b32b

Please sign in to comment.
Something went wrong with that request. Please try again.