MySQL Windows 32bit e 3GB
Una domanda che salta fuori spesso è “Quanta memoria puo’ usare mysql sul mio sistema ?”
Come saprete mysqld-nt.exe viene eseguito in un singolo processo con vari thread; dunque il limite d’uso della memoria è fissato dai limiti imposti dallo stesso sistema operativo per il singolo processo.
Sistemi operativi differenti, hanno limiti differenti; dipendenti anche dall’architettura della CPU;
noi per il momento ci soffermiamo sui Windows della famiglia NT1 ed in particolare ai limiti posti da un architettura a 32bit.
La risposta breve alla domanda iniziale è: MySQL puo’ utilizzare fino a ~1.8Gb di RAM.
Nei sistemi Windows tutte le applicazioni che dispongono di uno spazio di indirizzamento a 32-bit in teoria2 dovrebbero disporre fino a 4Gb di memoria; Come mai il limite è così basso ?
I sistemi Windows dividono i 4Gb a metà 3 e offrono alle applicazioni l’accesso solo a 2 GB dello spazio totale del processo: questa quantità di memoria viene definita spazio degli indirizzi virtuali della modalità utente.
I 2 GB rimanenti, definiti spazio degli indirizzi della modalità kernel, sono riservati al sistema operativo.
nota: Tutti i thread di proprietà di un’applicazione condividono lo stesso spazio degli indirizzi virtuali della modalità utente.
Per questo MySQL finisce per poter utilizzare circa 1.8 Gb se si prova a superare questo limite, molto probabilmente finirete con ottenere solo errori “Out of Memory”. Come posso utilizzare piu’ di 2GB di memoria ?
Fortunatamente Windows 2000 e successivi hanno una modalità chiamata ‘4GT RAM Tuning’4 con la quale è possibile regolare la suddivisione.
Dovrete modificare il file boot.ini (solitamente C:\boot.ini) trovare la la riga che utilizzate per avviare il vostro sistema ed accodare il flag “/3GB” ad essa:
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=”Microsoft Windows XP Professional” /noexecute=optin /fastdetect /3GB
Questa modalità permette allo spazio utente di crescere fino a 3GB, ed è intesa come una soluzione a breve termine5 per permettere ad applicazioni come i database server di mantenere in memoria una quantità maggiore di dati rispetto ai 2GB standard.
nota bene:
- /3GB non vi permetterà di vedere i 4GB o 8GB di RAM addizzionali appena aggiunti al vostro nuovo server…
- /3GB non renderà l’applicazione il 50% più efficiente.
- /3GB soprattutto non deve essere utilizzata come standard per l’ambiente di produzione, va utilizzato solo dove non si ha un altra scelta…
la strada da seguire è sicuramente è passare ad un hardware ed un sistema operativo a 64-bit.
Un processo per poter sfruttare i nostri 3GB di memoria deve avere un eseguibile esplicitamente in grado di farlo;
quest’ultimo deve possedere il flag IMAGE_FILE_LARGE_ADDRESS_AWARE nell’header.
Se il flag non è impostato, il Sistema operativo riserverà il terzo gigabyte e l’applicativo non vedrà nessun indirizzo maggiore del solito 0x7FFFFFFF.
E’ possibile specificare questo flag al linker con l’opzione /LARGEADDRESSAWARE mentre si sta compilando l’eseguibile.
Se utilizzate una versione recente ( 5.0.79 o superiore  oppure 5.1.33 o superiore) l’eseguibile possiede già il flag abilitato6,
in caso contrario potrete utilizzare un tool come “editbin” che viene distribuito anche con le Express Edition di Vistual C++ per modificare l’header dell’eseguibile mysqld-nt.exe oppure compilare MySQL da voi passando l’opzione /LARGEADDRESSAWARE come descritto nella patch7
C:\Program Files\MySQL\MySQL Server 5.0\bin>editbin /LARGEADDRESSAWARE mysqld-nt.exe
Reference:
[1] Memory Limits for Windows Releases
[2] Dude, Where’s My 4 Gigabytes of RAM?
[3] Memory Management – x86 Virtual Address Space
[5] Memory Management – Demystifying /3GB
[6] MySQL Bug #43082 – mysqld 32 bit cannot use big buffers […]
Una risposta.
pochi articoli ma davvero di buon contenuto.
Grande Walter