web-dev-qa-db-fra.com

Problèmes de mémoire: TEMPDB utilisant presque tout le cache tampon

Sur l'un des serveurs, je travaille sur aujourd'hui, je vois que la quasi-totalité du cache tampon est remplie de TEMPDB. En conséquence, la mémoire est très faible sur le serveur.

CPU enter image description here

TEMPDB:

enter image description here

Version:

Microsoft SQL Server 2014 (SP2-CU13) (KB4456287) - 12.0.5590.1 (x64)
1 août 2018 01:23:36 Copyright (c) Edition standard de Microsoft Corporation (64 bits) sur Windows NT 6.3 (Build 14393 :) (Hyperviseur)

4 fichiers de données = 4096 MB 1 fichier journal = 1536MB

Mon problème est que Tempdb utilise 13 Go de mon cache tampon. J'ai vérifié les objets dans TEMPDB, les plus gros où mes tables Temps sp_blitz, qui ne sont pas si grandes.

RCSI n'est activé pour aucune base de données, donc ne devrait pas être un problème de magasin de version.

Pas de transactions ouvertes

Pas de curseurs ouverts.

Lorsque j'exécute un point de contrôle sur TEMPDB, cela prend environ 30 secondes, mais se termine.

Lorsque j'exécute DBCC Dropcleanbuffers, la présence de Tempdb dans le cache tampon est réduite TTO parfois 1 Go parfois 4GB 30 secondes plus tard, il est de retour dans sa gloire complète de 13 Go

Par exemple:

dbcc dropcleanbuffers


DECLARE @total_buffer INT;

SELECT @total_buffer = cntr_value
FROM sys.dm_os_performance_counters 
WHERE RTRIM([object_name]) LIKE '%Buffer Manager'
AND counter_name = 'Database Pages';

;WITH src AS
(
SELECT 
database_id, db_buffer_pages = COUNT_BIG(*)
FROM sys.dm_os_buffer_descriptors
--WHERE database_id BETWEEN 5 AND 32766
GROUP BY database_id
)
SELECT
[db_name] = CASE [database_id] WHEN 32767 
THEN 'Resource DB' 
ELSE DB_NAME([database_id]) END,
db_buffer_pages,
db_buffer_MB = db_buffer_pages / 128,
db_buffer_percent = CONVERT(DECIMAL(6,3), 
db_buffer_pages * 100.0 / @total_buffer)
FROM src
ORDER BY db_buffer_MB DESC; 

Résulter juste après:

db_name db_buffer_pages db_buffer_MB    db_buffer_percent
tempdb  620627  4848    58.096

30 sec plus tard:

db_name db_buffer_pages db_buffer_MB    db_buffer_percent
tempdb  1313835 10264   83.560

Utilisation de cache tampon TempDB à son apogée (its_over_9000.jpeg) enter image description here

Vérifiez les objets dans TEMPDB:

use tempdb 

go
SELECT 
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows AS RowCounts,
    SUM(a.total_pages) * 8 AS TotalSpaceKB, 
    SUM(a.used_pages) * 8 AS UsedSpaceKB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
FROM sys.tables t
INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id
GROUP BY  t.Name, s.Name, p.Rows
ORDER BY  TotalSpaceKB desc

Top 4 valeurs:

TableName   SchemaName  RowCounts   TotalSpaceKB    UsedSpaceKB UnusedSpaceKB
#A3B2C869   dbo 0   72  16  56
#A52E4149   dbo 0   72  16  56
#A59B10DB   dbo 0   72  16  56
#A68F3514   dbo 0   72  16  56

pour un total d'un montant de 74 objets.

Je vois beaucoup de pages (375 000 + !!!) avec 7965 octets d'espace libre et une seule rangée compte dans ma mémoire tampon. Requête utilisée:

select * from sys.dm_os_buffer_descriptors
where database_id = 2
order by free_space_in_bytes desc 

E.g.

file_id page_id page_level  allocation_unit_id  page_type   row_count   free_space_in_bytes
1   109763  0   71635384526569472   INDEX_PAGE  1   7965

mais encore plus avec 40 octets de l'espace libre (1M), voir ci-dessous.

Filtrer un peu plus:

select page_type,free_space_in_bytes,  count(*)as counter from sys.dm_os_buffer_descriptors
where database_id = 2
group by page_type, free_space_in_bytes
having count(*) > 500
order by free_space_in_bytes desc 

