Home | History | Annotate | Line # | Download | only in Bin
      1 #!/usr/bin/sh
      2 #
      3 # topsysproc - display top syscalls by process name.
      4 #              Written using DTrace (Solaris 10 3/05).
      5 #
      6 # This program continually prints a report of the number of system calls
      7 # by process name, and refreshes the display every 1 second or as specified
      8 # at the command line. Similar data can be fetched with "prstat -m".
      9 #
     10 # $Id: topsysproc,v 1.1.1.1 2015/09/30 22:01:07 christos Exp $
     11 #
     12 # USAGE:        topsysproc [interval]
     13 #
     14 # FIELDS:
     15 #		load avg   load averages, see uptime(1)
     16 #		syscalls   total number of syscalls in this interval
     17 #		PROCESS    process name
     18 #		COUNT      number of occurances in this interval
     19 #
     20 # NOTE: There may be several PIDs with the same process name.
     21 #
     22 # SEE ALSO:     prstat(1M)
     23 #
     24 # INSPIRATION:  top(1) by William LeFebvre
     25 #
     26 # COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
     27 #
     28 # CDDL HEADER START
     29 #
     30 #  The contents of this file are subject to the terms of the
     31 #  Common Development and Distribution License, Version 1.0 only
     32 #  (the "License").  You may not use this file except in compliance
     33 #  with the License.
     34 #
     35 #  You can obtain a copy of the license at Docs/cddl1.txt
     36 #  or http://www.opensolaris.org/os/licensing.
     37 #  See the License for the specific language governing permissions
     38 #  and limitations under the License.
     39 #
     40 # CDDL HEADER END
     41 #
     42 # 13-Jun-2005	Brendan Gregg	Created this.
     43 # 20-Apr-2006	   "      "	Last update.
     44 #
     45 
     46 #
     47 #  Check options
     48 #
     49 if [ "$1" = "-h" -o "$1" = "--help" ]; then
     50 	cat <<-END
     51 	USAGE: topsysproc [interval]
     52 	   eg,
     53 	       topsysproc            # default, 1 second updates
     54 	       topsysproc 5          # 5 second updates
     55 	END
     56 	exit 1
     57 fi
     58 interval=1
     59 if [ "$1" -gt 0 ]; then
     60 	interval=$1
     61 fi
     62 
     63 #
     64 #  Run DTrace
     65 #
     66 /usr/sbin/dtrace -n '
     67  #pragma D option quiet
     68  #pragma D option destructive
     69 
     70  /* constants */
     71  inline int INTERVAL = '$interval';
     72  inline int SCREEN   = 20;
     73 
     74  /* variables */
     75  dtrace:::BEGIN
     76  {
     77 	secs = 0;
     78 	printf("Tracing... Please wait.\n");
     79  }
     80 
     81  /* record syscall event */
     82  syscall:::entry
     83  {
     84 	@Name[execname] = count();
     85 	@Total = count();
     86  }
     87 
     88  /* update screen */
     89  profile:::tick-1sec
     90  /++secs >= INTERVAL/
     91  {
     92         /* fetch load averages */
     93         this->load1a  = `hp_avenrun[0] / 65536;
     94         this->load5a  = `hp_avenrun[1] / 65536;
     95         this->load15a = `hp_avenrun[2] / 65536;
     96         this->load1b  = ((`hp_avenrun[0] % 65536) * 100) / 65536;
     97         this->load5b  = ((`hp_avenrun[1] % 65536) * 100) / 65536;
     98         this->load15b = ((`hp_avenrun[2] % 65536) * 100) / 65536;
     99 
    100 	/* clear screen */
    101 	system("clear");
    102 
    103         /* print load average */
    104         printf("%Y, load average: %d.%02d, %d.%02d, %d.%02d",
    105             walltimestamp, this->load1a, this->load1b, this->load5a,
    106             this->load5b, this->load15a, this->load15b);
    107 
    108 	/* print syscall count */
    109 	printa("   syscalls: %@d\n",@Total);
    110 
    111 	/* print report */
    112 	trunc(@Name, SCREEN);
    113 	printf("\n   %-25s %12s\n", "PROCESS", "COUNT");
    114 	printa("   %-25s %@12d\n", @Name);
    115 
    116 	/* reset variables */
    117 	trunc(@Name);
    118 	clear(@Total);
    119 	secs = 0;
    120  }
    121 '
    122