1 1.1 christos #!/usr/bin/ksh 2 1.1 christos # 3 1.1 christos # topsyscall - display top syscalls by syscall name. 4 1.1 christos # Written using DTrace (Solaris 10 3/05). 5 1.1 christos # 6 1.1 christos # This program continually prints a report of the top system calls, 7 1.1 christos # and refreshes the display every 1 second or as specified at the 8 1.1 christos # command line. 9 1.1 christos # 10 1.1 christos # $Id: topsyscall,v 1.1.1.1 2015/09/30 22:01:07 christos Exp $ 11 1.1 christos # 12 1.1 christos # USAGE: topsyscall [-Cs] [interval [count]] 13 1.1 christos # 14 1.1 christos # -C # don't clear the screen 15 1.1 christos # -s # print per second values 16 1.1 christos # 17 1.1 christos # FIELDS: 18 1.1 christos # load avg load averages, see uptime(1) 19 1.1 christos # syscalls total syscalls in this interval 20 1.1 christos # syscalls/s syscalls per second 21 1.1 christos # SYSCALL system call name 22 1.1 christos # COUNT total syscalls in this interval 23 1.1 christos # COUNT/s syscalls per second 24 1.1 christos # 25 1.1 christos # INSPIRATION: top(1) by William LeFebvre 26 1.1 christos # 27 1.1 christos # COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. 28 1.1 christos # 29 1.1 christos # CDDL HEADER START 30 1.1 christos # 31 1.1 christos # The contents of this file are subject to the terms of the 32 1.1 christos # Common Development and Distribution License, Version 1.0 only 33 1.1 christos # (the "License"). You may not use this file except in compliance 34 1.1 christos # with the License. 35 1.1 christos # 36 1.1 christos # You can obtain a copy of the license at Docs/cddl1.txt 37 1.1 christos # or http://www.opensolaris.org/os/licensing. 38 1.1 christos # See the License for the specific language governing permissions 39 1.1 christos # and limitations under the License. 40 1.1 christos # 41 1.1 christos # CDDL HEADER END 42 1.1 christos # 43 1.1 christos # 13-Jun-2005 Brendan Gregg Created this. 44 1.1 christos # 20-Apr-2006 " " Last update. 45 1.1 christos # 46 1.1 christos 47 1.1 christos ############################## 48 1.1 christos # --- Process Arguments --- 49 1.1 christos # 50 1.1 christos 51 1.1 christos ### Default variables 52 1.1 christos count=-1; interval=1; opt_persec=0; opt_clear=1 53 1.1 christos 54 1.1 christos ### Process options 55 1.1 christos while getopts Chs name 56 1.1 christos do 57 1.1 christos case $name in 58 1.1 christos C) opt_clear=0 ;; 59 1.1 christos s) opt_persec=1 ;; 60 1.1 christos h|?) cat <<-END >&2 61 1.1 christos USAGE: topsyscall [-s] [interval [count]] 62 1.1 christos -C # don't clear the screen 63 1.1 christos -s # print per second values 64 1.1 christos eg, 65 1.1 christos topsyscall # default, 1 second updates 66 1.1 christos topsyscall 5 # 5 second updates 67 1.1 christos END 68 1.1 christos exit 1 69 1.1 christos esac 70 1.1 christos done 71 1.1 christos shift $(( $OPTIND - 1 )) 72 1.1 christos 73 1.1 christos ### option logic 74 1.1 christos if [[ "$1" > 0 ]]; then 75 1.1 christos interval=$1; shift 76 1.1 christos fi 77 1.1 christos if [[ "$1" > 0 ]]; then 78 1.1 christos count=$1; shift 79 1.1 christos fi 80 1.1 christos if (( opt_clear )); then 81 1.1 christos clearstr=`clear` 82 1.1 christos else 83 1.1 christos clearstr=. 84 1.1 christos fi 85 1.1 christos 86 1.1 christos 87 1.1 christos 88 1.1 christos ################################# 89 1.1 christos # --- Main Program, DTrace --- 90 1.1 christos # 91 1.1 christos /usr/sbin/dtrace -n ' 92 1.1 christos #pragma D option quiet 93 1.1 christos #pragma D option destructive 94 1.1 christos 95 1.1 christos /* constants */ 96 1.1 christos inline int OPT_clear = '$opt_clear'; 97 1.1 christos inline int OPT_persec = '$opt_persec'; 98 1.1 christos inline int INTERVAL = '$interval'; 99 1.1 christos inline int COUNTER = '$count'; 100 1.1 christos inline int SCREEN = 20; 101 1.1 christos inline string CLEAR = "'$clearstr'"; 102 1.1 christos 103 1.1 christos /* variables */ 104 1.1 christos dtrace:::BEGIN 105 1.1 christos { 106 1.1 christos secs = INTERVAL; 107 1.1 christos counts = COUNTER; 108 1.1 christos printf("Tracing... Please wait.\n"); 109 1.1 christos } 110 1.1 christos 111 1.1 christos /* record syscall event */ 112 1.1 christos syscall:::entry 113 1.1 christos { 114 1.1 christos @Name[probefunc] = count(); 115 1.1 christos @Total = count(); 116 1.1 christos } 117 1.1 christos 118 1.1 christos /* timer */ 119 1.1 christos profile:::tick-1sec 120 1.1 christos { 121 1.1 christos secs--; 122 1.1 christos } 123 1.1 christos 124 1.1 christos /* update screen */ 125 1.1 christos profile:::tick-1sec 126 1.1 christos /secs == 0/ 127 1.1 christos { 128 1.1 christos /* fetch load averages */ 129 1.1 christos this->load1a = `hp_avenrun[0] / 65536; 130 1.1 christos this->load5a = `hp_avenrun[1] / 65536; 131 1.1 christos this->load15a = `hp_avenrun[2] / 65536; 132 1.1 christos this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536; 133 1.1 christos this->load5b = ((`hp_avenrun[1] % 65536) * 100) / 65536; 134 1.1 christos this->load15b = ((`hp_avenrun[2] % 65536) * 100) / 65536; 135 1.1 christos 136 1.1 christos /* clear screen */ 137 1.1 christos OPT_clear ? printf("%s", CLEAR) : 1; 138 1.1 christos 139 1.1 christos /* print load average */ 140 1.1 christos printf("%Y, load average: %d.%02d, %d.%02d, %d.%02d", 141 1.1 christos walltimestamp, this->load1a, this->load1b, this->load5a, 142 1.1 christos this->load5b, this->load15a, this->load15b); 143 1.1 christos 144 1.1 christos /* calculate per second values if needed */ 145 1.1 christos OPT_persec ? normalize(@Total, INTERVAL) : 1; 146 1.1 christos OPT_persec ? normalize(@Name, INTERVAL) : 1; 147 1.1 christos 148 1.1 christos /* print syscall count */ 149 1.1 christos printf(" %s: ", OPT_persec ? "syscalls/s" : "syscalls"); 150 1.1 christos printa("%@d\n",@Total); 151 1.1 christos 152 1.1 christos /* print report */ 153 1.1 christos trunc(@Name, SCREEN); 154 1.1 christos printf("\n %-25s %12s\n", "SYSCALL", 155 1.1 christos OPT_persec ? "COUNT/s" : "COUNT"); 156 1.1 christos printa(" %-25s %@12d\n", @Name); 157 1.1 christos printf("\n"); 158 1.1 christos 159 1.1 christos /* reset variables */ 160 1.1 christos trunc(@Name); 161 1.1 christos clear(@Total); 162 1.1 christos secs = INTERVAL; 163 1.1 christos counts--; 164 1.1 christos } 165 1.1 christos 166 1.1 christos /* 167 1.1 christos * End of program 168 1.1 christos */ 169 1.1 christos profile:::tick-1sec 170 1.1 christos /counts == 0/ 171 1.1 christos { 172 1.1 christos exit(0); 173 1.1 christos } 174 1.1 christos 175 1.1 christos /* 176 1.1 christos * Cleanup for Ctrl-C 177 1.1 christos */ 178 1.1 christos dtrace:::END 179 1.1 christos { 180 1.1 christos trunc(@Name); 181 1.1 christos trunc(@Total); 182 1.1 christos } 183 1.1 christos ' 184 1.1 christos 185