6 999
contributi
m (typos) |
S3v (discussione | contributi) Nessun oggetto della modifica |
||
Riga 1: | Riga 1: | ||
= Introduzione = | |||
Questa è una breve guida su come configurare il sistema per poter eseguire applicazioni audio realtime. | Questa è una breve guida su come configurare il sistema per poter eseguire applicazioni audio realtime. | ||
Riga 10: | Riga 10: | ||
Il kernel 2.6 ha raggiunto ormai delle prestazioni molto buone per quanto riguarda la latenza (anni luce avanti rispetto al 2.4). Normalmente è dunque sufficiente configurare il sistema per permettere ai normali utenti di eseguire applicazioni realtime (''secondo passo''). | Il kernel 2.6 ha raggiunto ormai delle prestazioni molto buone per quanto riguarda la latenza (anni luce avanti rispetto al 2.4). Normalmente è dunque sufficiente configurare il sistema per permettere ai normali utenti di eseguire applicazioni realtime (''secondo passo''). | ||
Se invece | Se invece si vuole, non solo ridurre sotto la soglia (indicativa) dei ~ 5 ms la latenza minima ottenibile, ma soprattutto aumentare notevolmente l'affidabilità del sistema nel rispettare le basse latenze bisogna usare la patch realtime-preemption (''primo passo''). È questo il caso, ad esempio, se si vuole lavorare in full-duplex su diverse tracce in realtime, ''senza correre il rischio di xrun'' (ovvero interruzioni del flusso audio). Oppure se si vuole suonare un sintetizzatore software usando la minima latenza possibile. | ||
La patch realtime-preemption (per quanto perfettamente usabile) continua ad essere sviluppata incessantemente, e le release sono spesso giornaliere. Il kernel a cui si applica la patch è sempre l'ultimo kernel stabile o, spesso, l'ultimo RC. Nella guida, a puro titolo esemplificativo, mi riferirò ad un kernel e ad una versione di patch specifica, anche se queste versioni diventeranno presto obsolete. | La patch realtime-preemption (per quanto perfettamente usabile) continua ad essere sviluppata incessantemente, e le release sono spesso giornaliere. Il kernel a cui si applica la patch è sempre l'ultimo kernel stabile o, spesso, l'ultimo RC. Nella guida, a puro titolo esemplificativo, mi riferirò ad un kernel e ad una versione di patch specifica, anche se queste versioni diventeranno presto obsolete. | ||
{{Warningbox|Se non siete a vostro completo agio a compilare e patchare il kernel questa non è la via che fa per voi. Consiglio, in tal caso, di usare un setup per l'audio professionale pronto per l'uso, come la distribuzione [http://64studio.com/ 64 Studio] (disponibile sia per processori 64 bit che per 32bit). Se volete invece informazioni dettagliate su come compilare il kernel alla '' | {{Warningbox|Se non siete a vostro completo agio a compilare e patchare il kernel questa non è la via che fa per voi. Consiglio, in tal caso, di usare un setup per l'audio professionale pronto per l'uso, come la distribuzione [http://64studio.com/ 64 Studio] (disponibile sia per processori 64 bit che per 32bit). Se volete invece informazioni dettagliate su come compilare il kernel alla ''Debian-way'': [[Debian Kernel Howto]]. }} | ||
= Dal kernel stabile all'RC = | |||
Consiglio di compilare l'ultima versione stabile del kernel, configurandola e testandola fino ad ottenere una configurazione ben funzionante. Come spunto potete usare [[Esempio configurazione kernel|questa configurazione]]. Nel mio caso ho usato il kernel 2.6.13.2 e la [[Debian Kernel Howto| | Consiglio di compilare l'ultima versione stabile del kernel, configurandola e testandola fino ad ottenere una configurazione ben funzionante. Come spunto potete usare [[Esempio configurazione kernel|questa configurazione]]. Nel mio caso ho usato il kernel 2.6.13.2 e la [[Debian Kernel Howto|Debian-way]] di compilare il kernel. | ||
Una guida completa sulla configurazione e l'ottimizzazione di un [[kernel vanilla]] (e non solo) per applicazioni audio è la seguente: | Una guida completa sulla configurazione e l'ottimizzazione di un [[kernel vanilla]] (e non solo) per applicazioni audio è la seguente: | ||
Riga 33: | Riga 33: | ||
Se invece si vuole usare l'[http://people.redhat.com/mingo/realtime-preempt/ ultima patch] realtime-preemption (attualmente 2.6.15-rc5-rt2) bisogna usare anche l'[ftp://ftp.it.kernel.org/pub/linux/kernel/v2.6/testing/ ultimo kernel RC]. | Se invece si vuole usare l'[http://people.redhat.com/mingo/realtime-preempt/ ultima patch] realtime-preemption (attualmente 2.6.15-rc5-rt2) bisogna usare anche l'[ftp://ftp.it.kernel.org/pub/linux/kernel/v2.6/testing/ ultimo kernel RC]. | ||
Per passare da un kernel stabile ad un RC basta fare un < | Per passare da un kernel stabile ad un RC basta fare un <code>make oldconfig</code> in modo da configurare solo le nuove voci. Questo metodo "a due passi" permette di separare i problemi dovuti ad un eventuale errore di configurazione del kernel stabile dai problemi potenzialmente introdotti dall'uso di un kernel RC non stabile. | ||
= La patch realtime-preemption = | |||
L'archivio delle patch realtime-premption si trova a [http://people.redhat.com/mingo/realtime-preempt/ questo indirizzo]. La patch realtime-preemption usata di seguito (a puro titolo esemplificativo) è la 2.6.14-rc5-rt5, voi usate la versione più recente disponibile. La patch è un semplice file di testo. Il suo nome è del tipo < | L'archivio delle patch realtime-premption si trova a [http://people.redhat.com/mingo/realtime-preempt/ questo indirizzo]. La patch realtime-preemption usata di seguito (a puro titolo esemplificativo) è la 2.6.14-rc5-rt5, voi usate la versione più recente disponibile. La patch è un semplice file di testo. Il suo nome è del tipo <code>patch-''<kernel version>''-''<patch version>''</code>. Bisogna applicare la patch all'esatta versione del kernel indicata dal nome. Di seguito viene usata la [http://people.redhat.com/mingo/realtime-preempt/older/patch-2.6.14-rc5-rt5 versione rt5 applicata al kernel 2.6.14-rc5]. Tenete presente che nuove versioni della patch vengono rilasciate giornalmente. | ||
Per applicare la patch basta copiarla in < | Per applicare la patch basta copiarla in <code>/usr/src</code>, entrare della dir del kernel e lanciare il comando, nel mio esempio: | ||
<pre>$ cat ../patch-2.6.14-rc3-rt2 | patch -p1 -t</pre> | |||
A questo punto nuovamente un < | A questo punto nuovamente un <code>make oldconfg</code> ci permetterà di configurare le voci inserite dalla patch. Assicurarsi di scegliere '''Complete Preemption (Real-Time)''' in: | ||
<pre> | <pre> | ||
Riga 53: | Riga 53: | ||
Non ci resta che compilare il kernel: | Non ci resta che compilare il kernel: | ||
<pre>$ fakeroot make-kpkg --append-to-version -realtime --revision 0.1 kernel_image</pre> | |||
ed installare il pacchetto, per ulteriori informazioni su questo passaggio: [[Debian Kernel Howto]]. | ed installare il pacchetto, per ulteriori informazioni su questo passaggio: [[Debian Kernel Howto]]. | ||
= Modalità realtime e realtime scheduling = | |||
La modalità realtime è un particolare privilegio di esecuzione che un'applicazione può avere . Questa modalità permette ad una applicazione di avere accesso alla CPU con la massima priorità (rispetto ad ogni altra applicazione in attesa) ogni volta che venga richiesto, impedendo inoltre che un'altra applicazione possa a sua volta interrompere l'esecuzione (a meno che non sia anch'essa realtime). | La modalità realtime è un particolare privilegio di esecuzione che un'applicazione può avere . Questa modalità permette ad una applicazione di avere accesso alla CPU con la massima priorità (rispetto ad ogni altra applicazione in attesa) ogni volta che venga richiesto, impedendo inoltre che un'altra applicazione possa a sua volta interrompere l'esecuzione (a meno che non sia anch'essa realtime). | ||
Riga 64: | Riga 64: | ||
Questo permette di tenere in esecuzione applicazioni a bassa latenza, senza il rischio che altre applicazioni non-realtime possano disturbarle. Si capisce come questa modalità sia importantissima nelle applicazioni audio professionali (ad esempio una sessione di registrazione non verrà mai interrotta anche se molte applicazioni non realtime saturano la CPU!). | Questo permette di tenere in esecuzione applicazioni a bassa latenza, senza il rischio che altre applicazioni non-realtime possano disturbarle. Si capisce come questa modalità sia importantissima nelle applicazioni audio professionali (ad esempio una sessione di registrazione non verrà mai interrotta anche se molte applicazioni non realtime saturano la CPU!). | ||
D'altro canto, questa modalità | D'altro canto, questa modalità pone dei seri problemi di sicurezza dato che un'applicazione potrebbe (a causa di un errore o di un comportamento malevolo) occupare la CPU per un tempo indefinito, senza poter essere interrotta, impedendo dunque la normale applicazione degli altri programmi. | ||
Normalmente, quindi, solo root ha i privilegi per lanciare applicazioni in modalità realtime. Questo è un problema, dato che (ad esempio) Jack e tutte le applicazioni che vi si connettono dovrebbero essere lanciate da root per poter funzionare in modalità realtime, e questo costituirebbe un ancor più grosso problema di sicurezza. | Normalmente, quindi, solo root ha i privilegi per lanciare applicazioni in modalità realtime. Questo è un problema, dato che (ad esempio) Jack e tutte le applicazioni che vi si connettono dovrebbero essere lanciate da root per poter funzionare in modalità realtime, e questo costituirebbe un ancor più grosso problema di sicurezza. | ||
Riga 70: | Riga 70: | ||
Per risolvere il problema bisogna consentire l'uso della modalità realtime anche a normali utenti ma in maniera "controllata". | Per risolvere il problema bisogna consentire l'uso della modalità realtime anche a normali utenti ma in maniera "controllata". | ||
Il modo più semplice consiste nell'usare gli '''rlimits''', ovvero editare il file < | Il modo più semplice consiste nell'usare gli '''rlimits''', ovvero editare il file <code>/etc/security/limits.conf</code> per consentire ad un utente od ad un gruppo di eseguire applicazioni in modalità realtime. Questo metodo ormai è pienamente supportato da Debian Etch (''stabile'') in poi. | ||
Un secondo metodo ormai obsoleto consiste nell'usare un modulo del kernel chiamato < | Un secondo metodo ormai obsoleto consiste nell'usare un modulo del kernel chiamato <code>realtime-lsm</code>. Questa procedura è più lunga e può creare problemi di sicurezza. | ||
Entrambi gli approcci possono essere usati sia con kernel vanilla che con kernel realtime-preemption. | Entrambi gli approcci possono essere usati sia con kernel vanilla che con kernel realtime-preemption. | ||
== Usare gli rlimits == | |||
È presente nel kernel un nuovo meccanismo più sicuro per concedere i privilegi di realtime chiamato rlimits. Rlimits sostituisce completamente il vecchio e insicuro modulo <code>realtime-lsm</code>. | |||
Gli rlimits sono supportati da PAM dalla versione 0.80, le versioni precedenti richiedono una patch. | Gli rlimits sono supportati da PAM dalla versione 0.80, le versioni precedenti richiedono una patch. | ||
Fortunatamente la versione di PAM in Debian Etch, pur essendo una 0.79, include la già questa patch. Per la [[oldstable]] Sarge la patch deve essere applicata manualmente (vedi dopo). | Fortunatamente la versione di PAM in Debian Etch, pur essendo una 0.79, include la già questa patch. Per la [[oldstable]] Sarge la patch deve essere applicata manualmente (vedi dopo). | ||
Quindi l'unica cosa da in Debian | Quindi l'unica cosa da fare in Debian per abilitare il gruppo '''<code>audio</code>''' all'esecuzione di processi in modalità realtime è aggiungere al file <code>/etc/security/limits.con</code> le seguenti righe: | ||
@audio - nice -10 | @audio - nice -10 | ||
Riga 93: | Riga 93: | ||
Potete controllare che gli rlimits siano settati correttamente lanciando jack: | Potete controllare che gli rlimits siano settati correttamente lanciando jack: | ||
<pre> $ jackd -R -d alsa -S</pre> | |||
In caso di problemi con la modalità realtime si vedranno messaggi del tipo: | In caso di problemi con la modalità realtime si vedranno messaggi del tipo: | ||
Riga 102: | Riga 102: | ||
'''Nota''': Per la [[oldstable]] '''Debian Sarge''' si può installare il pacchetto PAM patchato installando <tt>libpam-modules</tt> da [http://techweb.rfa.org/debrfa/dists/sarge/main/binary-i386/ qui]. | '''Nota''': Per la [[oldstable]] '''Debian Sarge''' si può installare il pacchetto PAM patchato installando <tt>libpam-modules</tt> da [http://techweb.rfa.org/debrfa/dists/sarge/main/binary-i386/ qui]. | ||
== Il modulo <code>realtime-lsm</code> == | |||
{{Warningbox|Questa procedura è obsoleta e non è più stata verificata da quando Etch è diventata stabile ed ha incluso il supporto nativo per gli rlimits. | {{Warningbox|Questa procedura è obsoleta e non è più stata verificata da quando Etch è diventata stabile ed ha incluso il supporto nativo per gli rlimits. È lasciata solo per motivi storici e didattici.}} | ||
Il modulo <code>realtime-lsm</code> permette ad un normale utente inserito nel gruppo <code>audio</code> di eseguire applicazioni in modalità realtime. Questo è il vecchio approccio, che verrà man mano sostituito nelle varie distro dall'uso degli rlimits (vedi oltre). | Il modulo <code>realtime-lsm</code> permette ad un normale utente inserito nel gruppo <code>audio</code> di eseguire applicazioni in modalità realtime. Questo è il vecchio approccio, che verrà man mano sostituito nelle varie distro dall'uso degli rlimits (vedi oltre). | ||
Su | Su Debian l'installazione del modulo è molto semplice: basta installare il pacchetto <code>realtime-lsm-source</code> ed usare <code>[[Pagina di manuale di module-assistant|module-assistant]]</code> per compilare e pacchettizzare il modulo. | ||
In pratica, dopo aver fatto il boot del kernel per il quale si vuole installare il modulo, (e aver installato <code>realtime-lsm-source</code>) basta il seguente comando: | In pratica, dopo aver fatto il boot del kernel per il quale si vuole installare il modulo, (e aver installato <code>realtime-lsm-source</code>) basta il seguente comando: | ||
<pre>$ m-a build realtime-lsm</pre> | |||
per compilare e creare un pacchetto per il modulo. A questo punto non ci resta che installare il pacchetto <code>realtime-lsm</code> creato. | per compilare e creare un pacchetto per il modulo. A questo punto non ci resta che installare il pacchetto <code>realtime-lsm</code> creato. | ||
Riga 125: | Riga 125: | ||
''(l'ultima voce deve necessariamente essere un modulo!)'' | ''(l'ultima voce deve necessariamente essere un modulo!)'' | ||
Nei recenti kernel binari di Etch le | Nei recenti kernel binari di Etch le precedenti condizioni non sono soddisfatte, per cui il modulo '''realtime-lsm''' non funzionerà con tali kernel. Inoltre il modulo realtime-lsm è ormai ufficialmente deprecato in Debian Etch. | ||
In questi casi bisognerà ricompilare il kernel oppure usare l'approccio tramite rlimits. | In questi casi bisognerà ricompilare il kernel oppure usare l'approccio tramite rlimits. | ||
= Conclusioni = | |||
Con un kernel così ottimizzato si raggiungono prestazioni realtime davvero spinte. Io ad esempio, con una modestissima SB Audigy 1 posso fare partire jack a 32 frame x 2 periodi @ 48000Hz (latenza 1.3 ms!) in modalità solo playback. Qualche xrun avviene ancora a latenze così basse se si eseguono altre operazioni sulla macchina. Per avere la massima affidabilità in full-duplex utilizzo usualmente jack a 128x2 @ 48000Hz. | Con un kernel così ottimizzato si raggiungono prestazioni realtime davvero spinte. Io ad esempio, con una modestissima SB Audigy 1 posso fare partire jack a 32 frame x 2 periodi @ 48000Hz (latenza 1.3 ms!) in modalità solo playback. Qualche xrun avviene ancora a latenze così basse se si eseguono altre operazioni sulla macchina. Per avere la massima affidabilità in full-duplex utilizzo usualmente jack a 128x2 @ 48000Hz. | ||
Riga 136: | Riga 136: | ||
Happy Debian! | Happy Debian! | ||
= Links = | |||
* http://www.emillo.net/home | * http://www.emillo.net/home |
contributi