MegaLab.it
Stampa Articolo
Aperiodico gratuito di informatica
 
20080829221358

Guida definitiva alla memoria virtuale

a cura di Zane
06/10/2006 - articolo
Trucchi & Suggerimenti - Ogni sorta di suggerimento è stato pubblicato riguardo questa importantissima funzionalità di Windows. Mettendo da parte le erronee credenze tanto diffuse, ecco qualche suggerimento ragionato.

Fra miti, leggende Rete e formule alchimistico-matematiche davvero opinabili, la regolazione ottimale della memoria virtuale sotto Windows è sempre stata oggetto di ogni sorta di discussione.

Con il presente articolo spero finalmente di poter fare definitivamente un po' di chiarezza: nel corso dell'articolo tenterò di fare il punto della situazione sulle notizie circolate fino ad ora, riflettere sul perché si tratta in molti casi di suggerimenti inesatti (o quantomeno obsoleti) e di fornire qualche spunto realmente utile per ottenere il meglio, ponderato in base alle tecnologie oggi disponibili e a numerose ore di ricerche ed esperimenti di ogni tipo.

Che cosa è la memoria virtuale

Il meccanismo della memoria virtuale (altresì chiamato swap (Windows 98/98SE/ME) oppure paging (Windows NT/2000/XP/2003) ed a sua volta implementato nei sistemi Windows con un file di swap oppure file di scambio è stato ideato per consentire al sistema operativo di poter utilizzare più memoria RAM di quanta effettivamente presente sulla macchina.

Volendo semplificare al massimo, questa funzionalità si appoggia al disco fisso per spostare fuori RAM i dati o programmi inattivi, consentendo al sistema operativo di caricare su richiesta dell'utente molti più programmi e dati di quelli che potrebbero fisicamente essere immagazzinati dalla memoria centrale.

Allo stesso modo, la macchina diventa in grado di eseguire un programma più grande di quanto non possa essere caricato in RAM, semplicemente appoggiando temporaneamente sul disco fisso la pozione di codice non inutilizzata.

Il problema però è di natura prestazionale: il disco fisso è estremamente più lento della memoria centrale, e la lettura/scrittura di dati richiede parecchio tempo. Ecco quindi che un uso intenso della memoria virtuale può rapidamente degradare le prestazioni del sistema.

Come regolarlo

La gestione del file di scambio, oggetto di questo articolo, è impostabile in alcune opzioni essenziali direttamente da Windows: per la procedura passo-passo rimando all'ottimo articolo "Modifichiamo il file di Swap di Windows".

Nel prosieguo darò per scontato che il lettore sappia regolare queste impostazioni.

La migliore ottimizzazione dello swap? Non usarlo..

.. o meglio, usarlo il meno possibile. Sebbene per come sia strutturato un personal computer (e Windows in particolare) non sia possibile disattivare la memoria virtuale (ad esempio, sulla macchina che sto usando per scrivere questo articolo sono montati 2 GB di RAM, ma in questo momento il sistema sta utilizzando comunque circa 400 MB di memoria virtuale) installare memoria addizionale limiterà sicuramente gli accessi al disco.

I vantaggi prestazioni sono considerevoli: i tempi per accedere ad un tradizionale disco fisso motorizzato a piatti rotanti sono infatti ordine di 1.000 volte maggiori di quelli necessari per accedere ai dati in memoria RAM...

Partizione diversa / disco fisso diverso

Una delle leggende metropolitane più diffuse in Rete riguardo la configurazione della memoria virtuale suggerisce di spostare il file di swap su una partizione diversa del disco. Si tratta però di una interpretazione sbagliata di un consiglio valido.

La raccomandazione corretta, per le motivazioni che mi accingo ad esporre, è di spostare il file di swap sul secondo disco fisso, qualora fosse presente, ma di mantenerlo sulla partizione di sistema in caso sulla macchina fosse installato un solo hard disk.

Spostando la memoria virtuale sul secondo disco infatti, possiamo sfruttare in parallelo le due testine di lettura/scrittura: mentre il primo disco accede ai file, il secondo può gestire la memoria virtuale, senza dover attendere la conclusione della prima operazione. In altre parole, si parallelizza il problema, mentre sfruttando un solo drive la seconda operazione non può iniziare fino a quando non sia terminata la prima.

Ad ulteriore riprova di quanto appena affermato, faccio notare che la guida all'ottimizzazione di Adobe Photoshop suggerisce di impostare la memoria virtuale e lo scratch disk del programma (una sorta di memoria virtuale riservata a Photoshop) su dischi fissi diversi: il motivo è esattamente quello di parallelizzare gli accessi ai due file. Talune versioni di Photoshop addirittura avvisano l'utente con una finestra di dialogo all'avvio del programma in caso questo suggerimento non sia rispettato..

Impostando la memoria virtuale su di una seconda partizione dello stesso disco invece, le prestazioni tendono a diminuire: la singola testina di lettura dovrebbe eseguire fisicamente grandi spostamenti fra la partizione che contiene il sistema operativo e quella in cui viene impostato lo swap. In caso invece si trovassero sulla stessa partizione, la distanza da coprire per lo spostamento è minore e quindi l'operazione è più veloce.

Lasciare un po' di swap su C:

Molti documenti e riflessioni trovati in Rete consigliano di lasciare sempre e comunque un piccolo file di swap (grande 2MB oppure 50MB a seconda delle fonti) sul disco C: , anche in caso il file di swap primario venga spostato sul secondo disco fisso.

Questa procedura viene consigliata per aggirare un (presunto?) baco di Windows: senza questo piccolo file il sistema operativo ignorerebbe del tutto l'indicazione di spostare lo swap sul secondo disco, e continuerebbe ad utilizzare lo spazio sulla partizione di sistema. Nei test che ho eseguito per preparare questo articolo non ho mai riscontrato questo inconveniente. Ad ogni modo, se per caso doveste riscontrare qualche incongruenza fra il comportamento del sistema operativo ed i valori da voi impostati tenete a mente questo suggerimento (e magari raccontatemi la vostra esperienza!).

Riassumendo

In linea di massima quindi, la scelta migliore è quella di impostare il file di swap su di un secondo disco fisso oppure di mantenerlo sulla partizione di sistema in caso sulla macchina fosse installato un solo hard disk. La scelta peggiore è invece quella di spostare la memoria virtuale sulla partizione secondaria del drive di sistema.

Se la differenza fra una configurazione a due dischi e quella ad un solo hard disk può essere tangibile in caso il sistema sia sotto sforzo, la differenza prestazionale fra lasciare lo swap sulla partizione di sistema e spostarlo sulla secondaria era significativa soprattutto nel passato, quando i dischi erano estremamente lenti: con i dischi fissi moderni, capaci di rotazioni di 7.200 giri al minuto e più, il tempo necessario per il posizionamento della testina è calato drasticamente, e con esso la differenza in termini di performance fra le due scelte.

E Linux allora?

Al contrario di Windows, Linux utilizza una partizione separata per gestire la memoria virtuale, anche in caso sia presente un solo disco. Sebbene questo possa sembrare in contraddizione con quanto appena affermato, è in realtà frutto di una strategia totalmente diversa per la gestione dello swap.

Mentre Windows utilizza un tradizionale, grosso file sullo stesso filesystem in cui vi sono anche dati e cartelle (si chiama pagefile.sys: potete vederlo attivando la visualizzazione dei file nascosti e di sistema), Linux utilizza un filesystem completamente diverso da quello utilizzato per il sistema operativo e i dati utente: lo scopo è chiaramente quello di sfruttare una disposizione diversa dei dati memorizzati su disco per poter sfruttare alcuni algoritmi più efficienti per accedere a questo particolarissimo file.

Come dire quindi, si perde un po' nello spostamento della testina, ma si guadagna nettamente di più nell'accesso ai dati.

Dimensione minima / dimensione massima

Windows consente di regolare due distinti parametri per la memoria virtuale: un valore minimo ed uno massimo. È estremamente importante ai fini di garantire la massima resa del sistema impostare entrambi i campi ad uno stesso valore.

In caso contrario infatti il sistema ridimensiona il file "al volo", a seconda delle esigenze: l'operazione però richiede una serie di accessi al disco davvero impegnativo, che riduce le prestazioni in modo tangibile. Impostando sempre lo stesso valore invece si evita questo problema.

Questa distinzione di valori è stata ereditata da Windows 95: a quei tempi infatti la capienza dei dischi fissi era estremamente ridotta (stiamo parlando di tagli tipici attorno a 2.1 GB!) e non era quindi pensabile poter preallocare uno spazio così significativo: la scelta è stata quindi quella di sacrificare le prestazioni velocistiche in favore di una migliore usabilità dello strumento.

Visti i già ricordati aumenti di capienza dei dischi, non mi stupirei davvero se nelle prossime versioni di Windows i campi memoria virtuale minima/massima venissero unificati in un valore solo...

Fatta chiarezza su alcuni aspetti della tecnologia, veniamo al punto cruciale del problema: le dimensioni.

Impostare le dimensioni

Parliamoci chiaro: i tanti documenti che tentano di suggerire formule matematiche di ogni sorta per impostare la dimensioni dello swap dimenticano sempre di dire una cosa fondamentale: più il file di memoria virtuale è grande meglio è. Al più lo spazio in eccesso non verrà utilizzato, ma se anche eccedete non avrete alcun peggioramento prestazionale!

L'unico svantaggio è che il file di scambio occupa spazio su disco: se questo era un problema cinque-sei anni fa, quando i dischi fissi erano ancora piuttosto costosi, oggi che il più piccolo disco acquistabile in negozio è da 80 o più gigabyte, a mio avviso la questione è decisamente meno importante.

I problemi si possono manifestare piuttosto in caso di sottodimensionamento: in tal caso, otterreste un messaggio di "memoria insufficiente" cercando di lanciare più programmi di quelli che potrebbero essere contenuti nello spazio memoria fisica + memoria virtuale.

Apro una piccola parentesi sul consiglio di "impostare lo swap ad 1,5/2,5 volte la quantità di memoria RAM installata": personalmente reputo questa formula una vera stupidaggine (nonostante sia ripresa anche da molti documenti autorevoli): anche sforzandomi non riesco proprio a capire secondo quale logica un sistema con 2 GB di RAM debba necessitare di un file di swap maggiore di uno con 256 MB. Le mie esperienze dimostrano, piuttosto, l'esatto contrario. Qualcuno ha azzardato motivi di trashing-prevention e quant'altro, ma sinceramente mi sembrano argomentazioni alquanto forzate...

In secondo luogo, ho potuto verificare mediante esperienze concrete maturate sotto Windows XP che superata una soglia variabile di 1 oppure 2 GB di RAM, le richieste di memoria virtuale si attestano su di un valore fisso indipendente dalla memoria centrale installata e determinato unicamente dall'utilizzo del sistema: nel mio caso ad esempio siamo attorno ai 300-400 MB, indipendentemente che stia sfruttando uno oppure due GB di memoria.

Quindi, senza voler perdere troppo tempo con tabelle e calcoli bizzarri, vi consiglio piuttosto di impostare una dimensione minima e massima coincidente e pari a 1,5 GB: sarà probabilmente un po' eccessiva, ma sicuramente non rimarrete senza memoria, né avrete problemi di ridimensionamento (vedi pagina precedente). E sinceramente dubito che 1,5 GB di spazio in più o in meno su 80GB o più a disposizione vi facciano la differenza..

Avete un disco fisso troppo piccolo o semplicemente non volete sprecare spazio inutilmente? Personalmente raccomando di utilizzare la metodologia appena descritta, ma se avete un po' di tempo libero e volete trovare la migliore dimensione possibile per il file di swap, nella prossima pagina vedremo come utilizzare gli strumenti idonei per ottimizzare al massimo.

Se proprio non volete impostare lo swap file ad una dimensione molto grande, prevenendo così tanti problemi ma consumando spazio su disco inutilmente, l'unico modo per scoprire quanto esteso debba essere il file di swap è quello di osservare il comportamento del sistema per qualche tempo, e registrare la quantità di memoria virtuale utilizzata. Spiacente, niente formulette matematiche di dubbia utilità: bisogna lavorare un po' con strumenti di rilevazione ed analisi su ogni singola macchina.

Per prima cosa impostate la quantità di memoria virtuale ad un valore estremamente grande (diciamo perlomeno 2GB): in questo modo le statistiche di utilizzo non saranno limitate da una impostazione troppo restrittiva.

Portatevi quindi su Pannello di Controllo -> Strumenti di Amministrazione -> Prestazioni -> Avvisi e registri di prestazioni -> Registri contatori . Cliccate quindi con il destro in un punto vuoto della schermata di destra. Selezionate Nuove impostazioni registro dal menu contestuale. Assegnate quindi un nome al registro (ad esempio Utilizzo memoria virtuale).

Cliccate ora sul pulsante Aggiungi contatori e dalla finestra che si aprirà selezionate File di paging dal menu a tendina Oggetto prestazioni . Ora selezionate % in uso dalla parte sinistra della finestra, quindi cliccate sul pulsante Aggiungi . Chiudete quindi questa finestra cliccando sul pulsante Chiudi

Add_monitor.png

Ora vi troverete davanti alla schermata generale della pianificazione del monitor: selezionate la linguetta File registro e dal menu a tendina impostate File di testo (separato da tabulazione) e quindi cliccate su Configura: da qui impostate ad 1MB la dimensione massima del file di registro.

Portatevi infine sulla linguetta Pianificazione ed impostate Interrompi registrazione quando il file di 1MB è pieno.

Il monitor è così impostato: dimenticatevi quindi della questione ed utilizzate il sistema per navigare sul web, utilizzare la posta elettronica, ascoltare musica... insomma, utilizzate il PC come fate abitualmente per almeno un paio di giorni: questo consentirà allo strumento appena impostato di raccogliere dati sulla vostra specifica configurazione.

Trascorso il periodo di test, portatevi nella cartella C:\PerfLogs ed aprite con il blocco note il file Utilizzo memoria virtuale.tsv . Questo file riporta una serie di valori data di rilevazione / % di memoria virtuale in uso.

Results.png

Per sapere a quale dimensione impostare il file di paging non dovrete fare altro che prendere la dimensione attualmente impostata (2GB, se avete seguito le indicazioni fornite poche righe più su) e calcolarne la percentuale, scegliendo come valore il più alto fra quelli presenti nel file Utilizzo memoria virtuale.tsv.

Nel mio caso ad esempio, il valore più alto presente nel file è 12,4: il 12,4% di 2GB è uguale a 248MB. Ecco trovato quindi il valore massimo di memoria virtuale utilizzata sul mio sistema nel periodo di monitoraggio: impostare la dimensione del file di swap a circa 250/300MB (come ricordavo alla pagina precedente è sempre meglio arrotondare per eccesso) è quindi la scelta vincente per questa specifica configurazione.

Da notare infine che in caso il dato ottenuto sia prossimo o superiore al doppio RAM fisica installata, il sistema è troppo spesso a corto di memoria e si ritrova a dover fare affidamento al lento disco fisso. In tal caso è davvero consigliabile aggiungere altra memoria centrale: i miglioramenti sarebbero assolutamente tangibili.

Vista la grande confusione su questo argomento presente in Rete, penso sia interessante fare riferimento a testi universalmente riconosciuti come punti di riferimento: per chi volesse verificare con mano quanto appena esposto o semplicemente approfondire l'argomento, rimando ai libri "A. Silberschatz - P. Galvin: Sistemi operativi", "T.H. Cormen - C.E. Leiserson: Introduzione agli algoritmi Volume 2" e "D. A. Patterson, J. L. Hennessy: Struttura, organizzazione e progetto dei calcolatori".

Altri articoli sull'argomento

Fonti e riferimenti esterni (in inglese)

MegaLab.it rispetta la tua privacy. Per esercitare i tuoi diritti scrivi a: privacy@megalab.it .

Copyright 2008 MegaLab.it - Tutti i diritti sono riservati