Non chiamateli solo videogiochi!
“È solo un videogioco”, qualcuno potrebbe sentenziare, ma dall’installazione di un videogioco non nativo è possibile imparare/ripassare molti aspetti riguardanti GNU/Linux. Nel seguito, infatti, verrà indicata una procedura neanche tanto semplice per poter giocare con titoli nativi per Microsoft Windows.
Ecco levarsi in lontananza: “Ma c’è WINE per questo, oltremodo non sempre è dato funzionante con i vari titoli!”. Vero, ma quanto riportato nel seguito è una piattaforma che si aggancia si a WINE ma in una modalità più studiata, offrendo pacchetti ottimizzati in maniera più specifica per poter funzionare al meglio con ogni singolo titolo supportato.
A tal proposito occorre ricordare che esiste anche il progetto Proton che permette di migliorare il livello di compatibilità per i giochi sviluppati per Microsoft Windows da eseguire su sistema operativo GNU/Linux. Proton è sviluppato dalla Valve Software, la stessa software house che ha realizzato il client Steam, di fatto è un fork di WINE con l’aggiunta di patch e librerie che permettono di migliorarne prestazioni e compatibilità con i giochi non nativi. Il progetto Proton è presente su GitHub e rilasciato con un “misto” di licenze.
Nel seguito, invece, verrà presentato il software Lutris, una piattaforma open source sviluppata in Python che permetterà, agli interessati in ambito videoludico, di ampliare notevolmente la libreria dei giochi a disposizione. Utilizzando, infatti, una singola interfaccia si potranno gestire dai vecchi giochi in ambiente DOS fino ai più moderni di categoria AAA/AAA+ utilizzando specifici “motori” sebbene, a differenza di quanto si possa essere indotti a pensare, ancora non è sufficiente un solo click per poterli installare. La versione in uso al momento di scrivere è la 0.5.7.1.
Sarà proprio la combinazione tra Lutris – con tutti i suoi runner, si capirà tra breve cosa sono – il progetto Proton e l’integrazione con piattaforme on-line (e.g. Steam e GOG) che sarà possibile far funzionare un importante numero di videogiochi rilasciati tipicamente solo per Microsoft Windows, si perché ciò che non è dato funzionante con Proton funziona a meraviglia con Lutris il quale sembra avere una marcia in più rispetto al concorrente proprietario. Una dimostrazione di tale affermazione la si darà nel seguito con l’installazione del titolo Warframe solo per il quale vale la pena la prova e l’installazione di Lutris! Così come un certo numero di persone appassionate di videogiochi, ma che usano esclusivamente il pinguino, installano Lutris solo per giocare a Overwatch!
Prima di procedere è utile sapere che tutte la prove sono state condotte utilizzando la distribuzione Linux Mint Cinnamon 20.0 su un portatile entry-level vecchio di 5 anni, nello specifico un HP 255 G4 con in dotazione 4GB di memoria RAM ed equipaggiato con una scheda grafica ATI HD8250M (Radeon R2): il driver (modulo del kernel) utilizzato è la versione open source amdgpu il cui sviluppo è iniziato in tempi piuttosto recenti (primo semestre 2015!). L’impiego, per la prova, di un portatile di fascia bassa non è da ritenersi un fattore negativo, anzi, vista l’entità del motore grafico che muove il gioco – il proprietario Evolution, con notevoli capacità grafiche, sviluppato dalla software house Canadese Digital Extremes la stessa che ha sviluppato e pubblicato Warframe nel 2013 – fa capire il motivo di alcune scelte alla base degli argomenti che verranno trattati nel seguito.
Come installare Lutris
Nel seguito verranno portate in “parallelo” l’installazione di Lutris, del titolo Warframe unitamente alla spiegazione di qualche terminologia che si incontrerà durante queste fasi e alle quali si potrebbe non essere avvezzi. Al termine si passeranno in rassegna alcune caratteristiche e potenzialità di Lutris. Si inizi con l’aggiungere i pacchetti per l’architettura x86 a 32 bit con il comando
sudo dpkg --add-architecture i386
seguito dal solito aggiornamento del database (sudo apt-get update). Questa installazione si rende necessaria poiché il launcher di Warframe è a 32 bit (!) sebbene il gioco sia disponibile solo per piattaforme a 64 bit come Microsoft Windows, PS4, Xbox e Nintendo Switch.
A questo punto si possono installare i pacchetti necessari a far funzionare l’installer e il comparto grafico per il quale, per macchine con GPU AMD/ATI, occorre installare il supporto alle API Vulkan utilizzando il comando:
sudo apt install libgl1-mesa-dri:i386 mesa-vulkan-drivers vulkan-tools vulkan-utils mesa-vulkan-drivers:i386
Coloro i quali dovessero essere in possesso di macchine con GPU nVIDIA possono fare riferimento al documento InstallingDrivers.md per installare i driver e i pacchetti appropriati all’abilitazione di Vulkan.
Primo pit-stop: cos’è Vulkan?!
Il progetto Vulkan è il frutto di un regalo fatto all’associazione Khronos Group (la stessa associazione che, tra le altre cose, sviluppa le OpenGL) ad opera di AMD con il progetto Mantle.
All’atto pratico sono delle API (Application Programming Interface) a basso livello che permettono di interfacciarsi direttamente con l’hardware del comparto video (nello specifico con le funzioni supportate dalla scheda grafica) controllando così in maniera più puntuale e specifica l’accelerazione grafica e l’efficienza della GPU (Graphics Processing Unit) riducendo così il carico sul microprocessore (CPU) e migliorando di riflesso le performance del sistema.
Interessante a tal proposito il seguente video dimostrativo Vulkan vs OpenGL che fa intuire il motivo in base al quale anche con un portatile entry-level si riesce a far girare un titolo non proprio parsimonioso in termini di risorse (naturalmente sempre entro certi limiti, nessun miracolo!)
Va da se che la scheda grafica che equipaggia la macchina in uso dovrà supportare Vulkan e ciò è possibile con il seguente elenco di schede AMD/ATI e il seguente gruppo di schede nVIDIA o per un elenco dettagliato per produttori cliccando su show per aprire la tabella.
Inizialmente sviluppato e pensato per sostituire le OpenGL, oggi Vulkan viaggia su un percorso parallelo alle OpenGL. L’intenzione dell’associazione Khronos Group è di incorporare in Vulkan anche le OpenCL note librerie utilizzate per la parallelizzazione dei compiti, il calcolo parallelo sfruttando gli svariati core che costituiscono, ad esempio, le moderne GPU ma non solo. Ad oggi già un certo numero di programmi offrono supporto nativo alle librerie OpenCL, programmi come Gimp, Maya (rilasciato anche per GNU/Linux!), la suite audio/video FFmpeg, il codec x264, Libreoffice Calc e molti altri.
Riprendere l’installazione
Terminato il primo giro di installazioni si procede con l’aggiunta del repositorio di Lutris:
sudo add-apt-repository ppa:lutris-team/lutris
seguito dal solito aggiornamento della lista dei repository installati:
sudo apt-get update
Qualora venissero segnalati aggiornamenti dei pacchetti si proceda alla loro installazione e solo a questo punto è possibile installare Lutris:
sudo apt-get install lutris
il quale, tra le varie dipendenze, si porterà dietro anche la versione di default di WINE. Al termine è possibile lanciare il software dal menù generale per vedere dopo una manciata di secondi la sua interfaccia grafica (immagine di inizio paragrafo).
Per installare un titolo si possono seguire due strade. Ad esempio è sufficiente effettuare la ricerca direttamente nell’interfaccia di Lutris cliccando sull’icona in alto a destra recante una lente di ingrandimento e nel rigo di ricerca a comparsa digitare il nome del gioco, ad esempio Warframe, e cliccando subito a fianco sul pulsante Search Lutris.net. Inizierà la ricerca del titolo nel database presente su Lutris.net e, se il titolo è tra i giochi supportati, dopo qualche secondo lo si dovrebbe vedere apparire nel pannello centrale di Lutris. A questo punto selezionando il titolo, nel pannello di destra verranno evidenziate alcune voci, tra le quali il pulsante Install cliccando sul quale apparirà una finestra di pop-up nella quale si potrà scegliere cosa utilizzare per lanciare il gioco, ovvero se la versione ottimizzata di WINE gestita da Lutris oppure Proton di Steam.
Essendo Warframe dato per funzionante senza alcun problema con Lutris utilizzeremo la versione standalone cliccando sul pulsante Install.
Verrà chiesto il percorso di installazione che di default è in home/nome_utente/Games/Warframe: non occorre fare nulla, tale percorso se non esistente verrà creato e se non si hanno particolari esigenze, ad esempio di multipli hard disk dedicati, il suddetto percorso va più che bene. Click sul pulsante Install per far partire la dinamica di installazione.
Verrà scaricato e installato – nel percorso indicato – una versione idonea di WINE – la 5.7.8-lutris al momento di scrivere – seguito dal download dei dati di gioco. Contemporaneamente partirà la configurazione della versione di WINE che dovrà lanciare il gioco ovvero della versione 5.7.8-lutris installata nel percorso di gioco (e non quella installata nella distribuzione!). Alla richiesta di pop-up di installare wine-mono in WINE 5.7.8-lutris, cliccare su Installa. Idem alla richiesta di installare il pacchetto Gecko. Ripetere l’operazione in caso di nuova richiesta.
A questo punto in automatico verrà lanciato l’installer di Warframe con la richiesta di installazione – in stile Microsoft Windows – nel percorso Games/warframe; click direttamente su OK senza cambiare nulla.
Dopo un controllo degli aggiornamenti sulla versione del launcher – in presenza del quale verrà scaricato, installato e lanciato nuovamente – si dovranno accettare le condizioni di gioco seguite dall’accettazione della licenza del gioco (ci si assicuri che sia selezionato Italiano nel menù in alto a destra). Al termine dell’accettazione della licenza partirà il download dei dati di gioco: sono ben oltre 30GB quindi ci si può mettere comodi e fare altro!
Va da se che si dovrà avere a disposizione una linea veloce (possibilmente fibra) senza limiti di tempo e/o volumi di traffico! Con una linea “mista” FTTC (Fiber to the Cabinet) da 30-100M occorrono mediamente circa 3 ore. Al termine del download ci sarà un controllo su nuovi contenuti e quando il pulsante GIOCA si attiva è possibile lanciare il gioco.
NOTA: Come riportato nella finestra di pop-up durante la fase di installazione, quando si attiva la scritta GIOCA non si deve lanciare il gioco, ma si chiude l’installer e si lancia il titolo da Lutris.
Il secondo metodo di installazione di un gioco si diversifica solo nei primi passi iniziali. Invece di lanciare Lutris, verrà utilizzato il sito del progetto nel quale dovrà essere inserito nel rigo di ricerca il titolo al quale si è interessati. Scelto il titolo optare per Install, ovvero il menù/pulsante presente subito sotto a destra dell’immagine principale. Nella pop-up a comparsa verrà chiesto con quale applicazione aprire il file: si scelga Lutris e cliccando su Apri link verrà richiamato Lutris il quale aprirà la pop-up di installazione vista nel passaggio precedente. A partire da questo punto l’installazione segue la stessa dinamica.
Informazioni e verifiche su Vulkan
Prima di lanciare il gioco e, se le risorse lo permettono durante la fase di attesa del termine del download, è possibile verificare se si è in grado di leggere tutte le caratteristiche di Vulkan perché dovrà ricevere informazioni dal layer DXVK (leggere oltre). La verifica è semplice, aprire un terminale e impartire il comando vulkaninfo. Se l’output fornirà un qualcosa del genere (vedere anche immagine sopra), tipico di macchine con schede grafiche AMD/ATI:
ERROR: [Loader Message] Code 0 : /usr/lib/i386-linux-gnu/libvulkan_intel.so: wrong ELF class: ELFCLASS32 ERROR: [Loader Message] Code 0 : /usr/lib/i386-linux-gnu/libvulkan_radeon.so: wrong ELF class: ELFCLASS32 /build/vulkan-UL09PJ/vulkan-1.2.131+dfsg1/demos/vulkaninfo.c:2700: failed with VK_ERROR_INITIALIZATION_FAILED
allora occorrerà rimediare al problema perché se si provasse a lanciare il gioco si riceverebbe il seguente messaggio di errore da Lutris:
Per risolvere è sufficiente editare il file /etc/default/grub, di preciso trovare la riga GRUB_CMDLINE_LINUX_DEFAULT e aggiungere su un un’unica riga, senza nessun a capo e senza cancellare ciò che potrebbe essere già presente:
radeon.si_support=0 radeon.cik_support=0 amdgpu.si_support=1 amdgpu.cik_support=1
Salvare il file così modificato e aggiornare la configurazione con sudo update-grub2. Riavviare la macchina (se nel frattempo il download è terminato altrimenti attenderne la fine!) e questa volta vulkainfo dovrebbe mostrare una lunga sequela di informazioni.
Ma ancora non è sufficiente, occorre assicurarsi che effettivamente le chiamate a Vulkan vengano eseguite, e quale modo migliore se non quello di lanciare delle demo appositamente dedicate? È possibile utilizzando alcuni test/demo integrati come vkcube o vkcubepp e vulkan-smoketest ad esempio in una finestra invece che a schermo intero (di default):
vulkan-smoketest --w 1152 --h 684
I risultati sono riportati in basso (le immagini is possono ingrandire cliccandoci sopra), nell’ordine da sinistra a destra vkcube, vkcubepp e vulkan-smoketest.
È inoltre possibile testare le performance lanciando il programma test Refresh2025_Linux. Dopo averlo scaricato in una cartella qualsiasi è sufficiente decomprimerlo e lanciare l’eseguibile Refresh2025.x86_64 per vedere apparire una pop-up di scelta sulla risoluzione da adottare, la qualità della grafica e se il tutto dovrà essere visualizzato a tutto schermo o in una finestra di dimensioni pari alla risoluzione scelta. Al termine, cliccando su OK in basso a destra, partirà l’animazione grafica che visualizzerà anche una serie di informazioni: in alto a sinistra il frame rate in tempo reale, il valore minimo e il valore medio. In basso a destra i tasti da utilizzarsi per interagire con il programma, di fatto aumentando o diminuendo il numero di oggetti presenti. In basso a sinistra le caratteristiche del computer dove viene lanciato. Poiché un’immagine non rende l’idea dell’animazione, nel video in basso il test in esecuzione:
Fermi tutti! cos’è DXVK?!
Se con il client Steam si è ampliato il ventaglio di titoli disponibili per GNU/Linux, è la creazione di progetti come DXVK e Vulkan accoppiati a WINE che hanno, per certi versi, rivoluzionato un po’ tutto il panorama.
I giochi sviluppati per Microsoft Windows fanno uso – seppure in maniera non esclusiva – dell’applicazione DirectX che di fatto sono caratterizzate da un certo numero di pacchetti e nello specifico, per la parte grafica, dalle Direct3D una sorta di “OpenGL” di proprietà Microsoft. Quando viene lanciato un gioco sviluppato attorno alle DirectX, il gioco stesso fa continue chiamate alle API DirectX (Direct3D per la grafica, ma ve ne sono altre come le DirectInput per la gestione dei sistemi di immissione, DirectPlay per i giochi on-line, DirectSound per riproduzione e registrazione di effetti sonori e diversi altri componenti). Poiché non esiste nessun pacchetto DirectX per GNU/Linux come si fa a intercettare le chiamate del gioco, ricostruirne la grafica ed effettuare il rendering delle scene?
E qui che interviene DXVK un livello di implementazione delle DirectX, di fatto una libreria che converte le chiamate D3D (Direct3D di DirectX) verso le API Vulkan a runtime (durante l’esecuzione, in tempo reale). Poiché, come già riportato, non c’è alcun pacchetto DirectX da installare su GNU/Linux (sono API Microsoft, che funzionano su Microsoft Windows e Xbox), occorre usare questo tipo di conversioni per poter lanciare e quindi giocare con titoli sviluppati attorno alle DirectX nel momento in cui non si riesce ad ottenere un port di essi.
DXVK, quindi, fornisce le API per le Direct3D in particolare per le versioni 9, 10 e 11 sebbene per queste ultime il supporto ancora non risulta essere completo. Ad ogni nuovo rilascio viene ottimizzato il supporto per diversi titoli via via che migliora il supporto alla versione 11 e vengono corretti gli inevitabili bug e problemi per le versioni 9 e 10.
Naturalmente ogni volta che si aggiunge un livello software rispetto ad una soluzione nativa, qualche cosa si perde in termini di performance; interessanti, in tal senso, i confronti DXVK vs Native ad esempio nel titolo Rise in the Tomb Raider, sebbene nel 2018 sia stato rilasciato anche per GNU/Linux ad esempio utilizzando il client Steam.
o nelle spettacolari immagini realistiche di ARK: Survival Evolved:
Interessanti anche i confronti tra 2 soluzioni di traslazione API con 2 soluzioni native
Le performance, ad ogni nuovo rilascio, migliorano avvicinandosi mediamente alla soluzione nativa che in alcuni casi viene anche eguagliata come è facile verificare nel video precedente relativo al titolo Resident Evil 2 Remake.
Un possibile terzo pit-stop?! Si, causa limiti su risorse!
Molte distribuzioni GNU/Linux vuol dire molte scelte, ma molte scelte implica dire anche che ogni distribuzione ha, tra le altre cose, il proprio modo di gestire le risorse. In alcuni casi al lancio di un gioco Lutris potrebbe segnalare il problema di “Limiti non impostati correttamente”. A cosa si riferisce un apparente criptico messaggio del genere?
Il kernel Linux offre la possibilità di poter impostare per i processi una serie di limiti sulle risorse che poi dovranno essere utilizzate. I suddetti limiti possono essere impostati solo all’interno del singolo processo utilizzando le funzioni getrlimit() e setrlimit() dichiarate nell’header sys/resource.h unitamente a macro e costanti simboliche. Va da se come tali limiti vengano ereditati nella creazione di eventuali processi figli.
I limiti possono avere due valori possibili: un soft limit e un hard limit. L’hard limit è il valore massimo superiore del soft limit. Una volta impostati sarà il kernel che dovrà assicurare che un processo non possa utilizzare valori superiori a quelli impostati e qualora ciò dovesse accadere generare un errore che poi verrà visualizzato dall’interfaccia grafica (se presente) del programma che tenta di utilizzare maggiori risorse rispetto a quelle consentite. L’utente ordinario può assegnarsi i limiti sia soft che hard ricordando, ovviamente, che il valore del limite soft non potrà mai essere superiore al valore del limite hard. Inoltre impostato un valore del limite hard, l’utente “normale” non potrà mai aumentare quel valore, ma solo diminuirlo. Per aumentare il limite hard di un utente occorre l’intervento dell’amministratore di sistema (utente amministratore). L’uso dei limiti evita comportamenti poco consoni ad opera di terzi, comportamenti con l’obiettivo di generare disservizi. Tipico esempio le cosiddette fork bomb che lanciano un numero sempre più elevato di processi fino ad esaurire una risorsa, tipicamente la RAM ma può essere anche la capacità del microprocessore di gestire un numero indefinito di servizi.
Questo è quello che c’è dietro quando e se Lutris dovesse visualizzare la finestra con il messaggio di cui sopra.
Dalla shell è possibile controllare i limiti sulle risorse attarverso l’uso del comando interno – bash built-in – ulimit (man ulimit per approfondimenti, sezione BASH BUILTIN COMMANDS). La situazione corrente dei limiti soft la si può visualizzare utilizzando ulimit -a mentre con ulimit -Ha vengono visualizzati i limiti hard (alcuni dei quali hanno il medesimo valore di alcuni limiti soft). Per modificare i valori, e affinché siano validi per tutti gli utenti, occorre intervenire su specifici file di configurazione. Le modifiche sono semplici e sono riportate nel paragrafo How to make your system ready for Esync.
Warframe finalmente!
Terminata la lunga sequela di informazioni è tempo di passare al lancio di Warframe, se nel frattempo il download è terminato! Se si, chiudere l’installer e lanciare il gioco da Lutris; è sufficiente selezionare il titolo e dal pannello di destra cliccare su Play ed ecco che nel giro di qualche secondo, dopo la verifica di possibili aggiornamenti, aprirsi la finestra di login.
Per giocare a Warframe è necessario aprire un account sul sito ufficiale. Qualora non lo si avesse lo si può creare in un paio di minuti selezionando PC e procedendo all’inserimento dei dati richiesti dalla form. Questo perché la prima finestra di interazione con il gioco sarà proprio il login (immagine in basso): ad ogni modo cliccando su Iscriviti verrà aperto il browser predefinito per procedere alla registrazione di un account.
In basso una piccola galleria di immagini, screenshsot scattati durante la prova del gioco che non ha mostrato alcun problema né di fluidità tanto meno di crash e blocchi vari. Ogni singola immagine si può ingrandire cliccandoci sopra e scorrendo con l’apposito pulsante la galleria. Naturalmente l’obiettivo non è insegnare come giocare a Warframe, quello lo può fare ognuno di noi con un po’ di pratica. L’importante è capire la dinamica che c’è dietro la GUI (Graphical User Interface) di Lutris, non fermarsi solo all’apparenza perché questo fa la differenza tra installare con un solo click e capire come operare in caso di problemi.
Configurazione e Runner
Prima di vedere un minimo di proprietà una domanda è d’uopo: cosa sono i Runner? I Runner sono i back-end, i motori della piattaforma Lutris la cui interfaccia grafica ne è il front-end. Quei motori che permettono ad un titolo di essere lanciato e funzionare (possibilmente con pochi o nessun problema). Uno di questi Runner è WINE, ma Lutris li può gestire praticamente tutti come l’emulatore Atari 400, 800, XL Atari800, l’emulatore MS-DOS DOSBox così come l’emulatore dei giochi da bar MAME e molti altri riportati in rigoroso ordine alfabetico cliccando sull’icona ruota dentata nel rigo Runners in alto a sinistra di Lutris. Le ROM per i vari titoli MAME, Retroarch ecc è possibile scaricarle online.
Da questa finestra è possibile installare anche un Runner, ad esempio se si vuole installare MAME è sufficiente cliccare sul pulsante recante un’icona verde Install Runner e attendere la fine dell’installazione al termine della quale il pulsante muterà in Configure Runner per impostarne le varie proprietà (se non si hanno esigenze specifiche quelle di default vanno sempre più che bene). Se invece esistono diverse versioni del Runner, come accade ad esempio per WINE, si avrà un terzo pulsante Manage Versions che mostrerà le versioni installate (immagine a lato). La rimozione di un Runner, vuoi perché lo si vuole sostituire con un’altra versione vuoi perché non si è più interessati, è piuttosto banale: è sufficiente cliccare sul pulsante rosso recante un bidone!
Una volta installato un titolo, cliccando su di esso con il tasto destro apparirà un menù contestuale dal quale è possibile optare per svariate voci, le stesse voci che si trovano sul pannello di destra selezionando il titolo; agli interessati la scelta di optare per l’uno o l’altro metodo. Tra queste voci quella che è di maggiore interesse in questo contesto è Configure la cui finestra è caratterizzata da 4 schede (riportate nella galleria in basso). Il tab Game info riassume il titolo: il nome del gioco, l’anno del suo rilascio e il runner in uso. In Game options informazioni come il percorso dell’eseguibile e l’architettura. Molto interessante è il tab Runner options poiché illustra l’attuale situazione per il runner che “muove” il gioco (Warframe nello specifico). Si può verificare la versione di WINE, la versione di DXVK, l’abilitazione a Esync ed eventualmente a Fsync (leggere oltre) e tutta una serie di parametri. Infine in System options si hanno parametri a più “ampio psterro” e che riguardano il sistema come la disabilitazione degli effetti desktop, migliorare la risposta del server audio Pulseaudio riducendone la latenza e un’altra lunga serie di voci base e avanzate.
Esync e Futex
Termini incontrati nel tab Runner options nella configurazione specifica di un gioco.
Fondamentalmente Esync sostituisce le chiamate di winerserver con chiamate a descrittori di file nella notifica degli eventi. In quetso modo Esync fornisce strutture più leggere per la sincronizzazione dei thread (e.g eventi, semafori e mutex) in modo che il codice del gioco che li utilizza in maniera continuativa giri più velocemente (man 2 eventfd per approfondimenti). Questa apparente semplice sostituzione permette di ridurre in maniera sensibile il carico di wineserver sul sistema soprattutto per quei programmi (giochi in questo contesto) che utilizzano tutti i core della CPU. In alcuni casi sono state segnalate riduzioni di carico scendere dall’80% fino al di sotto del 10% guadagnando così svariati FPS nell’esecuzione del gioco. L’abilitazione di Esync, in funzione dei limiti sulle risorse impostati dalla distribuzione in uso, potrebbe far apparire il messaggio di cui è stato già dibattuto in un paragrafo precedente e al quale si rimanda qualora si dovesse incorrere nel problema quando si lancia un titolo.
Discorso più complicato per i Futex (Fast Userspace muTEX). Per darne una definizione di masima occorre partire dai Mutex (contrazione di MUTual EXclusion), primitive fornite dal sistema operativo per permettere la sincronizzazione tra processi/thread. I Mutex possono essere visti come dei semafori binari nei quali un valore 0 indica che la risorsa occupata e un valore 1 che la risorsa è libera. Un Mutex è necessario alla protezione delle sezioni o corse critiche (Race condition). Si immagini a un Mutex come una sorta di porta con serratura: il thread che ha accesso alla stanza chiude a chiave e vi rimane fino a che non ha terminato il proprio compito lasciando tutti gli altri in attesa fuori dalla porta. Terminato il compito viene fatto entrare il thread successivo nella lista il quale di nuovo si chiuderà a chiave fino a che non ha teminato il suo compito con tutti gli altri ad aspettare fuori dalla porta, e così via a seguire.
Riassumendo un Mutex fornisce l’esclusione reciproca alla risorsa avendo un’area di memoria dedicata che può alternare al livello atomico tra bloccato e sbloccato. La memoria risiede nello spazio utente ma la commutazione avviene per mezzo di una syscall (chiamata di sistema) all’interno del kernel rendendo la dinamica abbastanza convoluta e, per certi versi, “pesante”. La syscall in questo scenario è indispensabile perché il kernel, tra le altre cose, deve pianificare i thread nella coda di attesa.
Il Futex non segue, ovviamente, la stessa dinamica dei Mutex. I Futex – autore tal Rusty Russel nel lontano 2002 – forniscono, in parole povere, una tecnica di coda di attesa accessibile nello spazio utente riducendo il numero di chiamate di sistema e con esse i cambi di contesto, sempre piuttosto dispendiosi in termini di risorse. Questo si riflette sulle performance del sistema permettendo di guadagnare qualche FPS durante l’esecuzione di un gioco. Interessante, in tal senso, la seguente video dimostrazione Esync vs Fsync.
Per rendersi conto del numero di cambi di contesto totali è possibile utilizzare svariati comandi, il più semplice e intuitivo è vmstat -s dove al rigo CPU context switches da il numero di cambi di contesto avvenuti dall’accensione del PC. In funzione del carico della macchina si possono avere fino a diverse migliaia di cambi di contesto al secondo. Volendo effettuare un calcolo di massima è possibile digitare le seguenti righe script shell in un file che potrà essere chiamato con qualsiasi nome, e.g. test.sh:
vmstat -s | grep "CPU context switches" sleep 1 vmstat -s | grep "CPU context switches"
Lanciando lo script in un terminale, dopo averlo reso eseguibile, si avrà un output del tipo:
126115131 CPU context switches 126118266 CPU context switches
La differenza tra il valore della seconda lettura e il valore della prima lettura fornisce sostanzialmente il numero di cambi di contesto avvenuti in 1 secondo. Nell’esempio (reale!) riportato si sono avuti 3.135 context switch in 1 secondo, in quel secondo sotto le condizioni di carico relative a quel secondo. Considerando che in linea di massima un cambio di contesto può prendere un tempo che varia come ordine di grandezza da 10^-6 secondi (da qualche microsecondo) fino all’ordine dei 10^-5 secondi (decine di microsecondi o più), ipotizzando per far conto pari che ogni cambio di contesto prenda 10 microsecondi, allora ecco che in quel secondo di misura la CPU ha utilizzato 3.135×0,00001=0,03135 secondi, ovvero 31,35ms solo per cambiare di contesto ai vari processi/thread. È evidente allora come riducendo questo carico la CPU ha più tempo da dedicare all’esecuzione di processi/thread e non al loro cambio di contesto.
Non tutte le distribuzioni forniscono la patch del kernel per poter attivare Fsync e quando ci si prova senza averne il supporto questo è ciò che viene restituito:
Se si dispone di una macchina dedicata per i giochi si può provare la patch Fsync, altrimenti ci si chieda se ne vale effettivamente la pena. Distribuzioni come Arch Linux la mettono a disposizione nei repository. La patch Fsync è utilizzata anche da Proton.