요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-ita.rst
============================================
Funzionamento del test *Kernel Lock Torture*
============================================
CONFIG_LOCK_TORTURE_TEST
========================
L'opzione di configurazione CONFIG_LOCK_TORTURE_TEST fornisce un
modulo kernel che esegue delle verifiche che *torturano* le primitive di
sincronizzazione del kernel. Se dovesse servire, il modulo kernel,
'locktorture', può essere generato successivamente su un kernel che
volete verificare. Periodicamente le verifiche stampano messaggi tramite
``printk()`` e che quindi possono essere letti tramite ``dmesg`` (magari
filtrate l'output con ``grep "torture"``). La verifica inizia quando
il modulo viene caricato e termina quando viene rimosso. Questo
programma si basa sulle modalità di verifica di RCU tramite rcutorture.
Questa verifica consiste nella creazione di un certo numero di thread
del kernel che acquisiscono un blocco e lo trattengono per una certa
quantità di tempo così da simulare diversi comportamenti nelle sezioni
critiche. La quantità di contese su un blocco può essere simulata
allargando la sezione critica e/o creando più thread.
Parametri del modulo
====================
Questo modulo ha i seguenti parametri:
Specifici di locktorture
------------------------
nwriters_stress
Numero di thread del kernel che stresseranno l'acquisizione
esclusiva dei blocchi (scrittori). Il valore di base è il
doppio del numero di processori attivi presenti.
nreaders_stress
Numero di thread del kernel che stresseranno l'acquisizione
condivisa dei blocchi (lettori). Il valore di base è lo stesso
di nwriters_stress. Se l'utente non ha specificato
nwriters_stress, allora entrambe i valori corrisponderanno
al numero di processori attivi presenti.
torture_type
Tipo di blocco da verificare. Di base, solo gli spinlock
verranno verificati. Questo modulo può verificare anche
i seguenti tipi di blocchi:
- "lock_busted":
Simula un'incorretta implementazione del
blocco.
- "spin_lock":
coppie di spin_lock() e spin_unlock().
- "spin_lock_irq":
coppie di spin_lock_irq() e spin_unlock_irq().
- "rw_lock":
coppie di rwlock read/write lock() e unlock().
- "rw_lock_irq":
copie di rwlock read/write lock_irq() e
unlock_irq().
- "mutex_lock":
coppie di mutex_lock() e mutex_unlock().
- "rtmutex_lock":
coppie di rtmutex_lock() e rtmutex_unlock().
Il kernel deve avere CONFIG_RT_MUTEXES=y.
- "rwsem_lock":
coppie di semafori read/write down() e up().
Generici dell'ambiente di sviluppo 'torture' (RCU + locking)
------------------------------------------------------------
shutdown_secs
Numero di secondi prima che la verifica termini e il sistema
venga spento. Il valore di base è zero, il che disabilita
la possibilità di terminare e spegnere. Questa funzionalità
può essere utile per verifiche automatizzate.
onoff_interval
Numero di secondi fra ogni tentativo di esecuzione di
un'operazione casuale di CPU-hotplug. Di base è zero, il
che disabilita la funzionalità di CPU-hotplug. Nei kernel
con CONFIG_HOTPLUG_CPU=n, locktorture si rifiuterà, senza
dirlo, di effettuare una qualsiasi operazione di
CPU-hotplug indipendentemente dal valore specificato in
onoff_interval.
onoff_holdoff
Numero di secondi da aspettare prima di iniziare le
operazioni di CPU-hotplug. Normalmente questo verrebbe
usato solamente quando locktorture è compilato come parte
integrante del kernel ed eseguito automaticamente all'avvio,
in questo caso è utile perché permette di non confondere
l'avvio con i processori che vanno e vengono. Questo
parametro è utile sono se CONFIG_HOTPLUG_CPU è abilitato.
stat_interval
Numero di secondi fra una stampa (printk()) delle
statistiche e l'altra. Di base, locktorture riporta le
statistiche ogni 60 secondi. Impostando l'intervallo a 0
ha l'effetto di stampare le statistiche -solo- quando il
modulo viene rimosso.
stutter
Durata della verifica prima di effettuare una pausa di
eguale durata. Di base "stutter=5", quindi si eseguono
verifiche e pause di (circa) cinque secondi.
L'impostazione di "stutter=0" fa si che la verifica
venga eseguita continuamente senza fermarsi.
shuffle_interval
Il numero di secondi per cui un thread debba mantenere
l'affinità con un sottoinsieme di processori, di base è
3 secondi. Viene usato assieme a test_no_idle_hz.
verbose
Abilita le stampe di debug, via printk(). Di base è
abilitato. Queste informazioni aggiuntive sono per la
maggior parte relative ad errori di alto livello e resoconti
da parte dell'struttura 'torture'.
Statistiche
===========
Le statistiche vengono stampate secondo il seguente formato::
spin_lock-torture: Writes: Total: 93746064 Max/Min: 0/0 Fail: 0
(A) (B) (C) (D) (E)
(A): tipo di lock sotto verifica -- parametro torture_type.
(B): Numero di acquisizione del blocco in scrittura. Se si ha a che fare
con una primitiva di lettura/scrittura apparirà di seguito anche una
seconda voce "Reads"
(C): Numero di volte che il blocco è stato acquisito
(D): Numero minimo e massimo di volte che un thread ha fallito
nell'acquisire il blocco
(E): valori true/false nel caso di errori durante l'acquisizione del blocco.
Questo dovrebbe dare un riscontro positivo -solo- se c'è un baco
nell'implementazione delle primitive di sincronizzazione. Altrimenti un
blocco non dovrebbe mai fallire (per esempio, spin_lock()).
Ovviamente lo stesso si applica per (C). Un semplice esempio è il tipo
"lock_busted".
Uso
===
Il seguente script può essere utilizzato per verificare i blocchi::
#!/bin/sh
modprobe locktorture
sleep 3600
rmmod locktorture
dmesg | grep torture:
L'output può essere manualmente ispezionato cercando il marcatore d'errore
"!!!". Ovviamente potreste voler creare degli script più elaborati che
verificano automaticamente la presenza di errori. Il comando "rmmod" forza la
stampa (usando printk()) di "SUCCESS", "FAILURE", oppure "RCU_HOTPLUG". I primi
due si piegano da soli, mentre l'ultimo indica che non stati trovati problemi di
sincronizzazione, tuttavia ne sono stati trovati in CPU-hotplug.
Consultate anche: Documentation/translations/it_IT/RCU/torture.rst
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
CONFIG_LOCK_TORTURE_TEST 개요
1-28CONFIG_LOCK_TORTURE_TEST option은 핵심 kernel locking primitive에 torture test를 수행하는 locktorture module을 제공한다. 원한다면 시험할 running kernel에 맞춰 module을 나중에 별도로 build할 수 있다.
Test는 printk()로 주기적인 상태 message를 출력하며 dmesg에서 확인할 수 있다. torture 문자열로 grep하면 관련 message를 찾기 쉽다. Module을 load하면 test가 시작되고 unload하면 끝난다. 이 program은 RCU를 시험하는 rcutorture의 방식을 바탕으로 작성되었다.
Locktorture는 여러 kernel thread를 만들고 각 thread가 lock을 획득해 일정 시간 보유하게 함으로써 서로 다른 critical region 동작을 재현한다. Critical region의 lock 보유 시간을 늘리거나 kthread 수를 늘리면 lock contention을 높일 수 있다.
locktorture는 여러 커널 스레드가 같은 잠금 구현을 반복 획득·해제하도록 만들어 상호 배제, reader/writer 동작, IRQ 변형과 실시간 mutex의 오류를 장시간 압박하는 시험 모듈입니다. `CONFIG_LOCK_TORTURE_TEST`로 빌드합니다.
검증 강도는 임계 구역을 길게 만들거나 writer·reader 스레드 수를 늘려 높입니다. 이 시험은 특정 호출자의 성능 benchmark가 아니라 잠금 primitive가 높은 경합과 CPU 이동·hotplug 조건에서도 불변식을 지키는지 확인하는 데 초점을 둡니다.
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-ita.rst
============================================
Funzionamento del test *Kernel Lock Torture*
============================================
CONFIG_LOCK_TORTURE_TEST
========================
L'opzione di configurazione CONFIG_LOCK_TORTURE_TEST fornisce un
modulo kernel che esegue delle verifiche che *torturano* le primitive di
sincronizzazione del kernel. Se dovesse servire, il modulo kernel,
'locktorture', può essere generato successivamente su un kernel che
volete verificare. Periodicamente le verifiche stampano messaggi tramite
``printk()`` e che quindi possono essere letti tramite ``dmesg`` (magari
filtrate l'output con ``grep "torture"``). La verifica inizia quando
il modulo viene caricato e termina quando viene rimosso. Questo
programma si basa sulle modalità di verifica di RCU tramite rcutorture.
Questa verifica consiste nella creazione di un certo numero di thread
del kernel che acquisiscono un blocco e lo trattengono per una certa
quantità di tempo così da simulare diversi comportamenti nelle sezioni
critiche. La quantità di contese su un blocco può essere simulata
allargando la sezione critica e/o creando più thread.
locktorture 전용 매개변수
29-82| Parameter | 설명 |
|---|---|
| nwriters_stress | 배타적 lock ownership을 압박하는 writer kernel thread 수다. 기본값은 online CPU 수의 두 배다. |
| nreaders_stress | 공유 lock ownership을 압박하는 reader kernel thread 수다. 기본값은 writer 수와 같다. nwriters_stress를 지정하지 않았다면 reader와 writer가 각각 online CPU 수만큼 생성된다. |
| torture_type | 시험할 lock 종류다. 기본값은 spin_lock이며 아래 문자열 중 하나를 사용한다. |
| torture_type | 시험 대상 |
|---|---|
| lock_busted | 결함이 있는 lock 구현을 흉내 낸다 |
| spin_lock | spin_lock()/spin_unlock() 쌍 |
| spin_lock_irq | spin_lock_irq()/spin_unlock_irq() 쌍 |
| rw_lock | read/write lock()/unlock() rwlock 쌍 |
| rw_lock_irq | read/write lock_irq()/unlock_irq() rwlock 쌍 |
| mutex_lock | mutex_lock()/mutex_unlock() 쌍 |
| rtmutex_lock | rtmutex_lock()/rtmutex_unlock() 쌍, CONFIG_RT_MUTEXES=y 필요 |
| rwsem_lock | read/write down()/up() semaphore 쌍 |
`nwriters_stress`는 배타 획득을 반복할 writer 스레드 수이며 기본값은 활성 CPU 수의 두 배입니다. `nreaders_stress`는 shared reader 수이고 기본적으로 writer 수를 따르며, writer 수도 지정하지 않았다면 두 값 모두 활성 CPU 수가 됩니다.
`torture_type`은 시험할 구현을 선택합니다. `lock_busted`는 오류 탐지 경로 자체를 확인하는 의도적 고장 모델이며, `spin_lock`, `spin_lock_irq`, `rw_lock`, `rw_lock_irq`, `mutex_lock`, `rtmutex_lock`, `rwsem_lock`은 대응 lock/unlock 쌍을 실제로 압박합니다.
전용 `torture_type`과 필요한 조건을 정리했습니다.
Parametri del modulo
====================
Questo modulo ha i seguenti parametri:
Specifici di locktorture
------------------------
nwriters_stress
Numero di thread del kernel che stresseranno l'acquisizione
esclusiva dei blocchi (scrittori). Il valore di base è il
doppio del numero di processori attivi presenti.
nreaders_stress
Numero di thread del kernel che stresseranno l'acquisizione
condivisa dei blocchi (lettori). Il valore di base è lo stesso
di nwriters_stress. Se l'utente non ha specificato
nwriters_stress, allora entrambe i valori corrisponderanno
al numero di processori attivi presenti.
torture_type
Tipo di blocco da verificare. Di base, solo gli spinlock
verranno verificati. Questo modulo può verificare anche
i seguenti tipi di blocchi:
- "lock_busted":
Simula un'incorretta implementazione del
blocco.
- "spin_lock":
coppie di spin_lock() e spin_unlock().
- "spin_lock_irq":
coppie di spin_lock_irq() e spin_unlock_irq().
- "rw_lock":
coppie di rwlock read/write lock() e unlock().
- "rw_lock_irq":
copie di rwlock read/write lock_irq() e
unlock_irq().
- "mutex_lock":
coppie di mutex_lock() e mutex_unlock().
- "rtmutex_lock":
coppie di rtmutex_lock() e rtmutex_unlock().
Il kernel deve avere CONFIG_RT_MUTEXES=y.
- "rwsem_lock":
coppie di semafori read/write down() e up().
공통 torture 프레임워크 매개변수
83-135| Parameter | 설명 |
|---|---|
| shutdown_secs | 지정한 초만큼 test한 뒤 test를 끝내고 system power를 끈다. 기본값 0은 자동 종료를 disable하며 자동화 시험에 유용하다. |
| onoff_interval | 무작위 CPU hotplug operation을 시도하는 간격이다. 기본값 0은 hotplug를 disable한다. CONFIG_HOTPLUG_CPU=n이면 지정값과 무관하게 hotplug를 조용히 거부한다. |
| onoff_holdoff | CPU hotplug 시작 전 대기 시간이다. Boot 때 자동 시작되는 built-in locktorture가 boot code와 CPU online/offline 동작을 섞지 않도록 할 때 유용하며 CONFIG_HOTPLUG_CPU가 필요하다. |
| stat_interval | 통계 printk() 간격이다. 기본값은 60초이고 0이면 module을 unload할 때만 출력한다. |
| stutter | test를 실행한 뒤 같은 시간 동안 멈추는 주기다. 기본 stutter=5는 약 5초 실행과 5초 정지를 반복하며 0은 중단 없이 계속 실행한다. |
| shuffle_interval | test thread를 특정 CPU subset에 affinity로 묶어 두는 시간이다. 기본값은 3초이며 test_no_idle_hz와 함께 사용한다. |
| verbose | printk() debug 출력을 켠다. 기본 enable이며 주로 상위 수준 error와 torture framework report를 추가한다. |
`shutdown_secs`는 자동 시험 종료와 시스템 종료 시간을, `onoff_interval`과 `onoff_holdoff`는 CPU hotplug 시도 간격과 시작 지연을 제어합니다. `CONFIG_HOTPLUG_CPU=n`이면 hotplug 값이 있어도 해당 동작은 조용히 생략됩니다.
`stat_interval`은 통계 출력 주기이며 0이면 모듈 제거 때만 출력합니다. `stutter`는 시험과 휴식의 교대 시간을 정하고 0이면 계속 실행합니다. `shuffle_interval`은 스레드 CPU affinity 재배치 주기, `verbose`는 높은 수준 오류와 프레임워크 진단 출력을 제어합니다.
공통 torture 설정이 장시간 시험의 생명주기를 만듭니다.
Generici dell'ambiente di sviluppo 'torture' (RCU + locking)
------------------------------------------------------------
shutdown_secs
Numero di secondi prima che la verifica termini e il sistema
venga spento. Il valore di base è zero, il che disabilita
la possibilità di terminare e spegnere. Questa funzionalità
può essere utile per verifiche automatizzate.
onoff_interval
Numero di secondi fra ogni tentativo di esecuzione di
un'operazione casuale di CPU-hotplug. Di base è zero, il
che disabilita la funzionalità di CPU-hotplug. Nei kernel
con CONFIG_HOTPLUG_CPU=n, locktorture si rifiuterà, senza
dirlo, di effettuare una qualsiasi operazione di
CPU-hotplug indipendentemente dal valore specificato in
onoff_interval.
onoff_holdoff
Numero di secondi da aspettare prima di iniziare le
operazioni di CPU-hotplug. Normalmente questo verrebbe
usato solamente quando locktorture è compilato come parte
integrante del kernel ed eseguito automaticamente all'avvio,
in questo caso è utile perché permette di non confondere
l'avvio con i processori che vanno e vengono. Questo
parametro è utile sono se CONFIG_HOTPLUG_CPU è abilitato.
stat_interval
Numero di secondi fra una stampa (printk()) delle
statistiche e l'altra. Di base, locktorture riporta le
statistiche ogni 60 secondi. Impostando l'intervallo a 0
ha l'effetto di stampare le statistiche -solo- quando il
modulo viene rimosso.
stutter
Durata della verifica prima di effettuare una pausa di
eguale durata. Di base "stutter=5", quindi si eseguono
verifiche e pause di (circa) cinque secondi.
L'impostazione di "stutter=0" fa si che la verifica
venga eseguita continuamente senza fermarsi.
shuffle_interval
Il numero di secondi per cui un thread debba mantenere
l'affinità con un sottoinsieme di processori, di base è
3 secondi. Viene usato assieme a test_no_idle_hz.
verbose
Abilita le stampe di debug, via printk(). Di base è
abilitato. Queste informazioni aggiuntive sono per la
maggior parte relative ad errori di alto livello e resoconti
da parte dell'struttura 'torture'.
통계 출력 해석
136-161spin_lock-torture: Writes: Total: 93746064 Max/Min: 0/0 Fail: 0
(A) (B) (C) (D) (E)
- (A)는 torture_type으로 선택한 lock 종류다.
- (B)는 writer lock acquisition 통계라는 뜻이다. Read/write primitive를 시험하면 별도의 Reads 통계 줄도 출력한다.
- (C)는 lock 획득 횟수다.
- (D)는 thread가 lock 획득에 실패한 횟수의 최댓값과 최솟값이다.
- (E)는 lock 획득 error 여부를 나타내는 boolean 값이다. Lock primitive 구현에 bug가 있을 때만 positive여야 한다. 정상 spin_lock()은 실패하지 않는다. lock_busted가 의도적인 실패 예다.
통계의 `Writes: Total`은 writer 획득 수이며 reader/writer primitive에서는 별도 `Reads` 항목도 나옵니다. `Max/Min`은 한 스레드가 획득에 실패한 횟수의 범위를, `Fail`은 primitive가 정상 계약을 어긴 오류 여부를 나타냅니다.
정상적인 `spin_lock()`처럼 결국 성공해야 하는 연산에서는 `Fail`이 참이면 구현 결함을 의심해야 합니다. 반면 `lock_busted`는 고의로 잘못된 구현을 사용하므로 감사 경로가 오류를 찾아내는지 확인하는 양성 대조군입니다.
Statistiche
===========
Le statistiche vengono stampate secondo il seguente formato::
spin_lock-torture: Writes: Total: 93746064 Max/Min: 0/0 Fail: 0
(A) (B) (C) (D) (E)
(A): tipo di lock sotto verifica -- parametro torture_type.
(B): Numero di acquisizione del blocco in scrittura. Se si ha a che fare
con una primitiva di lettura/scrittura apparirà di seguito anche una
seconda voce "Reads"
(C): Numero di volte che il blocco è stato acquisito
(D): Numero minimo e massimo di volte che un thread ha fallito
nell'acquisire il blocco
(E): valori true/false nel caso di errori durante l'acquisizione del blocco.
Questo dovrebbe dare un riscontro positivo -solo- se c'è un baco
nell'implementazione delle primitive di sincronizzazione. Altrimenti un
blocco non dovrebbe mai fallire (per esempio, spin_lock()).
Ovviamente lo stesso si applica per (C). Un semplice esempio è il tipo
"lock_busted".
실행과 결과 판정
162-181#!/bin/sh
modprobe locktorture
sleep 3600
rmmod locktorture
dmesg | grep torture:
출력에서 error flag인 !!!를 직접 확인하거나 이를 자동으로 검사하는 script를 작성할 수 있다. rmmod는 SUCCESS, FAILURE, RCU_HOTPLUG 중 하나를 printk()하게 만든다. 앞의 두 값은 성공과 실패를 뜻하고 RCU_HOTPLUG는 locking failure는 없었지만 CPU hotplug 문제가 발견되었다는 뜻이다.
공통 torture framework의 추가 내용은 Documentation/RCU/torture.rst에서 확인한다.
기본 실행은 `modprobe locktorture`, 충분한 대기, `rmmod locktorture`, `dmesg | grep torture:` 순서입니다. 모듈 제거가 최종 통계를 강제로 출력하므로 장시간 자동 시험에서도 종료 로그를 반드시 수집해야 합니다.
로그의 `!!!`는 오류 표식입니다. 최종 `SUCCESS`와 `FAILURE`는 직접적인 결과이고, `RCU_HOTPLUG`는 잠금 오류는 없었지만 CPU hotplug 쪽 문제가 발견됐음을 뜻합니다. 관련 공통 시험 설계는 `Documentation/translations/it_IT/RCU/torture.rst`로 이어집니다.
Uso
===
Il seguente script può essere utilizzato per verificare i blocchi::
#!/bin/sh
modprobe locktorture
sleep 3600
rmmod locktorture
dmesg | grep torture:
L'output può essere manualmente ispezionato cercando il marcatore d'errore
"!!!". Ovviamente potreste voler creare degli script più elaborati che
verificano automaticamente la presenza di errori. Il comando "rmmod" forza la
stampa (usando printk()) di "SUCCESS", "FAILURE", oppure "RCU_HOTPLUG". I primi
due si piegano da soli, mentre l'ultimo indica che non stati trovati problemi di
sincronizzazione, tuttavia ne sono stati trovati in CPU-hotplug.
Consultate anche: Documentation/translations/it_IT/RCU/torture.rst
요약·해설
locktorture.rst:1-181여러 커널 스레드로 잠금 구현을 장시간 압박하고 통계와 오류 표식으로 결과를 판정하는 방법을 다룹니다.