1.\" Copyright (c) 2015 Mark Johnston <markj@FreeBSD.org> 2.\" All rights reserved. 3.\" 4.\" Redistribution and use in source and binary forms, with or without 5.\" modification, are permitted provided that the following conditions 6.\" are met: 7.\" 1. Redistributions of source code must retain the above copyright 8.\" notice, this list of conditions and the following disclaimer. 9.\" 2. Redistributions in binary form must reproduce the above copyright 10.\" notice, this list of conditions and the following disclaimer in the 11.\" documentation and/or other materials provided with the distribution. 12.\" 13.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23.\" SUCH DAMAGE. 24.\" 25.\" $FreeBSD$ 26.\" 27.Dd April 18, 2015 28.Dt DTRACE_SCHED 4 29.Os 30.Sh NAME 31.Nm dtrace_sched 32.Nd a DTrace provider for tracing CPU scheduling events 33.Sh SYNOPSIS 34.Fn sched:::change-pri "struct thread *" "struct proc *" "uint8_t" 35.Fn sched:::dequeue "struct thread *" "struct proc *" "void *" 36.Fn sched:::enqueue "struct thread *" "struct proc *" "void *" "int" 37.Fn sched:::lend-pri "struct thread *" "struct proc *" "uint8_t" "struct thread *" 38.Fn sched:::load-change "int" "int" 39.Fn sched:::off-cpu "struct thread *" "struct proc *" 40.Fn sched:::on-cpu 41.Fn sched:::preempt 42.Fn sched:::remain-cpu 43.Fn sched:::surrender "struct thread *" "struct proc *" 44.Fn sched:::sleep 45.Fn sched:::tick "struct thread *" "struct proc *" 46.Fn sched:::wakeup "struct thread *" "struct proc *" 47.Sh DESCRIPTION 48The DTrace 49.Nm sched 50provider allows the tracing of events related to CPU scheduling in the 4BSD and 51ULE schedulers. 52.Pp 53The 54.Fn sched:::change-pri 55probe fires when a thread's active scheduling priority is about to be updated. 56The first two arguments are the thread whose priority is about to be changed, 57and the corresponding process. 58The third argument is the new absolute priority for the thread, while the 59current value is given by 60.Dv args[0]->td_priority . 61The 62.Fn sched:::lend-pri 63probe fires when the currently-running thread elevates the priority of another 64thread via priority lending. 65The first two arguments are the thread whose priority is about to be changed, 66and the corresponding process. 67The third argument is the new absolute priority for the thread. 68The fourth argument is the currently-running thread. 69.Pp 70The 71.Fn sched:::dequeue 72probe fires immediately before a runnable thread is removed from a scheduler 73run queue. 74This may occur when the thread is about to begin execution on a CPU, or because 75the thread is being migrated to a different run queue. 76The latter event may occur in several circumstances: the scheduler may be 77attempting to rebalance load between multiple CPUs, the thread's scheduling 78priority may have changed, or the thread's CPU affinity settings may have 79changed. 80The first two arguments to 81.Fn sched:::dequeue 82are the thread and corresponding process. 83The third argument is currently always 84.Dv NULL . 85The 86.Fn sched:::enqueue 87probe fires when a runnable thread is about to be added to a scheduler run 88queue. 89Its first two arguments are the thread and corresponding process. 90The third argument is currently always 91.Dv NULL . 92The fourth argument is a boolean value that is non-zero if the thread is 93enqueued at the beginning of its run queue slot, and zero if the thread is 94instead enqueued at the end. 95.Pp 96The 97.Fn sched:::load-change 98probe fires after the load of a thread queue is adjusted. 99The first argument is the cpuid for the CPU associated with the thread queue, 100and the second argument is the adjusted load of the thread queue, i.e., the 101number of elements in the queue. 102.Pp 103The 104.Fn sched:::off-cpu 105probe is triggered by the scheduler suspending execution of the 106currently-running thread, and the 107.Fn sched:::on-cpu 108probe fires when the current thread has been selected to run on a CPU and is 109about to begin or resume execution. 110The arguments to 111.Fn sched:::off-cpu 112are the thread and corresponding process selected to run following the 113currently-running thread. 114If these two threads are the same, the 115.Fn sched:::remain-cpu 116probe will fire instead. 117.Pp 118The 119.Fn sched:::surrender 120probe fires when the scheduler is called upon to make a scheduling decision by 121a thread running on a different CPU, via an interprocessor interrupt. 122The arguments to this probe are the interrupted thread and its corresponding 123process. 124This probe currently always fires in the context of the interrupted thread. 125.Pp 126The 127.Fn sched:::preempt 128probe will fire immediately before the currently-running thread is preempted. 129When this occurs, the scheduler will select a new thread to run, and one of the 130.Fn sched:::off-cpu 131or 132.Fn sched:::remain-cpu 133probes will subsequently fire, depending on whether or not the scheduler selects 134the preempted thread. 135.Pp 136The 137.Fn sched:::sleep 138probe fires immediately before the currently-running thread is about to suspend 139execution and begin waiting for a condition to be met. 140The 141.Fn sched:::wakeup 142probe fires when a thread is set up to resume execution after having gone to 143sleep. 144Its arguments are the thread being awoken, and the corresponding process. 145.Pp 146The 147.Fn sched:::tick 148fires before each scheduler clock tick. 149Its arguments are the currently-running thread and its corresponding process. 150.Sh ARGUMENTS 151The 152.Nm sched 153provider probes use the kernel types 154.Vt "struct proc" 155and 156.Vt "struct thread" 157to represent processes and threads, respectively. 158These structures have many fields and are defined in 159.Pa sys/proc.h . 160In a probe body, the currently-running thread can always be obtained with the 161.Va curthread 162global variable, which has type 163.Vt "struct thread *" . 164For example, when a running thread is about to sleep, the 165.Fn sched:::sleep 166probe fires in the context of that thread, which can be accessed using 167.Va curthread . 168The 169.Va curcpu 170global variable contains the cpuid of the CPU on which the currently-running 171thread is executing. 172.Sh EXAMPLES 173The following script gives a breakdown of CPU utilization by process name: 174.Bd -literal -offset indent 175sched:::on-cpu 176{ 177 self->ts = timestamp; 178} 179 180sched:::off-cpu 181/self->ts != 0/ 182{ 183 @[execname] = sum((timestamp - self->ts) / 1000); 184 self->ts = 0; 185} 186.Ed 187.Pp 188Here, DTrace stores a timestamp each time a thread is scheduled to run, and 189computes the time elapsed in microseconds when it is descheduled. 190The results are summed by process name. 191.Sh COMPATIBILITY 192This provider is not compatible with the 193.Nm sched 194provider found in Solaris. 195In particular, the probe argument types are native 196.Fx 197types, and the 198.Fn sched:::cpucaps-sleep , 199.Fn sched:::cpucaps-wakeup , 200.Fn sched:::schedctl-nopreempt , 201.Fn sched:::schedctl-preempt , 202and 203.Fn sched:::schedctl-yield 204probes are not available in 205.Fx . 206.Pp 207The 208.Fn sched:::lend-pri 209and 210.Fn sched:::load-change 211probes are specific to 212.Fx . 213.Sh SEE ALSO 214.Xr dtrace 1 , 215.Xr sched_4bsd 4 , 216.Xr sched_ule 4 , 217.Xr SDT 9 , 218.Xr sleepqueue 9 219.Sh HISTORY 220The 221.Nm sched 222provider first appeared in 223.Fx 2248.4 and 9.1. 225.Sh AUTHORS 226This manual page was written by 227.An Mark Johnston Aq Mt markj@FreeBSD.org . 228