Via Cà Matta 2 - Peschiera Borromeo (MI)
+39 02 00704272
info@synaptica.info

MySQL Windows 32bit e 3GB

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.

32bit Process - Virtual Memory

32bit Process - Virtual Memory

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

[4] 4-Gigabyte Tuning

[5] Memory Management – Demystifying /3GB

[6] MySQL Bug #43082 – mysqld 32 bit cannot use big buffers […]

[7] MySQL Bug #43082 – Patch Commit – CMakeLists.txt

Tags: , , ,

Una risposta.

  1. Riccardo ha detto:

    pochi articoli ma davvero di buon contenuto.

    Grande Walter

Lascia un commento