Dimensione ideale paging file (anche detta memoria virtuale)
La scorsa notte ho impiegato una buona mezz'ora a convincere un amico del fatto che la dimensione di un paging file, su un computer con molta RAM, deve essere minima.
So che ci sono milioni di documenti che sostengono il contrario, ma... la verità è scritta su Windows Internals (che è arrivato alla quarta versione, ma la stessa cosa c'era sulla prima versione molti anni fa, quando ancora il libro era scritto completamente da David Solomon). Per convincere il mio amico la mia parola e degli esperimenti perfettamente riproducibili non bastavano, quindi ecco qua il riferimento buono per tutti: pagine 445, 446 e 447 di Windows Internals 4th Edition.
Riassumo i punti salienti:
- La memoria virtuale disponibile in un sistema è data (sommariamente) da RAM fisica + Paging file
- Con un sistema che ha molta RAM (oggi vuol dire 2Gb o più) si può ragionevolmente lavorare senza paging file
- Per sapere di quanto paging file si ha bisogno, c'è questo metodo empirico: si usa la macchina per un po' (magari facendo tutte le operazioni più pesanti e aprendo tutti i programmi che uno potrebbe ragionevolmente aprire in maniera cocncorrente) e si vede dove arriva il "Commit Charge Peak" di Task Manager; tutto quello che avanza tra questo numero e il "Commit Charge Limit" è spazio di paging file che non è mai stato usato, qualora tale numero sia addirittura inferiore alla RAM fisica del sistema, il paging file non è mai stato necessario fino a quel momento.
Ora, se chiedete a un sistemista medio (e magari anche esperto) è probabile che vi risponderà: la dimensione ideale del paging file è una volta e mezza la RAM fisica del sistema. Semplicemente, non è vero. Questo valore di default risale a quando Windows NT viaggiava su macchine che mediamente avevano 64 o 128Mb di RAM. Ancora oggi lo si trova su migliaia di documenti e pure su moltissimi documenti Microsoft e MSDN.
Oggi siamo in uno scenario diverso e se su una macchina con 2Gb creo un paging file di 3Gb, devo sperare che non sia mai usato completamente perché avere paginato 3Gb significa avere prestazioni della macchina assolutamente scadenti (il processore, e probabilmente l'utente, passa il tempo ad aspettare che i dati siano caricati da disco). Purtroppo molti programmi non si curano di controllare se la memoria che richiedono al sistema operativo è memoria fisica o paginata e assumono (erroneamente) che mettere i dati in questa memoria sia sempre più veloce che accedere a un file su disco... Così invece di fare cache (nelle intenzioni del programmatore) si trovano a rallentare le operazioni. A questo punto meglio non far illudere un'applicazione di avere troppa memoria. Si potrebbe eliminare completamente il paging file, ma molte applicazioni non gestiscono abbastanza bene le condizioni di memoria insufficiente e allora meglio dare un minimo di paging file per consentire a qualche applicazione "avveduta" (tra queste SQL Server e Analysis Services, per fare un paio di esempi) di rilasciare un po' di memoria quando il sistema inizia a paginare. Ma se non c'è paging file, nessuno interviene per tempo. Comunque 100Mb sarebbero suffcienti per questo genere di necessità, con 500Mb si è già molto più che tranquilli.
Perché allora Microsoft non cambia il consiglio per il paging file? Semplicemente, per non rischiare qualche chiamata in più al supporto tecnico. Come ho detto, molte applicazioni gestiscono male condizioni di memoria limite, mentre se il sistema inizia a paginare l'utente percepisce il rallentamento e comincia a chiudere qualcosa prima che sia troppo tardi. In effetti, mettere un paging file più grande del necessario non ha quasi controindicazioni. Peccato però che tale file sia creato al momento dell'installazione di Windows e, se messo nel disco dove c'è anche il sistema operativo, va probabilmente a prendersi una delle parti "migliori" del disco (i dischi attuali sono più performanti nella parte iniziale del disco), relegando altre applicazioni più usate a zone meno veloci del disco stesso. Senza contare che avete X Gb di disco che magari non sono mai usati da nessuno (ma li avete pagati lo stesso).
La discussione (la notte scorsa) è nata perché mi si consigliava di prendere un disco dove alloggiare il paging file. Di tutti i modi che conosco per spendere soldi in hardware, mi sembrava uno dei peggiori, e così ho affrontato una difficile opera di convincimento (anche perché non ho avevo subito a portata di mano le pagine di Solomon/Russinovich che ho citato prima). A onor del vero esiste una sola condizione in cui è richiesta una dimensione minima specifica del paging file: se si vuole ottenere un dump completo della memoria in caso di blue screen (errore del sistema operativo che blocca tutto e forza al riavvio della macchina) allora il paging file deve avere una dimensione pari alla quantità di memoria fisica più qualcosetta (1Mb può bastare). Attivando il mini-dump questa esigenza viene meno. E non conosco molte persone che, una volta ottenuto un dump completo, sono in grado di farci qualcosa. Se non sviluppate driver, non mi sembra che sia un problema di cui dobbiate realmente preoccuparvi (con le dovute eccezioni: magari su alcuni server con alcune applicazioni molto particolari questi accorgimenti sono ritenuti indispensabili... ma nel 99% dei casi non è così).
Ora, siccome so che qualsiasi cosa io scriva qualcuno dirà che non ho ragione perché da qualche parte ha letto che esiste la formula magica (1,5 x RAM fisica, anche se esistono divertenti varianti a questa formula che portano il valore ideale a 2xRAM o a 2,5xRAM, ma senza che nessuno dia mai una minima spiegazione del perché di questi numeri), ho deciso di aprire i commenti a questo post e sentire le reazioni... probabilmente non sono stato abbastanza chiaro nello spiegare il perché di questo comportamento, ma la spiegazione non può prescindere dal comprendere il funzionamento del memory manager di Windows per quanto riguarda la memoria virtuale, argomento a cui da più di un anno ho promesso di dedicare un articolo che non trovo il tempo di scrivere. Comunque, se ci saranno domande mirate proverò a spiegare meglio i punti oscuri.