lockstat.rst 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. ===============
  2. Lock Statistics
  3. ===============
  4. What
  5. ====
  6. As the name suggests, it provides statistics on locks.
  7. Why
  8. ===
  9. Because things like lock contention can severely impact performance.
  10. How
  11. ===
  12. Lockdep already has hooks in the lock functions and maps lock instances to
  13. lock classes. We build on that (see Documentation/locking/lockdep-design.rst).
  14. The graph below shows the relation between the lock functions and the various
  15. hooks therein::
  16. __acquire
  17. |
  18. lock _____
  19. | \
  20. | __contended
  21. | |
  22. | <wait>
  23. | _______/
  24. |/
  25. |
  26. __acquired
  27. |
  28. .
  29. <hold>
  30. .
  31. |
  32. __release
  33. |
  34. unlock
  35. lock, unlock - the regular lock functions
  36. __* - the hooks
  37. <> - states
  38. With these hooks we provide the following statistics:
  39. con-bounces
  40. - number of lock contention that involved x-cpu data
  41. contentions
  42. - number of lock acquisitions that had to wait
  43. wait time
  44. min
  45. - shortest (non-0) time we ever had to wait for a lock
  46. max
  47. - longest time we ever had to wait for a lock
  48. total
  49. - total time we spend waiting on this lock
  50. avg
  51. - average time spent waiting on this lock
  52. acq-bounces
  53. - number of lock acquisitions that involved x-cpu data
  54. acquisitions
  55. - number of times we took the lock
  56. hold time
  57. min
  58. - shortest (non-0) time we ever held the lock
  59. max
  60. - longest time we ever held the lock
  61. total
  62. - total time this lock was held
  63. avg
  64. - average time this lock was held
  65. These numbers are gathered per lock class, per read/write state (when
  66. applicable).
  67. It also tracks 4 contention points per class. A contention point is a call site
  68. that had to wait on lock acquisition.
  69. Configuration
  70. -------------
  71. Lock statistics are enabled via CONFIG_LOCK_STAT.
  72. Usage
  73. -----
  74. Enable collection of statistics::
  75. # echo 1 >/proc/sys/kernel/lock_stat
  76. Disable collection of statistics::
  77. # echo 0 >/proc/sys/kernel/lock_stat
  78. Look at the current lock statistics::
  79. ( line numbers not part of actual output, done for clarity in the explanation
  80. below )
  81. # less /proc/lock_stat
  82. 01 lock_stat version 0.4
  83. 02-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  84. 03 class name con-bounces contentions waittime-min waittime-max waittime-total waittime-avg acq-bounces acquisitions holdtime-min holdtime-max holdtime-total holdtime-avg
  85. 04-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  86. 05
  87. 06 &mm->mmap_sem-W: 46 84 0.26 939.10 16371.53 194.90 47291 2922365 0.16 2220301.69 17464026916.32 5975.99
  88. 07 &mm->mmap_sem-R: 37 100 1.31 299502.61 325629.52 3256.30 212344 34316685 0.10 7744.91 95016910.20 2.77
  89. 08 ---------------
  90. 09 &mm->mmap_sem 1 [<ffffffff811502a7>] khugepaged_scan_mm_slot+0x57/0x280
  91. 10 &mm->mmap_sem 96 [<ffffffff815351c4>] __do_page_fault+0x1d4/0x510
  92. 11 &mm->mmap_sem 34 [<ffffffff81113d77>] vm_mmap_pgoff+0x87/0xd0
  93. 12 &mm->mmap_sem 17 [<ffffffff81127e71>] vm_munmap+0x41/0x80
  94. 13 ---------------
  95. 14 &mm->mmap_sem 1 [<ffffffff81046fda>] dup_mmap+0x2a/0x3f0
  96. 15 &mm->mmap_sem 60 [<ffffffff81129e29>] SyS_mprotect+0xe9/0x250
  97. 16 &mm->mmap_sem 41 [<ffffffff815351c4>] __do_page_fault+0x1d4/0x510
  98. 17 &mm->mmap_sem 68 [<ffffffff81113d77>] vm_mmap_pgoff+0x87/0xd0
  99. 18
  100. 19.............................................................................................................................................................................................................................
  101. 20
  102. 21 unix_table_lock: 110 112 0.21 49.24 163.91 1.46 21094 66312 0.12 624.42 31589.81 0.48
  103. 22 ---------------
  104. 23 unix_table_lock 45 [<ffffffff8150ad8e>] unix_create1+0x16e/0x1b0
  105. 24 unix_table_lock 47 [<ffffffff8150b111>] unix_release_sock+0x31/0x250
  106. 25 unix_table_lock 15 [<ffffffff8150ca37>] unix_find_other+0x117/0x230
  107. 26 unix_table_lock 5 [<ffffffff8150a09f>] unix_autobind+0x11f/0x1b0
  108. 27 ---------------
  109. 28 unix_table_lock 39 [<ffffffff8150b111>] unix_release_sock+0x31/0x250
  110. 29 unix_table_lock 49 [<ffffffff8150ad8e>] unix_create1+0x16e/0x1b0
  111. 30 unix_table_lock 20 [<ffffffff8150ca37>] unix_find_other+0x117/0x230
  112. 31 unix_table_lock 4 [<ffffffff8150a09f>] unix_autobind+0x11f/0x1b0
  113. This excerpt shows the first two lock class statistics. Line 01 shows the
  114. output version - each time the format changes this will be updated. Line 02-04
  115. show the header with column descriptions. Lines 05-18 and 20-31 show the actual
  116. statistics. These statistics come in two parts; the actual stats separated by a
  117. short separator (line 08, 13) from the contention points.
  118. Lines 09-12 show the first 4 recorded contention points (the code
  119. which tries to get the lock) and lines 14-17 show the first 4 recorded
  120. contended points (the lock holder). It is possible that the max
  121. con-bounces point is missing in the statistics.
  122. The first lock (05-18) is a read/write lock, and shows two lines above the
  123. short separator. The contention points don't match the column descriptors,
  124. they have two: contentions and [<IP>] symbol. The second set of contention
  125. points are the points we're contending with.
  126. The integer part of the time values is in us.
  127. Dealing with nested locks, subclasses may appear::
  128. 32...........................................................................................................................................................................................................................
  129. 33
  130. 34 &rq->lock: 13128 13128 0.43 190.53 103881.26 7.91 97454 3453404 0.00 401.11 13224683.11 3.82
  131. 35 ---------
  132. 36 &rq->lock 645 [<ffffffff8103bfc4>] task_rq_lock+0x43/0x75
  133. 37 &rq->lock 297 [<ffffffff8104ba65>] try_to_wake_up+0x127/0x25a
  134. 38 &rq->lock 360 [<ffffffff8103c4c5>] select_task_rq_fair+0x1f0/0x74a
  135. 39 &rq->lock 428 [<ffffffff81045f98>] scheduler_tick+0x46/0x1fb
  136. 40 ---------
  137. 41 &rq->lock 77 [<ffffffff8103bfc4>] task_rq_lock+0x43/0x75
  138. 42 &rq->lock 174 [<ffffffff8104ba65>] try_to_wake_up+0x127/0x25a
  139. 43 &rq->lock 4715 [<ffffffff8103ed4b>] double_rq_lock+0x42/0x54
  140. 44 &rq->lock 893 [<ffffffff81340524>] schedule+0x157/0x7b8
  141. 45
  142. 46...........................................................................................................................................................................................................................
  143. 47
  144. 48 &rq->lock/1: 1526 11488 0.33 388.73 136294.31 11.86 21461 38404 0.00 37.93 109388.53 2.84
  145. 49 -----------
  146. 50 &rq->lock/1 11526 [<ffffffff8103ed58>] double_rq_lock+0x4f/0x54
  147. 51 -----------
  148. 52 &rq->lock/1 5645 [<ffffffff8103ed4b>] double_rq_lock+0x42/0x54
  149. 53 &rq->lock/1 1224 [<ffffffff81340524>] schedule+0x157/0x7b8
  150. 54 &rq->lock/1 4336 [<ffffffff8103ed58>] double_rq_lock+0x4f/0x54
  151. 55 &rq->lock/1 181 [<ffffffff8104ba65>] try_to_wake_up+0x127/0x25a
  152. Line 48 shows statistics for the second subclass (/1) of &rq->lock class
  153. (subclass starts from 0), since in this case, as line 50 suggests,
  154. double_rq_lock actually acquires a nested lock of two spinlocks.
  155. View the top contending locks::
  156. # grep : /proc/lock_stat | head
  157. clockevents_lock: 2926159 2947636 0.15 46882.81 1784540466.34 605.41 3381345 3879161 0.00 2260.97 53178395.68 13.71
  158. tick_broadcast_lock: 346460 346717 0.18 2257.43 39364622.71 113.54 3642919 4242696 0.00 2263.79 49173646.60 11.59
  159. &mapping->i_mmap_mutex: 203896 203899 3.36 645530.05 31767507988.39 155800.21 3361776 8893984 0.17 2254.15 14110121.02 1.59
  160. &rq->lock: 135014 136909 0.18 606.09 842160.68 6.15 1540728 10436146 0.00 728.72 17606683.41 1.69
  161. &(&zone->lru_lock)->rlock: 93000 94934 0.16 59.18 188253.78 1.98 1199912 3809894 0.15 391.40 3559518.81 0.93
  162. tasklist_lock-W: 40667 41130 0.23 1189.42 428980.51 10.43 270278 510106 0.16 653.51 3939674.91 7.72
  163. tasklist_lock-R: 21298 21305 0.20 1310.05 215511.12 10.12 186204 241258 0.14 1162.33 1179779.23 4.89
  164. rcu_node_1: 47656 49022 0.16 635.41 193616.41 3.95 844888 1865423 0.00 764.26 1656226.96 0.89
  165. &(&dentry->d_lockref.lock)->rlock: 39791 40179 0.15 1302.08 88851.96 2.21 2790851 12527025 0.10 1910.75 3379714.27 0.27
  166. rcu_node_0: 29203 30064 0.16 786.55 1555573.00 51.74 88963 244254 0.00 398.87 428872.51 1.76
  167. Clear the statistics::
  168. # echo 0 > /proc/lock_stat