web-dev-qa-db-fra.com

SQL Server TEMPDB sur SSD montrant IO

Nous avons récemment séparé nos fichiers TEMPDB à un nouveau SSD et avons commencé à voir:

5348 Occurrence (s) des demandes d'E/S prenant plus de 15 secondes à compléter sur le fichier [T:\TEMPDB\TEMPDB4.NDF].

Nous avons plusieurs occurrences de cette erreur. Nous n'avons pas vu les erreurs lorsque Tempdb était de retour sur sa maison d'origine RAID 5. J'ai suivi un tutoriel sur Sqlio et je pense que le SSD devrait être beaucoup plus rapide, lors de la lecture/écrit au hasard 8kb, que les disques RAID 5 précédents. Alors, pourquoi voyons-nous ces erreurs?

De plus, au moyen de plus de preuve que tout n'est pas bien, le fichier de commandes que nous courions pendant la nuit (qui se produit lorsque ces erreurs se produisent) prend 7 heures. Il a fallu 6,25 heures sur les vieux disques.

Les disques sont assis dans une matrice directement attachée. Le RAID5 pour les données, RAID 10 pour les journaux et une fente de rechange que nous avons utilisée pour le SSD. Le RAID 5 et SSD sont formatés pour une taille de bloc de 64 Ko. Le journal est incorrectement réglé sur une taille de bloc de 4kb (je sais - va réparer quand j'en ai une chance).

Ce sont les résultats de SQLIO:

T conduire (SSD)
iOS = 8kb écriture aléatoire, iOS/sec = 31847.48, mbs/sec = 248.8
IOS = 8kb lecture aléatoire, iOS/sec = 76391.66, mbs/sec = 596.8

S Drive (RAID 5)
iOS = 8kb écriture aléatoire, iOS/sec = 2601.3, mbs/sec = 20.32
iOS = 8kb lecture aléatoire, iOS/sec = 3138.45, mbs/sec = 24.51

Pour 64k séquentiels, lisez/écrit, ils étaient autour de la même chose.

TEMPDB est divisé en 4 fichiers de 1,5 Go (c'est la même avant et après le déménagement).

SQL Server 2012 est corrigé sur SP3.

Avez-vous une idée de ce qui pourrait causer toutes ces erreurs d'E/S rapportées par SQL Server?

Est-ce peut-être un problème de conducteur de tableau ou de HBA? Un seul disque est-il ajouté dans une fente de rechange sur une matrice directement connectée nécessite une configuration prudente en termes de cache?

8
G Devine

Je vous recommande vivement de tester votre nouveau T:\Drive à l'aide de la marque de disque cristal. Découvrez le guide de Brent Ozar ici:

Comment tester votre stockage avec CrystalDiskmark

Comparez les résultats du T:\lecteur avec

  • l'ancien disque RAID 5 (où Tempdb était utilisé)
  • votre machine

Si le SSD est plus lent que ces deux autres périphériques, et rien d'autre n'a changé * dans votre configuration, il est probable qu'il existe un problème avec le disque lui-même ou avec le pilote utilisé, ou le contrôleur pour le tableau de ce disque siège. etc.

* Les choses qui auraient pu changer depuis que vous avez déménagé TEMPDB:

  • le nombre de fichiers TEMPDB pour la base de données a augmenté ou diminué (quelqu'un a dit "Hey, pourquoi pas, car nous devons redémarrer la base de données pour déplacer TEMPDB de toute façon")
  • les tâches de maintenance ont été reproduites pour coïncider avec le travail nocturne désormais lent (en particulier ceux qui ont un potentiel de frapper tempdb dur, comme des reconstitutions de l'index ou du checkdb)
  • la fenêtre de maintenance pour déplacer TEMPDB a également été utilisée pour déployer un nouveau code (pour le travail nocturne, peut-être) qui utilise une utilisation plus lourde des tables Temps ou des requêtes avec de mauvais déversements, etc.

Prochaines étapes

Comme il semble que le disque soit raisonnablement rapide (selon les points de repère que vous avez partagés), je pense que ce serait une bonne idée de loger le contenu de sys.dm_io_virtual_file_stats Avant et après le travail de lot nocturne que vous avez mentionné. Cela vous indiquera combien d'E/S se passe sur TEMPDB pendant ce processus. Ceci est important, car peut-être qu'il y a vraiment plus d'E/S que le disque peut gérer. Alors voici ce que vous faites:

  1. Exécutez cette requête juste avant que votre travail de lot nocturne ne soit programmé pour exécuter:

    select * 
    from sys.dm_io_virtual_file_stats((select DB_ID('tempdb')), default);
    
  2. Enregistrez les résultats quelque part (comme Excel ou quelque chose - probablement pas dans TEMPDB: p)

  3. Attendez 7 heures (jusqu'à la fin du travail)
  4. Exécuter la même requête et enregistrer les résultats
  5. Modifiez votre question pour inclure les résultats

Nous pouvons ensuite faire la différence des deux instantanés et déterminer combien d'octets ont été lus/écrits pendant le travail. Vous pouvez également utiliser ces chiffres pour calculer la latence globale au cours de cette période.

Remarque: une approche plus granulaire serait de connecter les résultats de cette requête à une table toutes les 5 minutes (ou moins si vous le souhaitez)

7
Josh Darnell

Ce problème semble maintenant être résolu.

J'ai soulevé la question avec notre SAN et ils ont confirmé que la mise en cache sur le disque SSD était désactivée au tableau. Une fois que la mise en cache a été activée, les erreurs ont disparu de l'erreur SQL ServerLog.

Je dois admettre que je n'étais pas au courant que le tableau RAID avait besoin de cette configuration de réglage supplémentaire. Je m'attendais à ce que cela fonctionne sans aucune intervention.

Ils ont également mis à jour le logiciel Smart Array et appliqués les derniers correctifs, ce qui, à mon avis, ils auraient dû faire de toute façon et n'ont pas besoin d'un DBA pour suggérer.

Merci beaucoup à tous ceux qui ont pris le temps de regarder ce problème avec moi.

Garrett

3
G Devine