Bonjour,
J'ai un serveur SQL2005 32 bits qui consomme beaucoup de cpu depuis qq semaines. 80% en journée.

Les deux principales attentes sont dans l'ordre:
LCK_M_SCH_M: 50% attente pour poser un verrou de modification de schema
SOS_SCHEDULER_YIELD: 25% du à la pression CPU

J'ai mis une trace qq minutes: les requêtes sont très courtes (<30ms) mais très nombreuses. difficile d'isoler une requête fautive.

J'ai remarqué qu'il y avait beaucoup de compilations/sec (par des requêtes adhoc car pas de proc stock dans la base)
Ratio requêtes exécutées/sec (moyenne : 800), requêtes compilées/sec (moyenne :300) est trop élevé.


Ces deux problèmes peuvent être liés, une table qui est modifiée (alter, reindex…) provoque une compilation des requêtes utilisées par cette table.

J'essaie d'isoler les requêtes responsables des LCK_M_SCH_M
avec la requete:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
SELECT resource_type, resource_associated_entity_id,
    request_status, request_mode,request_session_id,
    resource_description 
    FROM sys.dm_tran_locks
    WHERE resource_database_id = 9
voici les wait de type Sch-M que je retrouve:
A priori, c'est sur les metadata. Par contre, je ne comprends pas la ressource description ($hash =0x9:0x0 ). Pouvez-vous m'aider à ce sujet ?

METADATA 0 GRANT Sch-M 70 $hash = 0x9:0x0
METADATA 0 WAIT Sch-M 91 $hash = 0x9:0x0
METADATA 0 WAIT Sch-M 67 $hash = 0x9:0x0
METADATA 0 WAIT Sch-M 107 $hash = 0x9:0x0
METADATA 0 WAIT Sch-M 61 $hash = 0x9:0x0
METADATA 0 WAIT Sch-M 54 $hash = 0x9:0x0
Merci

Sebastien