1.. SPDX-License-Identifier: GPL-2.0 2 3.. include:: ../disclaimer-ita.rst 4 5======================= 6Statistiche sui blocchi 7======================= 8 9Cosa 10==== 11 12Come suggerisce il nome, fornisce statistiche sui blocchi. 13 14 15Perché 16====== 17 18Perché, tanto per fare un esempio, le contese sui blocchi possono influenzare 19significativamente le prestazioni. 20 21Come 22==== 23 24*Lockdep* ha punti di collegamento nelle funzioni di blocco e inoltre 25mappa le istanze di blocco con le relative classi. Partiamo da questo punto 26(vedere Documentation/translations/it_IT/locking/lockdep-design.rst). 27Il grafico sottostante mostra la relazione che intercorre fra le 28funzioni di blocco e i vari punti di collegamenti che ci sono al loro 29interno:: 30 31 __acquire 32 | 33 lock _____ 34 | \ 35 | __contended 36 | | 37 | <wait> 38 | _______/ 39 |/ 40 | 41 __acquired 42 | 43 . 44 <hold> 45 . 46 | 47 __release 48 | 49 unlock 50 51 lock, unlock - le classiche funzioni di blocco 52 __* - i punti di collegamento 53 <> - stati 54 55Grazie a questi punti di collegamento possiamo fornire le seguenti statistiche: 56 57con-bounces 58 - numero di contese su un blocco che riguarda dati di un processore 59 60contentions 61 - numero di acquisizioni di blocchi che hanno dovuto attendere 62 63wait time 64 min 65 - tempo minimo (diverso da zero) che sia mai stato speso in attesa di 66 un blocco 67 68 max 69 - tempo massimo che sia mai stato speso in attesa di un blocco 70 71 total 72 - tempo totale speso in attesa di un blocco 73 74 avg 75 - tempo medio speso in attesa di un blocco 76 77acq-bounces 78 - numero di acquisizioni di blocco che riguardavano i dati su un processore 79 80acquisitions 81 - numero di volte che un blocco è stato ottenuto 82 83hold time 84 min 85 - tempo minimo (diverso da zero) che sia mai stato speso trattenendo un blocco 86 87 max 88 - tempo massimo che sia mai stato speso trattenendo un blocco 89 90 total 91 - tempo totale di trattenimento di un blocco 92 93 avg 94 - tempo medio di trattenimento di un blocco 95 96Questi numeri vengono raccolti per classe di blocco, e per ogni stato di 97lettura/scrittura (quando applicabile). 98 99Inoltre, questa raccolta di statistiche tiene traccia di 4 punti di contesa 100per classe di blocco. Un punto di contesa è una chiamata che ha dovuto 101aspettare l'acquisizione di un blocco. 102 103Configurazione 104-------------- 105 106Le statistiche sui blocchi si abilitano usando l'opzione di configurazione 107CONFIG_LOCK_STAT. 108 109Uso 110--- 111 112Abilitare la raccolta di statistiche:: 113 114 # echo 1 >/proc/sys/kernel/lock_stat 115 116Disabilitare la raccolta di statistiche:: 117 118 # echo 0 >/proc/sys/kernel/lock_stat 119 120Per vedere le statistiche correnti sui blocchi:: 121 122 ( i numeri di riga non fanno parte dell'output del comando, ma sono stati 123 aggiunti ai fini di questa spiegazione ) 124 125 # less /proc/lock_stat 126 127 01 lock_stat version 0.4 128 02----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 129 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 130 04----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 131 05 132 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 133 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 134 08 --------------- 135 09 &mm->mmap_sem 1 [<ffffffff811502a7>] khugepaged_scan_mm_slot+0x57/0x280 136 10 &mm->mmap_sem 96 [<ffffffff815351c4>] __do_page_fault+0x1d4/0x510 137 11 &mm->mmap_sem 34 [<ffffffff81113d77>] vm_mmap_pgoff+0x87/0xd0 138 12 &mm->mmap_sem 17 [<ffffffff81127e71>] vm_munmap+0x41/0x80 139 13 --------------- 140 14 &mm->mmap_sem 1 [<ffffffff81046fda>] dup_mmap+0x2a/0x3f0 141 15 &mm->mmap_sem 60 [<ffffffff81129e29>] SyS_mprotect+0xe9/0x250 142 16 &mm->mmap_sem 41 [<ffffffff815351c4>] __do_page_fault+0x1d4/0x510 143 17 &mm->mmap_sem 68 [<ffffffff81113d77>] vm_mmap_pgoff+0x87/0xd0 144 18 145 19............................................................................................................................................................................................................................. 146 20 147 21 unix_table_lock: 110 112 0.21 49.24 163.91 1.46 21094 66312 0.12 624.42 31589.81 0.48 148 22 --------------- 149 23 unix_table_lock 45 [<ffffffff8150ad8e>] unix_create1+0x16e/0x1b0 150 24 unix_table_lock 47 [<ffffffff8150b111>] unix_release_sock+0x31/0x250 151 25 unix_table_lock 15 [<ffffffff8150ca37>] unix_find_other+0x117/0x230 152 26 unix_table_lock 5 [<ffffffff8150a09f>] unix_autobind+0x11f/0x1b0 153 27 --------------- 154 28 unix_table_lock 39 [<ffffffff8150b111>] unix_release_sock+0x31/0x250 155 29 unix_table_lock 49 [<ffffffff8150ad8e>] unix_create1+0x16e/0x1b0 156 30 unix_table_lock 20 [<ffffffff8150ca37>] unix_find_other+0x117/0x230 157 31 unix_table_lock 4 [<ffffffff8150a09f>] unix_autobind+0x11f/0x1b0 158 159Questo estratto mostra le statistiche delle prime due classi di 160blocco. La riga 01 mostra la versione dell'output - la versione 161cambierà ogni volta che cambia il formato. Le righe dalla 02 alla 04 162rappresentano l'intestazione con la descrizione delle colonne. Le 163statistiche sono mostrate nelle righe dalla 05 alla 18 e dalla 20 164alla 31. Queste statistiche sono divise in due parti: le statistiche, 165seguite dai punti di contesa (righe 08 e 13) separati da un divisore. 166 167Le righe dalla 09 alla 12 mostrano i primi quattro punti di contesa 168registrati (il codice che tenta di acquisire un blocco) e le righe 169dalla 14 alla 17 mostrano i primi quattro punti contesi registrati 170(ovvero codice che ha acquisito un blocco). È possibile che nelle 171statistiche manchi il valore *max con-bounces*. 172 173Il primo blocco (righe dalla 05 alla 18) è di tipo lettura/scrittura e quindi 174mostra due righe prima del divisore. I punti di contesa non corrispondono alla 175descrizione delle colonne nell'intestazione; essi hanno due colonne: *punti di 176contesa* e *[<IP>] simboli*. Il secondo gruppo di punti di contesa sono i punti 177con cui si contende il blocco. 178 179La parte interna del tempo è espressa in us (microsecondi). 180 181Quando si ha a che fare con blocchi annidati si potrebbero vedere le 182sottoclassi di blocco:: 183 184 32........................................................................................................................................................................................................................... 185 33 186 34 &rq->lock: 13128 13128 0.43 190.53 103881.26 7.91 97454 3453404 0.00 401.11 13224683.11 3.82 187 35 --------- 188 36 &rq->lock 645 [<ffffffff8103bfc4>] task_rq_lock+0x43/0x75 189 37 &rq->lock 297 [<ffffffff8104ba65>] try_to_wake_up+0x127/0x25a 190 38 &rq->lock 360 [<ffffffff8103c4c5>] select_task_rq_fair+0x1f0/0x74a 191 39 &rq->lock 428 [<ffffffff81045f98>] scheduler_tick+0x46/0x1fb 192 40 --------- 193 41 &rq->lock 77 [<ffffffff8103bfc4>] task_rq_lock+0x43/0x75 194 42 &rq->lock 174 [<ffffffff8104ba65>] try_to_wake_up+0x127/0x25a 195 43 &rq->lock 4715 [<ffffffff8103ed4b>] double_rq_lock+0x42/0x54 196 44 &rq->lock 893 [<ffffffff81340524>] schedule+0x157/0x7b8 197 45 198 46........................................................................................................................................................................................................................... 199 47 200 48 &rq->lock/1: 1526 11488 0.33 388.73 136294.31 11.86 21461 38404 0.00 37.93 109388.53 2.84 201 49 ----------- 202 50 &rq->lock/1 11526 [<ffffffff8103ed58>] double_rq_lock+0x4f/0x54 203 51 ----------- 204 52 &rq->lock/1 5645 [<ffffffff8103ed4b>] double_rq_lock+0x42/0x54 205 53 &rq->lock/1 1224 [<ffffffff81340524>] schedule+0x157/0x7b8 206 54 &rq->lock/1 4336 [<ffffffff8103ed58>] double_rq_lock+0x4f/0x54 207 55 &rq->lock/1 181 [<ffffffff8104ba65>] try_to_wake_up+0x127/0x25a 208 209La riga 48 mostra le statistiche per la seconda sottoclasse (/1) della 210classe *&irq->lock* (le sottoclassi partono da 0); in questo caso, 211come suggerito dalla riga 50, ``double_rq_lock`` tenta di acquisire un blocco 212annidato di due spinlock. 213 214Per vedere i blocco più contesi:: 215 216 # grep : /proc/lock_stat | head 217 clockevents_lock: 2926159 2947636 0.15 46882.81 1784540466.34 605.41 3381345 3879161 0.00 2260.97 53178395.68 13.71 218 tick_broadcast_lock: 346460 346717 0.18 2257.43 39364622.71 113.54 3642919 4242696 0.00 2263.79 49173646.60 11.59 219 &mapping->i_mmap_mutex: 203896 203899 3.36 645530.05 31767507988.39 155800.21 3361776 8893984 0.17 2254.15 14110121.02 1.59 220 &rq->lock: 135014 136909 0.18 606.09 842160.68 6.15 1540728 10436146 0.00 728.72 17606683.41 1.69 221 &(&zone->lru_lock)->rlock: 93000 94934 0.16 59.18 188253.78 1.98 1199912 3809894 0.15 391.40 3559518.81 0.93 222 tasklist_lock-W: 40667 41130 0.23 1189.42 428980.51 10.43 270278 510106 0.16 653.51 3939674.91 7.72 223 tasklist_lock-R: 21298 21305 0.20 1310.05 215511.12 10.12 186204 241258 0.14 1162.33 1179779.23 4.89 224 rcu_node_1: 47656 49022 0.16 635.41 193616.41 3.95 844888 1865423 0.00 764.26 1656226.96 0.89 225 &(&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 226 rcu_node_0: 29203 30064 0.16 786.55 1555573.00 51.74 88963 244254 0.00 398.87 428872.51 1.76 227 228Per cancellare le statistiche:: 229 230 # echo 0 > /proc/lock_stat 231