Latenza

Da linuxaudio.it.

Quando si parla di audio, la latenza ha un ruolo fondamentale, in quanto ha un impatto su quelle operazioni musicalmente rilevanti (come la produzione del suono immediata in risposta a un messaggio) come la pressione di un tasto su una tastiera musicale.

La misura di questa immediatezza è il valore della latenza, e l'ideale è che sia ridotta al minimo senza che il sistema ne risenta a livello di performance.

Un musicista normalmente ha bisogno di una latenza inferiore ai 15 millisecondi per poter suonare senza che il ritardo risulti audibile (alcuni affermano di percepire anche ritardi più brevi). Di certo 20 ms è un limite di suonabilità oltre il quale sarebbe meglio non andare.

Indice


Latenza, Low Latency e Realtime

Per ottenere un sistema GNU/Linux a bassa latenza il principale elemento da considerare è il Kernel.

Il kernel di default, senza applicare nessuna patch riesce ad ottenere già ottime prestazioni, sufficienti nella maggior parte dei casi ad ottenere basse latenze, a patto che sia compilato con i giusti parametri (schedulatore dei processi PREEMPT, Timer di sistema a 1000HZ, ed altro).

Su Arch Linux ad esempio il kernel di default ha già questi parametri impostati correttamente, quindi il kernel di default si può già considerare low latency.

Su Ubuntu invece, il kernel di default è compilato per un'utilizzo più generico, quindi per ottenere un kernel low latency è necessario ricompilarlo con i giusti parametri, oppure trovare dei pacchetti di installazione già pronti.

Esiste infine una patch per il kernel, chiamata Real Time (rt), che una volta applicata consente di ottenere prestazioni ancora superiori grazie ad una diversa gestione dei processi, questa patch al momento è disponibile per i kernel 3.0 e 3.2, ed è scaricabile al seguente indirizzo: Real Time Patch.

Parametri per un kernel Low Latency

