sabato 18 aprile 2015

Falsi miti (1): impedire la paginazione di kernel e driver aumenta le prestazioni di Windows

Questo è il primo di una serie di articoli sui falsi miti, credenze che nascono dall'errata comprensione o interpretazione dei meccanismi di funzionamento di Windows. Su decine di siti Web si riportano tweak basati su informazioni errate o fuorvianti e, come conseguenza, ci sono utenti convinti che esistano gruppi di impostazioni più o meno nascoste del registro di sistema che possono magicamente aumentare le prestazioni di Windows. Il primo mito che analizziamo è l'impostazione che impedisce la paginazione di kernel e driver allo scopo di aumentare le prestazioni: come vedemo la realtà è diversa.

Cos'è il kernel

Il kernel (nucleo) è la parte fondamentale di un sistema operativo, con il compito di fornire accesso all'hardware, gestire le richieste dei software traducendole in istruzioni per la CPU (microprocessore), e così via. Le parti basilari del kernel sono sempre attive in memoria RAM e non potrebbe essere altrimenti perché sono fondamentali per il funzionamento efficiente del sistema operativo.

L'equivoco

Nei sistemi Windows esistono alcune parti di kernel e driver (user-mode driver, kernel-mode driver e kernel-mode system) che, se necessario, possono essere paginate su disco, ad esempio per risparmiare RAM nei sistemi con poca memoria a bordo. Questa impostazione è controllata dalla chiave di registro
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\DisablePagingExecutive
Il valore predefinito di tale chiave è 0, ossia è permessa la paginazione.
Se la chiave viene impostata ad 1 verrà impedito a Windows di paginare porzioni di kernel, tuttavia questo non implica un aumento di prestazioni anzi, in certi casi può peggiorarle.

La paginazione in generale (e di parti di kernel/driver in particolare) avviene quando il sistema operativo ha bisogno di liberare memoria RAM; in tal caso parti applicazioni (o parti di kernel/driver) verranno spostate dalla RAM sul file di paginazione (o file di swap, impropriamente noto come "memoria virtuale"), mentre la RAM liberata verrà riassegnata alle applicazioni che ne hanno bisogno. Se Windows gira su un computer con molta RAM, la paginazione non avviene perché il sistema opeativo non ha bisogno di liberarla; viceversa, se il computer ha poco RAM, impedire la paginazioni di alcune parti di kernel/driver (che in quel momento non servono) costringerà Windows a paginare su disco proprio le applicazioni che in quel momento avrebbero bisogno di più RAM, peggiorando le prestazioni invece di migliorarle.

La ragione dell'equivoco è la cattiva comprensione del meccanismo di funzionamento della paginazione su disco: a causa della lentezza intrinseca degli HDD (hard-disk meccanici), ogni volta che si parla di paginazione (o di memoria virtuale o di file di swap) i fanatici delle prestazioni ritengono (erroneamente) che sia meglio disabilitare tutto ciò che la riguarda. È stato precisato molte volte dagli esperti di sistema che disabilitare il file di swap di Windows è controproducente (molte applicazioni rifiutano di avviarsi in sua assenza), eccetto che in alcuni casi, per esempio non si dovrebbe impostarlo su un SSD. L'unico modo di evitare (o ritardare) la paginazione è quello più semplice: bisogna espandere al massimo la RAM, non esiste nessuna impostazione segreta che possa rimediare alla scarsità di memoria.

Per quanto riguarda la paginazione di parti del kernel è stata fatta ancora più confusione, per cui è necessario fare ulteriori precisazioni:
  • la paginazione interessa solo una parte del kernel, in particolare quella nota come executive e solo le porzioni progettate per essere paginabili. Altre parti del kernel non sono influenzate dall'impostazione della sottochiave di registro precedentemente menzionata, per cui non verranno mai paginate in nessuna circostanza;
  • una porzione di kernel progettata per essere "paginabile" significa che in particolari circostanze può essere paginata, non che lo sarà sicuramente e, in ogni caso, sarebbe paginata solo se davvero necessario;
  • impostare la chiave al valore 1 non disabilita il file di paginazione/swap, per cui esistono impostazioni apposite;
  • nei sistemi con molta memoria a bordo la modifica della chiave non ha effetti pratici poiché l'abbondanza di RAM non fa entrare in azione la paginazione.
In parole povere, l'impostazione predefinita (0) della chiave in realtà è corretta. L'impostazione che impedisce la paginazione di kernel/driver (1) è stata pensata per sistemi server, dove sono in esecuzione poche applicazioni che hanno sempre a disposizione tutta la RAM necessaria (in tal caso modificare il comportamento predefinito di Windows ha senso).

Sui computer domestici, impedire la paginazione del kernel è utile solo in casi particolari:

la modifica della sottochiave per impedire in modo definitivo la paginazione di qualunque porzione di kernel è suggerita in presenza di SSD (per impedire alla radice scritture inutili sul dispositivo) oppure se il sistema operativo ha molta memoria RAM a disposizione. In ogni caso, difficilmente si noterà un aumento delle pretazioni.

Personalmente suggerisco di eseguire la modifica solo nei seguenti casi:
  • il computer ha un SSD,
  • oppure: il sistema operativo è Windows XP e sul computer è installato almeno 1 GiB di RAM (meglio 2 GiB), nonostante su molti siti web si riporti che siano sufficienti 512 MiB (installate un antivirus ed un firewall decenti e vedrete!),
  • oppure: il sistema operativo è Windows Vista/7/8/8.1 e sul computer sono installati almeno 4 GiB di RAM (meglio 8 GiB), nonostante su molti siti web si riporti che siano sufficienti 2 GiB.
Per modificare il comportamento predefinito di Windows occorre avviare il registro di configurazione:
  • Windows XP/Vista/7: premere il pulsante START>Esegui e digitare regedit
  • Windows 8 e 8.1: nella casella di ricerca digitare regedit e fare click sul risultato (regedit.exe)
Per apportare la modifica:
  • accedere nel registro alla sezione
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\
  • fare doppio click sulla sottochiave DisablePagingExecutive ed inserire il valore 1, premere il pulsante <OK>, chiudere il registro ed infine riavviare il sistema.
DisablePagingExecutive