]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - cddl/contrib/dtracetoolkit/Proc/sampleproc
Copy head (r256279) to stable/10 as part of the 10.0-RELEASE cycle.
[FreeBSD/stable/10.git] / cddl / contrib / dtracetoolkit / Proc / sampleproc
1 #!/usr/bin/ksh
2 #
3 # sampleproc - sample processes on the CPUs.
4 #              Written using DTrace (Solaris 10 3/05).
5 #
6 # This program samples which process is on each CPU, at a particular
7 # configurable rate. This can be used as an estimate for which process
8 # is consuming the most CPU time.
9 #
10 # $Id: sampleproc 8 2007-08-06 05:55:26Z brendan $
11
12 # USAGE:        sampleproc [hertz]      # hit Ctrl-C to end sample
13 #
14 # FIELDS:
15 #               PID        Process ID
16 #               COMMAND    Command name
17 #               COUNT      Number of samples
18 #               PERCENT    Percent of CPU usage
19 #
20 # BASED ON: /usr/demo/dtrace/prof.d
21 #
22 # SEE ALSO:
23 #           DTrace Guide "profile Provider" chapter (docs.sun.com)
24 #
25 # PORTIONS: Copyright (c) 2005 Brendan Gregg.
26 #
27 # CDDL HEADER START
28 #
29 #  The contents of this file are subject to the terms of the
30 #  Common Development and Distribution License, Version 1.0 only
31 #  (the "License").  You may not use this file except in compliance
32 #  with the License.
33 #
34 #  You can obtain a copy of the license at Docs/cddl1.txt
35 #  or http://www.opensolaris.org/os/licensing.
36 #  See the License for the specific language governing permissions
37 #  and limitations under the License.
38 #
39 # CDDL HEADER END
40 #
41 # 09-Jun-2005   Brendan Gregg   Created this.
42 # 09-Jul-2005      "      "     Last update.
43
44 ### Usage
45 function usage
46 {
47         cat <<-END >&2
48         USAGE: sampleproc [hertz]
49            eg,
50                sampleproc               # defaults to 100 hertz
51                sampleproc 1000          # 1000 hertz
52         END
53         exit 1
54 }
55
56 ### Process arguments
57 if (( $# == 0 )); then
58         hertz=100
59 elif (( $# == 1 )); then
60         hertz=$1
61         if [[ "$hertz" = *[a-zA-Z]* ]]; then
62                 print "ERROR2: $hertz hertz is invalid." >&2
63                 exit 2
64         fi
65         if (( hertz > 5000 )); then
66                 print "ERROR3: $hertz hertz is too fast (max 5000)." >&2
67                 exit 3
68         fi
69         if (( hertz < 1 )); then
70                 print "ERROR4: $hertz hertz is too low (min 1)." >&2
71                 exit 4
72         fi
73 else
74         usage
75 fi
76
77 ### Run DTrace
78 /usr/sbin/dtrace -n '
79  #pragma D option quiet
80
81  dtrace:::BEGIN
82  {
83         printf("Sampling at %d hertz... Hit Ctrl-C to end.\n",$1);
84         self->start = timestamp;
85  }
86
87  profile:::profile-$1
88  {
89         @Proc[pid, execname] = count();
90         @BigProc[pid, execname] = sum(1000); /* dont ask */
91  }
92
93  dtrace:::END
94  {
95         this->end = timestamp;
96
97         printf("%5s %-20s %10s\n", "PID", "CMD", "COUNT");
98         printa("%5d %-20s %10@d\n", @Proc);
99
100         normalize(@BigProc, 
101             ((`ncpus_online * $1 * (this->end - self->start))/100000000));
102         printf("\n%5s %-20s %10s\n", "PID", "CMD", "PERCENT");
103         printa("%5d %-20s %10@d\n", @BigProc);
104  }
105 ' $hertz