février
2011
L’un des objectifs principaux de tous les SGBD est de réduire les entrées/sorties (E/S) disque car les lectures et écritures sur le disque font partie des opérations les plus consommatrices de ressources. SQL Server pour atteindre cet objectif crée un pool de mémoires tampons pour garder les pages de la base de données lues en mémoire.
De façon standard les systèmes d’exploitation Microsoft Windows 32 bits peuvent adresser une mémoire maximale de 4 Go.
Dans ce cas, 2Go sont reservés pour l’OS et 2Go pour les applications. La mémoire étant un élément fondamental pour le bon fonctionnement du SGBD, comment permettre au moteur SQL de disposer d’une quantité de mémoire supérieure à 2Go sur un OS 32 bits ? Deux commutateurs permettent de résoudre ce problème afin d’allouer plus de 2Go de mémoire à SQL SERVER, il s’agit de /3GB et /PAE.
/3GB permet à SQL SERVER d’utiliser une mémoire proche de 3Go.
/PAE permet à SQL SERVER d’utiliser une mémoire supérieure à 3Go.
Avant tout il faut d’abord voir s’il y a de commutateur (/3GB ou /PAE) activé sur le serveur.
——————————————————————————————–
SELECT CAST(physical_memory_in_bytes as decimal) / (1024*1024*1024) AS [Mémoire Physique (Go)],
CAST(virtual_memory_in_bytes as decimal) / (1024*1024*1024) AS [Mémoire Virtuelle (Go)],
CASE
WHEN CAST(virtual_memory_in_bytes as decimal) / (1024*1024*1024) > 2 AND CAST(virtual_memory_in_bytes as decimal) / (1024*1024*1024) <=3 THEN '/3GB est activé’
WHEN CAST(virtual_memory_in_bytes as decimal) / (1024*1024*1024) > 3 AND CAST(virtual_memory_in_bytes as decimal) / (1024*1024*1024) <=64 THEN '/PAE est activé’
ELSE 'Aucun commutateur n''est activé’
END AS [Commutateur activé]
FROM sys.dm_os_sys_info
Quelle configuration mémoire appliquée ? 3GB ? PAE ? .
——————————————————————————————–
Tout dépend de l’architecture (32 bits ou 64 bits) de votre système (OS et SQL SERVER) et de la quantité totale de mémoire disponible sur le serveur.
Pour savoir la configuration qui convient dans votre contexte référez-vous à ce billet que j’ai écrit.
————————————————————————–
Comment configurer le commutateur /3GB ?
————————————————————————–
/3GB permet à SQL SERVER d’utiliser une mémoire proche de 3Go.
Le commutateur /3GB n’est pris en charge que par les systèmes d’exploitation suivants :
• Windows 2000 Advanced Server
• Windows 2000 Datacenter Server
• Windows Server 2003 Standard Edition
• Windows Server 2003 Datacenter Edition
Le commutateur /3GB ne doit pas être utilisé avec Windows 2000 Server car il n’est pas pris en charge et peut entraîner une défaillance d’une application ou d’un système d’exploitation.
Pour configurer /3GB, ouvrir le fichier boot.ini (il se trouve sur le disque C:\)
[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" /noexecute=optout /fastdetect
Ajouter /3GB dans ce fichier puis enregistrer
[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" /noexecute=optout /fastdetect /3GB
NB : Il faut redémarrer l’OS pour mettre en service le /3GB
————————————————————————–
Comment configurer le commutateur /PAE ?
————————————————————————–
L’extension d’adresse physique /PAE (Physical Address Extension) permet à un processeur 32 bits à adresser plus de 4 Go de mémoire physique.
Les systèmes d’exploitation capables d’utiliser la fonction PAE sont:
• Microsoft Windows 2000 Advanced Server
• Microsoft Windows 2000 Datacenter Server
• Microsoft Windows Server 2003 Enterprise Edition
• Microsoft Windows Server 2003 Datacenter Edition
la configuration du /PAE se fait côté Windows (OS) et côté SQL SERVER :
Côté Windows :
1/Modifier le fichier boot.ini (ou les commmandes BCDEDIT sous Windows 2008)
2/Activer le ‘Lock Pages in Memory’ pour le compte de service sqlservr.exe
Côté SQL SERVER : Activer AWE (Address Windowing Extensions) et configurer le ‘max server memory’
Côté Windows :
—> fichier boot.ini (généralement ce fichier est sur C:\ et est caché il faut modifier les propriétés du dossier pour qu’il soit visible)
[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" /noexecute=optout /fastdetect
Ajouter /PAE à ce fichier puis enrégistrer
[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" /noexecute=optout /fastdetect /PAE
Sous Windows 2008 la procédure est différente, il faut exécuter deux commandes BCDEDIT dans la console DOS
BCDEDIT /SET PAE ForceEnable
BCDEDIT /SET IncreaseUserVA 3072
—>Activer le ‘Lock Pages in Memory‘ pour le compte de service sqlservr.exe
¤ Lancer la commande gpedit.msc après Démarrer > Exécuter sous Windows
Dans la fenêtre qui apparaît naviguer jusqu’à l’emplacement ‘User Rights Assignment’ comme le montre l’image ci-dessous
¤ Dans la fenêtre à droite, clique droit sur ‘Lock Pages in Memory’ puis propiétés
¤ Ajouter le compte de service sqlservr.exe puis cliquer sur le bouton OK
¤ Redémarrer le service SQL SERVER Service
Côté SQL SERVER
—> Activer AWE (Address Windowing Extensions) et configurer le ‘max server memory’
L’exemple suivant montre comment activer les extensions AWE et configurer une limite de 6 Go pour l’option max server memory :
sp_configure 'show advanced options', 1
RECONFIGURE
GO
sp_configure 'awe enabled', 1
RECONFIGURE
GO
sp_configure 'max server memory', 6144
RECONFIGURE
GO
Le gestionnaire des tâches windows (task manager) ne permet pas de savoir la quantité de mémoire utilisée par SQL SERVER via l’AWE. Pour le savoir il faut utiliser la DMV sys.dm_os_memory_clerks
SELECT sum(awe_allocated_kb)/1024 as [Quantité de mémoire allouée via AWE (Mo)]
FROM sys.dm_os_memory_clerks
Tableau d’utilisation de mémoire pour le commutateur /PAE
Operating system |
Maximum memory support with PAE |
---|---|
Windows 2000 Advanced Server |
8 GB of physical RAM |
Windows 2000 Datacenter Server |
32 GB of physical RAM |
Windows XP (all versions) |
4 GB of physical RAM* |
Windows Server 2003 (and SP1), Standard Edition |
4 GB of physical RAM* |
Windows Server 2003, Enterprise Edition |
32 GB of physical RAM |
Windows Server 2003, Datacenter Edition |
64 GB of physical RAM |
Windows Server 2003 SP1, Enterprise Edition |
64 GB of physical RAM |
Windows Server 2003 SP1, Datacenter Edition |
128 GB of physical RAM |
* Total physical address space is limited to 4 GB on these versions of Windows.
Avec les OS 64 bits, comment permettre à SQL SERVER de profiter au maximum de RAM sans pénaliser l’utilisation de mémoire nécessaire au bon fonctionnement de l’OS ?
La prise en charge AWE n’est disponible que dans les éditions Enterprise, Standard et Developer de SQL Server ; par ailleurs, elle ne s’applique qu’aux versions 32 bits de SQL Server. Analysis Services ne peut pas tirer profit de la mémoire mappée AWE. Si la mémoire physique disponible est moins importante que l’espace d’adressage virtuel en mode utilisateur, AWE ne peut pas être activé. (source ici)
———————————————————————
Etienne ZINZINDOHOUE
———————————————————————
Bonjour,
Merci pour ce billet complet, notamment avec les précisions sur Windows Server 2008
Par contre je rencontre un problème sur un serveur (Win 2008, SQL 2008R2, tout en x86, 8Go) pour lequel, bien que « bcdedit /enum » m’indique « pae : ForceEnable », la commande est donc bien activée, après un reboot, le script du début du billet me retourne que seul /3GB est activé. Aucune trace du /PAE…
Le compte de service est bien dans le lock page…, l’AWE est bien activé sur mon instance qui a elle aussi redémarrée.
Je ne vois donc pas comment la mémoire virtuelle se limite à 3 Go
/PAE permet à une architecture 32 bits de prendre en charge plus de 4 Go de mémoire. Dans ce cas SQL SERVER peut donc utiliser une mémoire supérieure à 3 Go. Avec /3GB la valeur maximale de mémoire utilisée par SQL SERVRER est 3Go.
Tu vois le raisonnement ? au fait je focuse sur la mémoire utulisée par SQL SERVER, pas sur la mémoire utilisée par l’architecture (la machine 32 bits)
A propos de l’option USERVA, je ferai mes commentaires sur ton blog
A+
Lut,
Petite correction :
/PAE permet à SQL SERVER d’utiliser une mémoire supérieure à 3Go –> c’est 4Go
Peut être à ajouter l’utilisation de l’option USERVA qui permet de configurer plus finement l’espace réservé au kernel (http://blog.developpez.com/mikedavem/p8369/sql-server-2005/architecture/fonctionnement-et-utilisation-des-option/)
A+