1.\"- 2.\" Copyright (c) 2004 Dag-Erling Co�dan Sm�rgrav 3.\" Copyright (c) 2005 Robert N. M. Watson 4.\" Copyright (c) 2006 Kip Macy 5.\" All rights reserved. 6.\" 7.\" Redistribution and use in source and binary forms, with or without 8.\" modification, are permitted provided that the following conditions 9.\" are met: 10.\" 1. Redistributions of source code must retain the above copyright 11.\" notice, this list of conditions and the following disclaimer. 12.\" 2. Redistributions in binary form must reproduce the above copyright 13.\" notice, this list of conditions and the following disclaimer in the 14.\" documentation and/or other materials provided with the distribution. 15.\" 3. The name of the author may not be used to endorse or promote products 16.\" derived from this software without specific prior written permission. 17.\" 18.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28.\" SUCH DAMAGE. 29.\" 30.\" $FreeBSD$ 31.\" 32.Dd November 11, 2006 33.Dt LOCK_PROFILING 9 34.Os 35.Sh NAME 36.Nm LOCK_PROFILING 37.Nd kernel lock profiling support 38.Sh SYNOPSIS 39.Cd "options LOCK_PROFILING" 40.Sh DESCRIPTION 41The 42.Dv LOCK_PROFILING 43kernel option adds support for measuring and reporting lock use and 44contention statistics. 45These statistics are collated by 46.Dq acquisition point . 47Acquisition points are 48distinct places in the kernel source code (identified by source file 49name and line number) where a lock is acquired. 50.Pp 51For each acquisition point, the following statistics are accumulated: 52.Bl -bullet 53.It 54The longest time the lock was ever continuously held after being 55acquired at this point. 56.It 57The total time the lock was held after being acquired at this point. 58.It 59The total time that threads have spent waiting to acquire the lock. 60.It 61The total number of non-recursive acquisitions. 62.It 63The total number of times the lock was already held by another thread 64when this point was reached, requiring a spin or a sleep. 65.It 66The total number of times another thread tried to acquire the lock 67while it was held after having been acquired at this point. 68.El 69.Pp 70In addition, the average hold time and average wait time are derived 71from the total hold time 72and total wait time respectively and the number of acquisitions. 73.Pp 74The 75.Dv LOCK_PROFILING 76kernel option also adds the following 77.Xr sysctl 8 78variables to control and monitor the profiling code: 79.Bl -tag -width indent 80.It Va debug.lock.prof.enable 81Enable or disable the lock profiling code. 82This defaults to 0 (off). 83.It Va debug.lock.prof.reset 84Reset the current lock profiling buffers. 85.It Va debug.lock.prof.acquisitions 86The total number of lock acquisitions recorded. 87.It Va debug.lock.prof.records 88The total number of acquisition points recorded. 89Note that only active acquisition points (i.e., points that have been 90reached at least once) are counted. 91.It Va debug.lock.prof.maxrecords 92The maximum number of acquisition points the profiling code is capable 93of monitoring. 94Since it would not be possible to call 95.Xr malloc 9 96from within the lock profiling code, this is a static limit. 97The number of records can be changed with the 98.Dv LPROF_BUFFERS 99kernel option. 100.It Va debug.lock.prof.rejected 101The number of acquisition points that were ignored after the table 102filled up. 103.It Va debug.lock.prof.hashsize 104The size of the hash table used to map acquisition points to 105statistics records. 106The hash size can be changed with the 107.Dv LPROF_HASH_SIZE 108kernel option. 109.It Va debug.lock.prof.collisions 110The number of hash collisions in the acquisition point hash table. 111.It Va debug.lock.prof.stats 112The actual profiling statistics in plain text. 113The columns are as follows, from left to right: 114.Bl -tag -width ".Va cnt_hold" 115.It Va max 116The longest continuous hold time in microseconds. 117.It Va total 118The total (accumulated) hold time in microseconds. 119.It Va wait_total 120The total (accumulated) wait time in microseconds. 121.It Va count 122The total number of acquisitions. 123.It Va avg 124The average hold time in microseconds, derived from the total hold time 125and the number of acquisitions. 126.It Va wait_avg 127The average wait time in microseconds, derived from the total wait time 128and the number of acquisitions. 129.It Va cnt_hold 130The number of times the lock was held and another thread attempted to 131acquire the lock. 132.It Va cnt_lock 133The number of times the lock was already held when this point was 134reached. 135.It Va name 136The name of the acquisition point, derived from the source file name 137and line number, followed by the name of the lock in parentheses. 138.El 139.El 140.Sh SEE ALSO 141.Xr sysctl 8 , 142.Xr mutex 9 143.Sh HISTORY 144Mutex profiling support appeared in 145.Fx 5.0 . 146Generalized lock profiling support appeared in 147.Fx 7.0 . 148.Sh AUTHORS 149.An -nosplit 150The 151.Nm MUTEX_PROFILING 152code was written by 153.An Eivind Eklund Aq eivind@FreeBSD.org , 154.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org 155and 156.An Robert Watson Aq rwatson@FreeBSD.org . 157The 158.Nm 159code was written by 160.An Kip Macy Aq kmacy@FreeBSD.org . 161This manual page was written by 162.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org . 163.Sh NOTES 164The 165.Dv LOCK_PROFILING 166option increases the size of 167.Vt "struct lock_object" , 168so a kernel built with that option will not work with modules built 169without it. 170.Pp 171The 172.Dv LOCK_PROFILING 173option also prevents inlining of the mutex code, which can result in a 174fairly severe performance penalty. 175This is, however, not always the case. 176.Dv LOCK_PROFILING 177can introduce a substantial performance overhead that is easily 178monitorable using other profiling tools, so combining profiling tools 179with 180.Dv LOCK_PROFILING 181is not recommended. 182.Pp 183Measurements are made and stored in nanoseconds using 184.Xr nanotime 9 , 185(on architectures without a synchronized TSC) but are presented in microseconds. 186This should still be sufficient for the locks one would be most 187interested in profiling (those that are held long and/or acquired 188often). 189.Pp 190.Dv LOCK_PROFILING 191should generally not be used in combination with other debugging options, as 192the results may be strongly affected by interactions between the features. 193In particular, 194.Dv LOCK_PROFILING 195will report higher than normal 196.Xr uma 9 197lock contention when run with 198.Dv INVARIANTS 199due to extra locking that occurs when 200.Dv INVARIANTS 201is present; likewise, using it in combination with 202.Dv WITNESS 203will lead to much higher lock hold times and contention in profiling output. 204