I. Introduction▲
Contrairement à un environnement Unix/Linux, il n'y a qu'un processus Oracle sous Windows.
Ce processus Oracle.exe hébergé par une machine Windows 32 bits devrait pouvoir être en mesure d'utiliser plus de 2Go de RAM.
Comme nous allons le voir, par défaut, cela n'est pas le cas.
Cette problématique explique que, dans certains cas, l'augmentation de la mémoire SGA se fait au détriment de la PGA, même si l'on détecte de la mémoire disponible en suffisance sur le système
II. Analyse▲
Pour mon test, j'utilise une machine avec 3Go de RAM physique.
Via TaskManager, je crois comprendre que Windows a bien détecté cette mémoire et qu'il est en mesure de l'utiliser
Je paramètre donc ma mémoire Oracle de la manière suivante :
Le processus Oracle, oracle.exe, devrait donc être en mesure d'allouer 1600 Mo+500 Mo = 2.1Go de RAM.
Si j'essaie de démarrer l'instance avec une SGA_MAX_SIZE à 2.0Go, j'obtiens un superbe :
SQL> shutdown immediate
Base de données fermée.
Base de données démontée.
Instance ORACLE arrêtée.
SQL> startup
ORA-27102: out of memory
OSD-00022: Message 22 not found; product=RDBMS; facility=SOSD
O/S-Error: (OS 8) Not enough storage is available to process this command.
CQFD : La preuve est donc faire qu'il semble impossible de démarrer un processus de plus de 1.9o de RAM sur Windows 2003 Server avec cette configuration, bien que plus de 1.7Go de mémoire RAM soit encore disponible sur la machine, si l'on se base sur le Task Manager de Windows.
Le fait d'augmenter la SGA dans les limites de la taille maximale de la mémoire PGA influence négativement la PGA puisque celle-ci se retrouve saucissonnée entre l'utilisation effective de la SGA et cette fameuse limite à 1.9Go par processus de Windows. Vous pouvez donc vous retrouver à générer des erreurs ORA-04030/ORA-12500 en cascade lors d'une augmentation de RAM suivie d'une augmentation proportionnelle de SGA.
III. Correction▲
Afin de pallier ce problème, il « suffit » de configurer Windows afin qu'il accepte d'attribuer plus de mémoire à un processus, et qu'il pagine différemment.
Ceci se fait via l'ajout des paramètres /3GB et /PAE dans le fichier boot.ini à la racine du disque. Cette action nécessite, bien entendu, un redémarrage du serveur Windows.
[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="Windows Server 2003, Standard" /fastdetect /NoExecute=OptOut /3GB /PAE
IV. Validation▲
Après reboot, il est aisé, via le Task Manager, de détecter que le processus Oracle.exe a dépassé la barre fatidique des 1.9Go d'allocation de mémoire… et que vos erreurs ORA-04030 et ORA-12500 disparaissent du même coup.