enter image description here

Question

Pourquoi mon tempdb se remplit-t-il si vite après avoir délivré DBCC Dropcleanbuffers? Est-ce que je manque quelque chose, que dois-je vérifier?

Mise à jour 30/11/2018

Afer Réglage TEMPDB sous forme de 4 fichiers de 512 Mo et redémarrage du serveur, le MB dans la mémoire tampon semble être inférieur. Cependant, il reste 6 Go.

enter image description here

Toute autre idée sur quoi faire/vérifier maintenant?

Info supplémentaire:

Tracetatus

enter image description here

Exemples de requêtes exécutées constantes capturées par le profileur:

exec sp_reset_connection 

SELECT COUNT(*) FROM dbo.SomeTable WHERE Error IS NULL

Certaines connexions utilisent Serializable:

-- network protocol: TCP/IP
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level serializable 

Certains ne

-- network protocol: TCP/IP
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read committed

Max Mem est un peu bas:

enter image description here

Vérifications de la page DBCC: DBCC Traceon (3604);

DBCC Page (2, 5, 474258, 3); DBCC Traceoff (3604);

bpage = 0x00000016AA16C000          bhash = 0x0000000000000000          bpageno = (5:474258)
bdbid = 2                           breferences = 0                     bcputicks = 0
bsampleCount = 0                    bUse1 = 1952                        bstat = 0x109
blog = 0xcdcdcdcd                   bnext = 0x0000000000000000          

PAGE HEADER:


Page @0x00000016AA16C000

m_pageId = (5:474258)               m_headerVersion = 1                 m_type = 3
m_typeFlagBits = 0x0                m_level = 0                         m_flagBits = 0x8020
m_objId (AllocUnitId.idObj) = -1778255884                                m_indexId (AllocUnitId.idInd) = 255
Metadata: AllocUnitId = 71941054260314112                                Metadata: PartitionId = 0
Metadata: IndexId = -1              Metadata: ObjectId = 0              m_prevPage = (0:0)
m_nextPage = (0:0)                  pminlen = 0                         m_slotCnt = 1
m_freeCnt = 40                      m_freeData = 8150                   m_reservedCnt = 0
m_lsn = (5148:180860:473)           m_xactReserved = 0                  m_xdesId = (0:0)
m_ghostRecCnt = 0                   m_tornBits = 0                      DB Frag ID = 1

Allocation Status

GAM (5:2) = NOT ALLOCATED           SGAM (5:3) = NOT ALLOCATED          PFS (5:469104) = 0x4 100_PCT_FULL
DIFF (5:6) = NOT CHANGED            ML (5:7) = NOT MIN_LOGGED           


Blob row at: Page (5:474258) Slot 0 Length: 8054 Type: 3 (DATA)

Blob Id:2794796220416



000000464FAFA06E:  0044002b  006f0051  00550038  00520058 +.D.Q.o.8.U.X.R.
...

@CRAIG Votre sortie:

enter image description hereenter image description hereenter image description hereenter image description here

3
Randi Vertongen

Pas sûr, mais la jointure entre sys.allocation_units et sys.partitions n'est pas tout à fait juste par Docs . PAR EXEMPLE

select bd.file_id, bd.page_id, p.*
from sys.dm_os_buffer_descriptors bd
left join sys.allocation_units au
 on bd.allocation_unit_id = au.allocation_unit_id
left join sys.partitions p
  on ( au.type in (1,3) and au.container_id = p.hobt_id )
    or
     ( au.type = 2 and au.container_id = p.partition_id )
where database_id = 2

Vous pouvez également essayer de examiner quelques pages de TEMPDB pour voir si l'en-tête et les données de la page vous donnent une indication d'où ils viennent.

Pourriez-vous essayer cette requête et envoyer la sortie?

SET NOCOUNT ON;

SELECT
(DATEDIFF(n, dtat.transaction_begin_time, GETDATE())) as duration, *
FROM 
sys.dm_tran_active_transactions dtat 
INNER JOIN sys.dm_tran_session_transactions dtst 
ON dtat.transaction_id = dtst.transaction_id
INNER JOIN sys.dm_exec_sessions es 
ON dtst.session_id = es.session_id
WHERE es.session_id > 50 

Merci,

Crainder

1
Craig Efrein