Nous avons une application qui interroge une base de données SQL périodiquement tout au long de la journée. Il y a des périodes d'activité nulle ou seulement légère, entrecoupées de demandes individuelles de quantités relativement importantes de données. Lorsque ces demandes arrivent, l'objectif principal est de fournir les données rapidement et l'objectif secondaire est de le faire de manière rentable. En raison de la nature de l'application, il est assez peu probable que les données / index aient été mis en cache dans la RAM de la requête précédente (différents utilisateurs, travaillant sur différentes parties des données).
Pour un système qui connaît une utilisation relativement stable, j'ai entendu la règle de base pour observer la longueur de la file d'attente du disque et garder ce nombre relativement petit. Cela fonctionnera spécifiquement dans AWS, où j'ai vu la règle générale qu'une longueur de file d'attente de disque de 1 pour 100 IOPS est raisonnable.
Comment estimer les besoins d'E / S pour un tel système? La longueur de la file d'attente du disque est-elle un indicateur fiable lorsqu'il s'agit de requêtes individuelles et explosives? Y a-t-il d'autres mesures à prendre en compte?
la source
Réponses:
La métrique principale que j'ai toujours prise en compte pour les E / S dans SQL Server n'est pas les IOP ou la longueur de file d'attente de disque, mais le débit du disque (sec / reads et sec / writes). Dans l'ensemble, les bases de données ne concernent pas le nombre d'opérations que vous pouvez lancer sur un disque, mais la rapidité avec laquelle ces opérations sont terminées. La règle générale est d'avoir moins de 20 ms / opération (bien que plus bas soit toujours mieux). Plus de détails peuvent être trouvés dans cet article .
La longueur de la file d'attente du disque est une statistique bidon et n'est plus pertinente. Le problème est que la valeur mesure la file d'attente pour un seul lecteur, mais maintenant que nous vivons à une époque de RAID, de SAN et d'autres stockages distribués, il n'y a aucun moyen de traduire correctement cette valeur en un nombre significatif. Un excellent point de départ pour les mesures de performances est cette affiche de Quest / Dell qui vous donne beaucoup de choses et d'explications pour savoir pourquoi ou pourquoi elles sont importantes. Vous n'êtes pas obligé de les utiliser tous, mais c'est un début.
Pour tester votre E / S, vous devez comprendre votre charge de travail à son apogée. Combien de transactions et combien sont mises en cache? À moins que vous ne les connaissiez et ne les ayez mesurés, il est vraiment difficile de juger. Vous pouvez créer des charges de travail et utiliser des outils comme SQLIO pour tester votre stockage, mais vous aurez besoin de modèles de charge de travail pour créer un test approprié.
Enfin, une note sur AWS: à ma connaissance, Amazon ne garantira pas les performances d'E / S dans AWS. Cela est principalement dû au fait que le stockage est une ressource partagée massive et qu'il est impossible d'évaluer les modèles de vous et de vos voisins sur une zone de stockage particulière (voir le problème du voisin bruyant ).
Ma recommandation serait d'allouer autant de mémoire que possible. SQL Server ne poussera les éléments de la mémoire que s'ils sont sous pression et d'espace dans le pool de mémoire tampon (basé sur LRU-K). Donc, si votre pool de mémoire tampon peut stocker la plupart de la base de données en mémoire, vous pouvez atténuer certaines des performances explosives. Envisagez également des tactiques qui peuvent garder les objets du cache "au chaud". Enfin, gardez un œil sur SQL 2014 et la nouvelle fonctionnalité Hekaton .
la source