aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/gc_summary.awk68
-rw-r--r--scripts/gc_summary.py94
2 files changed, 162 insertions, 0 deletions
diff --git a/scripts/gc_summary.awk b/scripts/gc_summary.awk
new file mode 100644
index 00000000..1a1779a3
--- /dev/null
+++ b/scripts/gc_summary.awk
@@ -0,0 +1,68 @@
+#!/usr/bin/awk -f
+
+# $Id$
+#
+# Copyright (C) 2010 Internet Systems Consortium ("ISC")
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+# PERFORMANCE OF THIS SOFTWARE.
+
+# Use gnuplot to graph interesting data from gc_summary lines in rpkid logs.
+
+BEGIN {
+ target = ENVIRON["TARGET"] ? ENVIRON["TARGET"] : "tuple";
+ outtype = ENVIRON["OUTTYPE"] ? ENVIRON["OUTTYPE"] : "png";
+ outname = ENVIRON["OUTNAME"] ? ENVIRON["OUTNAME"] : "";
+ print "set xdata time";
+ print "set timefmt '%Y-%m-%dT%H:%M:%S'";
+ #print "set format x '%d%b'";
+ print "set format x '%T'";
+ if (outname) {
+ print "set terminal", outtype;
+ print "set output '" outname "." outtype "'";
+ print "set term png size 1024,1024";
+ }
+ if (ARGC <= 2) {
+ print "plot '-' using 1:2 with linespoints title 'rpkid use of", target, "objects'";
+ } else {
+ cmd = "plot '-' using 1:2 with linespoints title '" ARGV[1] "'";
+ for (i = 2; i < ARGC; i++)
+ cmd = cmd ", '-' using 1:2 with linespoints title '" ARGV[i] "'";
+ print cmd;
+ }
+}
+
+FILENAME != filename && filename {
+ print "e";
+}
+
+FILENAME != filename {
+ filename = FILENAME;
+}
+
+$6 == target && proc != $3 && proc {
+ print "";
+}
+
+$6 == target && proc != $3 {
+ proc = $3;
+}
+
+$6 == target {
+ print $1 "T" $2, $5;
+}
+
+END {
+ print "e";
+ if (!outname)
+ print "pause mouse any";
+}
diff --git a/scripts/gc_summary.py b/scripts/gc_summary.py
new file mode 100644
index 00000000..694f040f
--- /dev/null
+++ b/scripts/gc_summary.py
@@ -0,0 +1,94 @@
+# $Id$
+#
+# Copyright (C) 2010 Internet Systems Consortium ("ISC")
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+# PERFORMANCE OF THIS SOFTWARE.
+
+# Use gnuplot to graph interesting data from gc_summary lines in rpkid logs.
+
+import sys, os
+
+class datapoint(object):
+
+ outtype = os.getenv("OUTTYPE", "png")
+ outname = os.getenv("OUTNAME", "")
+ timefmt = os.getenv("TIMEFMT", "%T")
+
+ raw = []
+ filenames = []
+
+ def __init__(self, filename, timestamp, process, count, typesig):
+ self.filename = filename
+ self.timestamp = timestamp
+ self.process = process
+ self.count = count
+ self.typesig = typesig
+ self.key = "%s %s" % (filename, typesig)
+ self.raw.append(self)
+ if filename not in self.filenames:
+ self.filenames.append(filename)
+
+ def __cmp__(self, other):
+ c = cmp(self.key, other.key)
+ return c if c else cmp(self.timestamp, other.timestamp)
+
+ @classmethod
+ def plot(cls):
+
+ changed = {}
+ for i in cls.raw:
+ if i.key not in changed:
+ changed[i.key] = set()
+ changed[i.key].add(i.count)
+ changed = set(k for k, v in changed.iteritems() if len(v) > 10)
+
+ print "set xdata time"
+ print "set timefmt '%Y-%m-%dT%H:%M:%S'"
+ print "set format x '%s'" % cls.timefmt
+ if cls.outname:
+ print "set terminal", cls.outtype
+ print "set output '%s.%s'" % (cls.outname, cls.outtype)
+ print "set term png size 1024,1024"
+ print "plot", ", ".join("'-' using 1:2 with linespoints title '%s'" % i for i in changed)
+
+ cls.raw.sort()
+
+ key = None
+ proc = None
+ for i in cls.raw:
+ if i.key not in changed:
+ continue
+ if key is not None and i.key != key:
+ print "e"
+ elif proc is not None and i.process != proc:
+ print ""
+ key = i.key
+ proc = i.process
+ print "#", i.key
+ print i.timestamp, i.count
+ print "e"
+ if not cls.outname:
+ print "pause mouse any"
+
+
+for filename in sys.argv[1:]:
+ for line in open(filename):
+ line = line.split()
+ if line[3] == "gc_summary:" and line[4].isdigit() and line[5].startswith("(") and line[-1].endswith(")"):
+ datapoint(filename = filename,
+ timestamp = line[0] + "T" + line[1],
+ process = line[2],
+ count = line[4],
+ typesig = " ".join(line[5:]))
+
+datapoint.plot()