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 from the total hold time 71and total wait time respectively and the number of acquisitions. 72.Pp 73The 74.Dv LOCK_PROFILING 75kernel option also adds the following 76.Xr sysctl 8 77variables to control and monitor the profiling code: 78.Bl -tag -width indent 79.It Va debug.lock.prof.enable 80Enable or disable the lock profiling code. 81This defaults to 0 (off). 82.It Va debug.lock.prof.reset 83Reset the current lock profiling buffers. 84.It Va debug.lock.prof.acquisitions 85The total number of lock acquisitions recorded. 86.It Va debug.lock.prof.records 87The total number of acquisition points recorded. 88Note that only active acquisition points (i.e., points that have been 89reached at least once) are counted. 90.It Va debug.lock.prof.maxrecords 91The maximum number of acquisition points the profiling code is capable 92of monitoring. 93Since it would not be possible to call 94.Xr malloc 9 95from within the lock profiling code, this is a static limit. 96The number of records can be changed with the 97.Dv LPROF_BUFFERS 98kernel option. 99.It Va debug.lock.prof.rejected 100The number of acquisition points that were ignored after the table 101filled up. 102.It Va debug.lock.prof.hashsize 103The size of the hash table used to map acquisition points to 104statistics records. 105The hash size can be changed with the 106.Dv LPROF_HASH_SIZE 107kernel option. 108.It Va debug.lock.prof.collisions 109The number of hash collisions in the acquisition point hash table. 110.It Va debug.lock.prof.stats 111The actual profiling statistics in plain text. 112The columns are as follows, from left to right: 113.Bl -tag -width ".Va cnt_hold" 114.It Va max 115The longest continuous hold time in microseconds. 116.It Va total 117The total (accumulated) hold time in microseconds. 118.It Va wait_total 119The total (accumulated) wait time in microseconds. 120.It Va count 121The total number of acquisitions. 122.It Va avg 123The average hold time in microseconds, derived from the total hold time 124and the number of acquisitions. 125.It Va wait_avg 126The average wait time in microseconds, derived from the total wait time 127and the number of acquisitions. 128.It Va cnt_hold 129The number of times the lock was held and another thread attempted to 130acquire the lock. 131.It Va cnt_lock 132The number of times the lock was already held when this point was 133reached. 134.It Va name 135The name of the acquisition point, derived from the source file name 136and line number, followed by the name of the lock in parentheses. 137.El 138.El 139.Sh SEE ALSO 140.Xr sysctl 8 , 141.Xr mutex 9 142.Sh HISTORY 143Mutex profiling support appeared in 144.Fx 5.0 . 145Generalized lock profiling support appeared in 146.Fx 5.0 . 147.Sh AUTHORS 148.An -nosplit 149The 150.Nm MUTEX_PROFILING 151code was written by 152.An Eivind Eklund Aq eivind@FreeBSD.org , 153.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org 154and 155.An Robert Watson Aq rwatson@FreeBSD.org . 156The 157.Nm LOCK_PROFILING 158code was written by 159.An Kip Macy Aq kmacy@FreeBSD.org . 160This manual page was written by 161.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org . 162.Sh NOTES 163The 164.Dv LOCK_PROFILING 165option increases the size of 166.Vt "struct lock_object" , 167so a kernel built with that option will not work with modules built 168without it. 169.Pp 170The 171.Dv LOCK_PROFILING 172option also prevents inlining of the mutex code, which can result in a 173fairly severe performance penalty. This is, however, not always the case. 174.Dv LOCK_PROFILING 175can introduce a substantial performance overhead that is easily 176monitorable using other profiling tools, so combining profiling tools 177with 178.Dv LOCK_PROFILING 179is not recommended. 180.Pp 181Measurements are made and stored in nanoseconds using 182.Xr nanotime 9 , 183(on architectures without a synchronized TSC) but are presented in microseconds. 184This should still be sufficient for the locks one would be most 185interested in profiling (those that are held long and/or acquired 186often). 187.Pp 188.Dv LOCK_PROFILING 189should generally not be used in combination with other debugging options, as 190the results may be strongly affected by interactions between the features. 191In particular, 192.Dv LOCK_PROFILING 193will report higher than normal 194.Xr uma 9 195lock contention when run with 196.Dv INVARIANTS 197due to extra locking that occurs when 198.Dv INVARIANTS 199is present; likewise, using it in combination with 200.Dv WITNESS 201will lead to much higher lock hold times and contention in profiling output. 202