Marco Russo

.NET, Business Intelligence e dintorni

Corsi

Miei blog in inglese

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:

  1. La memoria virtuale disponibile in un sistema è data (sommariamente) da RAM fisica + Paging file
  2. Con un sistema che ha molta RAM (oggi vuol dire 2Gb o più) si può ragionevolmente lavorare senza paging file
  3. 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.

Comments

marco said:

Capisco, anche se non condivido, la scelta da parte di Microsoft di lasciare inalterato il consiglio sul paging file (e la dimensione di default che a questo viene assegnata in fase di setup sulla base del quantitativo di RAM rilevato).
Ma non sarebbe, almeno, carino poter scegliere questa impostazione durante l'installazione del sistema operativo? Magari come possibilità ben nascosta sotto il nome di "Impostazioni avanzate" ?
# aprile 3, 2005 2.08

marco said:

Da quando ho installato 2Gb di RAM (con pessimi risultati di stabilità hardware ma questo è un altro problema) ho visto che il PF è praticamente inutilizzato.
Ora con 1,5Gb di RAM sto seriamente pensando di toglierlo, per rimetterlo solo in caso di Out of Memory...
# aprile 4, 2005 1.22

marco said:

Lorenzo, come ti ho detto un paging file minimo (anche solo 100/200Mb) può essere una garanzia sufficiente: rallenta abbastanza le applicazioni se c'è troppa memoria in uso perché tu te ne accorga e chiuda qualcosa. Se non lo usi mai tanto meglio. Questo paging file minimo lo trovo particolarmente utile quando usi SQL Server e/o Analysis Services, perché il loro uso della RAM dinamico è efficace se c'è un minimo di elasticità, altrimenti non rilasciano memoria in tempo e qualcuno (magari qualche altro processo) si trova un bel Out Of Memory. Considera che facendo data warehousing ho spesso SQL Server che dopo un paio di query si prende tutta la RAM fisica che riesce, arrivando da solo a 1.3Gb in un battibaleno. Per applicaioni "oltp" probabilmente questi problemi non si pongono quasi mai durante lo sviluppo.
# aprile 4, 2005 2.03

marco said:

In effetti per "toglierlo" nella mia testa intendevo "ridimensinarlo" ai minimi termini.
Per ora sono a 200Mb... vediamo come va...
E grazie, era da un po' che ci pensavo e il tuo post mi ha dato lo spunto per farlo... :-)
# aprile 4, 2005 3.07

TrackBack said:

# aprile 4, 2005 3.10

TrackBack said:

# aprile 4, 2005 3.19

marco said:

Marco, capisco il tuo apriamo i commenti...ma...secondo me nella vita si conoscono persone di cui si fida ciecamente quando espongono un certo argomento. Tu per me sei una di queste. Se parli di Windows Internal o di .NET per me è "vangelo" tutto quello che dici.
Sicuramente avere le spiegazioni di quanto affermi è utilissimo (e fondamentale), ma ti assicuro che chi ti conosce non avrebbe avuto nessun dubbio sulla tua affermazione. Visto che il post penso sia utilissimo a molti ti anticipo una domanda: se uno a più dischi fisici sulla macchina il piccolo paging file conviene dividerlo su entrambi i dischi o no ?
# aprile 5, 2005 4.14

marco said:

Se il paging è piccolo e idealmente non dovresti usarlo, mettilo su un disco qualsiasi dove hai spazio libero.
Se invece il paging file pensi di usarlo (ad es. se il Peak di Task Manager supera la quantità di RAM fisica della macchina), allora mettilo su un disco veloce.
Meglio usare un disco dedicato, o comunque un disco diverso da quello che contiene sistema operativo e programmi. Se puoi, usa una partizione dedicata (di un altro disco, ma se andasse male, dello stesso disco) oppure imposta il paging file a dimensione fissa (dimensione minima = dimensione massima) dopo aver deframmentato il disco - così hai un paging file non frammentato.
Se usi più dischi, Windows comincia a usare quello a cui accedi meno (statisticamente) e via via usa gli altri. Difatti avere più paging file non aumenta le prestazioni perché non parallelizza le operazioni.
Un articolo di KB a riguardo ci sta bene: http://support.microsoft.com/?kbid=314482
Nota che nella KB la giustificazione RAM*1,5 è data dal poter fare il dump della memoria in caso di schermo blu - alla fine dei conti hanno fatto la scelta di essere prudenti, anche perché così se uno chiama il Product Support Service (PSS) può mandargli il dump della memoria, in casi estremi... Se poi uno spreca (=inutilizza) qualche Gb di disco, non è un problema loro :-)
# aprile 5, 2005 4.42

TrackBack said:

# aprile 18, 2005 9.39

marco said:

Che ne dici di questa soluzione; io ho creato una part di 5 GB (ho 3 gb di RAM 2xXeon 3ghz) e ho impostato l'utilizzo dinamico da parte del sistema su quella partizione. di solito trovo questa situazione: file di pagininig utilizato 2,5 GB picco cca 2,6 gb. Le app più "avide" sono sqlserv con 1,2 gb e store (exchange2003) 600 MB. Posso seguire i tuo consiglio e impostare un file di pag fisso a diciamo 300 mb??? Grazie
# maggio 2, 2005 11.25

marco said:

MaiO, dovresti fare qualche indagine in più. SQL Server usa RAM virtuale che poi è quasi sempre RAM fisica, Exchange lo conosco meno e può darsi che faccia uso di paginazione. Sicuramente l'uso del file di paging dinamico non è una buona idea, se hai una partizione dedicata sarebbe meglio togliere il paging file, formattare la partizione e ricreare la partizione con dimensione minima uguale a quella massima. Istintivamente potresti provare a mettere 300/500Mb, ma se sei arrivato a un picco di 2.5Gb di paging... a meno che tu non mi abbia dato i numeri del "Commit Charge" dove hai un picco di 2.6Gb... in tal caso i 300/500 Mb sono sufficienti, ma segui le mie indicazioni per creare quel file in modo non frammentato.
# maggio 2, 2005 11.44

marco said:

Ho un Peak nel Commit Charge di 2,6 GB e il limit a 6,1 GB. Physical Memory total 3 GB e available 1,3 gb. Il server è accesso da 160 gg perciò posso considerare questi dati atendibili - riguardo il carico di lavoro reale. Adesso proverò ad impostare la Swap a 300MB fissi. Poi ti faccio sapere su un eventuale guadagno di prestazioni o la percezione di questi. Grazie mille, un post illuminante :) dai tempi che sto litigando con 1,5 X RAM fisica
# maggio 5, 2005 2.36

marco said:

MaiO, non vedrai nessun guadagno di prestazioni particolare, ma sicuramente recuperi qualche Gb di spazio sul disco.
# maggio 5, 2005 10.28

marco said:

Dunque per una macchina Windows 2000 Pro con 128 MB di RAM una dimensione minima del file di paginazione di 192 MB e massima di 512 MB dovrebbe essere più che adeguata ... E allora perchè continuo ad avere messaggi di "Memoria virtuale insufficiente"?
# giugno 1, 2005 5.04

marco said:

Marco D.F., 128Mb di RAM sono proprio pochi, ci sono sw che al lancio chiedono 200/300Mb di memoria virtuale tutta per loro. Dipende da cosa usi. Il problema è che anche se aumenti la memoria virtuale, di certo non puoi pretendere che la macchina poi vada anche veloce...
# giugno 1, 2005 5.22

Marco Russo said:

Avere una workstation di sviluppo con 4Gb di RAM, due monitor grandi, schede video adeguate... può sembrare

# luglio 2, 2007 6.38