I parametri che fanno la reale differenza tra un kernel generico ed uno a bassa latenza, sono solamente 2, ci sono anche altre ottimizzazioni che potrebbero dare risultati migliori, ma molte di queste sono già attive praticamente di default in tutte le distribuzioni e le altre non hanno comunque un'impatto importante come queste.

  • Modello di prelazione: Lo Scheduler del Kernel (CFS), può essere impostato in 3 modi diversi per gestire i processi, ad ogni opzione cambia il livello di prelazione dei processi da parte dello scheduler:
    • CONFIG_PREEMPT_NONE: Se lo scheduler è impostato con questa opzione, il kernel non effettuerà nessuna prelazione dei processi, questa opzione è assolutamente la meno adatta per avere un sistema a bassa latenza (La migliore invece per i server ad esempio).
    • CONFIG_PREEMPT_VOLUNTARY: Con questa opzione lo scheduler introduce la prelazione sulle cause più comuni che possono causare lunghe latenze nei processi in esecuzione. Questo riduce la latenza del sistema, anche se per fare musica a livello professionale non è ancora sufficiente. (Questa è l'opzione di default per un sistema Desktop, e Ubuntu ha il proprio kernel impostato con questa opzione).
    • CONFIG_PREEMPT: Con questa opzione invece lo scheduler applica completamente la prelazione a tutti i processi in esecuzione. Questo riduce notevolmente la latenza ed è la scelta migliore per avere il massimo delle prestazioni in ambito musicale (Il kernel di Arch Linux è compilato con questa opzione di default).


Per verificare quale modello di prelazione è attivo sul vostro kernel è sufficiente digitare dal terminale questo comando:

fgrep CONFIG_PREEMPT /boot/config-$(uname -r)

Sarà restituito un elenco simile a questo:

CONFIG_PREEMPT_RCU=y
CONFIG_PREEMPT_NOTIFIERS=y
# CONFIG_PREEMPT_NONE is not set
# CONFIG_PREEMPT_VOLUNTARY is not set
CONFIG_PREEMPT=y
# CONFIG_PREEMPT_TRACER is not set

L'opzione attiva è quella che ha un valore "=y", in questo esempio il modello di prelazione è quello giusto per avere la minore latenza possibile.

  • Frequenza del timer: Questa opzione del kernel, serve per impostare la frequenza degli interrupts generati dal kernel: ad una maggiore frequenza di questi interrupt si avrà minore latenza ed un sistema più responsivo. Questa opzione può assumere valori di 100, 250, 300 e 1000. Il miglior valore per ottenere basse latenze è 1000.

Per verificare la frequenza del timer attiva sul vostro kernel digitare dal terminale questo comando:

fgrep CONFIG_HZ /boot/config-$(uname -r)

Il risultato di questo comando sarà simile al seguente:

# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
CONFIG_HZ_1000=y
CONFIG_HZ=1000

In questo caso il timer è impostato ad una frequenza di 1000, il valore migliore per un kernel low latency

limits.conf

Con limits.conf intendiamo il file che serve a limitare i processi utente.

Per ottentere prestazioni accettabili e sfruttare le capacità realtime di jackd a livello di utente, è necessario che vengano impostati alcuni parametri in questo file.

Recentemente il controllo dei limiti è stato reso modulare e viene fornito dalle singole applicazioni.

La sintassi del file limits.conf è:

<domain> <type> <item> <value>

È importante, per i nostri scopi, capire che domain indica un utente o un gruppo.

I valori impostati in value avranno quindi effetto solo per gli utenti o i gruppi specificati in domain. Nel caso si voglia specificare un gruppo la sintassi è @<nome_gruppo> (si veda l'esempio sotto).

  • Nel caso abbiate il file /etc/security/limits.conf, editatelo aggiungendo le seguenti righe:
@realtime   -  rtprio     99
@realtime   -  memlock    unlimited
  • Nel caso di sistemi recenti, l'installazione di jackd creerà automaticamente il file /etc/security/limits.d/99-audio.conf, che di fatto sostituisce il precedente.

Potete comunque modificare i parametri in quel file.

Compilazione kernel Real Time

Questa procedura e' stata testata su KXStudio 12.04.1 LTS (ubuntu) e dovrebbe andare bene per compilare un qualsiasi Kernel Vanilla con la patch RT.

1. Installare i seguenti pacchetti:

sudo apt-get install kernel-package fakeroot build-essential libncurses5-dev

2. Preparare kernel vanilla RT (modificare se necessario con versioni piu' recenti):

mkdir -p ~/tmp/linux-rt
cd ~/tmp/linux-rt
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.8.4.tar.bz2
# In alternativa, provare http://mirror.be.gbxs.net/pub/linux/kernel/projects/rt/3.8/patch-3.8.4-rt2.patch.bz2
# se questo link sottostante non fosse disponibile:
wget https://www.kernel.org/pub/linux/kernel/projects/rt/3.8/patch-3.8.4-rt2.patch.bz2
tar xjvf linux-3.8.4.tar.bz2
cd linux-3.8.4
patch -p1 < <(bunzip2 -c ../patch-3.8.4-rt2.patch.bz2)

3. Configurare il kernel:

cp /boot/config-$(uname -r) .config && make menuconfig

4. Editare i parametri del processore:


Editare i parametri del processore


Verificare Preemption Model:


Verificare Preempition Model


Selezionare Fully Peemptible Kernel:


Selezionare Fully Peemptible Kernel


Discendere l'elenco fino a Timer frequency:


Discendere l'elenco fino a Timer frequency


Selezionare 1000 HZ:


Selezionare 1000 HZ


Uscire dalle impostazioni processore ed andare alla fine della lista per salvare:


Uscire dalle impostazioni processore ed andare alla fine della lista per salvare


Confermare il salvataggio ed uscire da menuconfig:


Confermare il salvataggio ed uscire da menuconfig



5. Avviare ed attendere il completamento della compilazione del kernel

sed -rie 's/echo "\+"/#echo "\+"/' scripts/setlocalversion
make-kpkg clean
CONCURRENCY_LEVEL=$(getconf _NPROCESSORS_ONLN) fakeroot make-kpkg --initrd --revision=0 kernel_image kernel_headers

6. Installare i due pacchetti appena generati

sudo dpkg -i ../linux-{headers,image}-3.8.4-rt2_0_*.deb

7. Eventualmente, sarebbe possibile installare i driver nvidia proprietari con il Kernel RT e senza l'ausilio di altre patch. Il driver é scaricabile dal sito ufficiale http://www.nvidia.com/Download/index.aspx?lang=en-us ...per installarlo dovreste arrestare il server grafico...

8. Per arrestare lightdm, kdm o gdm... se vi trovate nel login grafico, passare ad una delle console, ad esempio premendo [Ctrl]+[Alt]+[F2], loggarsi come root e digitare:

/etc/init.d/lightdm stop

9. Posizionarsi nella directory dove avete scaricato il driver ed eseguire l'installer:

cd /home/nomeutente/Scaricati
sh ./NVIDIA-Linux-x86_64-310.44.run

10. Completata la procedura d'installazione del driver, riavviare lightdm, kdm o gdm:

/etc/init.d/lightdm start

Compilazione kernel Liquorix (HD Audio)

Questo sarebbe un'insieme di patch Real Time, per incrementare le prestazioni di tutto il desktop. Diventava sempre più impegnativo percepire se facesse suonare realmente meglio l'audio. Perché le differenze con Vanilla diventavano sempre più sottili. Alcune delle release più recenti, in particolar modo se abbinate ad un Window Manager performante come ad esempio IceWM, riescono ad elevare drasticamente le prestazioni qualitative dell'audio. Potete in pochi attimi valutare le versioni installabili delle repository ufficiali. Per ottenere la massima qualità audio possibile, basta applicare la patch e compilarlo automaticamente ed ottimizzato per la propria CPU, con questa semplicissima procedura.

sudo aptitude install libncurses5 libncurses5-dev kernel-package fakeroot build-essential
mkdir -p ~/tmp/linux-liquorix
cd ~/tmp/linux-liquorix
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.17.1.tar.gz
wget http://liquorix.net/sources/3.17.1-1.patch.gz
tar -xvf linux-3.17.tar.gz
gunzip 38.1-1.patch.gz
cd linux-2.6.38
patch -p1 < ../38.1-1.patch
# wget http://liquorix.net/sources/3.17/config.i386 -O .config
# OR
# wget http://liquorix.net/sources/3.17/config.amd64 -O .config
# but as there is no .config yet @ liquorix.net for 3.17.1 you can do
cp /boot/config-`uname -r` .config && yes "" | make oldconfig
make menuconfig # if you want to set up or check kernel options
make-kpkg clean
CONCURRENCY_LEVEL=$(getconf _NPROCESSORS_ONLN) fakeroot make-kpkg --initrd --append-to-version=-linuxaudio.it-`date +%Y%m%d` kernel-image kernel-headers
sudo dpkg -i ../linux-{headers,image}-3.17.0-linuxaudio.it*.deb
Strumenti personali
Namespace
Varianti
Azioni
Navigazione
Strumenti