KB3074434 - ΕΠΙΔΙΌΡΘΩΣΗ: Σφάλμα ανεπαρκούς μνήμης όταν ο χώρος εικονικών διευθύνσεων της διαδικασίας SQL Server είναι πολύ χαμηλός στη διαθέσιμη μνήμη

Ισχύει για
SQL Server 2012 Service Pack 3 SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Enterprise Core SQL Server 2012 Standard

Μετά την εφαρμογή αυτής της ενημερωμένης έκδοσης, πρέπει να προσθέσετε τη σημαία παρακολούθησης -T8075 ως παράμετρο εκκίνησης για να ενεργοποιήσετε αυτήν την αλλαγή.

Συμπτώματα

Όταν εκτελείτε ένα ερώτημα σε μια έκδοση 64-bit του Microsoft SQL Server 2012, λαμβάνετε ένα μήνυμα λάθους ανεπαρκούς μνήμης που μοιάζει με το ακόλουθο στο αρχείο καταγραφής σφαλμάτων SQL Server:

Σημείωση

Αποτυχία εκχώρησης σελίδων: FAIL_PAGE_ALLOCATION 513

Τα ερωτήματα καθυστερούν πολύ να ολοκληρώσουν την εκτέλεσή τους και συναντούν SOS_MEMORY_TOPLEVELBLOCKALLOCATOR αναμονές.

Εξετάζοντας τα ακόλουθα σημεία πληροφοριών, θα διαπιστώσετε ότι υπάρχει πολύ μικρός διαθέσιμος χώρος εικονικών διευθύνσεων:

  • DBCC MEMORYSTATUS - Ενότητα Process / System Counts - Διαθέσιμη εικονική μνήμη
  • DMV: sys.dm_os_process_memory - στήλη virtual_address_space_available_kb

Αυτές οι τιμές ξεκινούν από περίπου 8 terabyte (TB) σε μια διαδικασία x64 και συνεχίζουν να κατεβαίνουν και να φτάνουν σε μερικά gigabyte (GB). 

Όταν βρίσκεστε στο στάδιο όπου ο διαθέσιμος χώρος εικονικών διευθύνσεων είναι πολύ χαμηλός, τα ερωτήματα που προσπαθούν να εκτελέσουν εκχώρηση μνήμης ενδέχεται επίσης να αντιμετωπίσουν έναν τύπο αναμονής CMEMTHREAD.

Τα ακόλουθα σημεία δεδομένων θα συνεχίσουν να αυξάνονται με την πάροδο του χρόνου:

  • DMV: sys.dm_os_process_memory και sys.dm_os_memory_nodes - στήλη virtual_address_space_reserved_kb
  • DBCC MEMORYSTATUS - Τμήμα διαχείρισης μνήμης - Δεσμευμένο VM

Αυτές οι τιμές συνήθως αυξάνονται σε πολλαπλάσια της τιμής "μέγιστη μνήμη διακομιστή" έως και περίπου 8 TB.

Αιτία

Όταν η διεργασία SQL Server έχει φτάσει σε κατάσταση όπου συνολική μνήμη διακομιστή = μνήμη διακομιστή προορισμού = μέγιστη μνήμη διακομιστή, υπάρχουν πολιτικές στη διαχείριση μνήμης SQL Server που επιτρέπουν στις νέες εκχωρήσεις να ζητούν πολλαπλές σελίδες 8 KB για να επιτύχουν προσωρινά. Επαναλαμβανόμενο μοτίβο εκχώρησης υπό τέτοιες συνθήκες μπορεί να προκαλέσει κατακερματισμό των μπλοκ μνήμης και την κατανάλωση χώρου εικονικών διευθύνσεων. Εάν αυτή η διαδικασία επαναληφθεί πολλές φορές, θα εξαντληθεί ο χώρος εικονικών διευθύνσεων SQL Server και θα παρατηρήσετε τα συμπτώματα που αναφέρθηκαν προηγουμένως.

Επίλυση

Πληροφορίες αθροιστικής ενημέρωσης

Το πρόβλημα διορθώθηκε για πρώτη φορά στην ακόλουθη αθροιστική ενημερωμένη έκδοση του SQL Server.

Σύσταση: Εγκαταστήστε την πιο πρόσφατη αθροιστική ενημερωμένη έκδοση για SQL Server

Κάθε νέα αθροιστική ενημερωμένη έκδοση για SQL Server περιέχει όλες τις επείγουσες επιδιορθώσεις και όλες τις ενημερώσεις κώδικα ασφαλείας που συμπεριλήφθηκαν με την προηγούμενη αθροιστική ενημερωμένη έκδοση. Συνιστάται να κάνετε λήψη και εγκατάσταση των πιο πρόσφατων αθροιστικών ενημερώσεων για SQL Server:

Αυτή η επείγουσα επιδιόρθωση αποτρέπει τόσο την εξάντληση της μνήμης όσο και τη συνεχή μείωση του διαθέσιμου χώρου εικονικών διευθύνσεων που ενδέχεται να αντιμετωπίσετε.

Κατάσταση

Η Microsoft έχει επιβεβαιώσει ότι πρόκειται για ένα ζήτημα που αφορά τα προϊόντα της Microsoft που παρατίθενται στην ενότητα "Ισχύει για".

Περισσότερες πληροφορίες

  • Στα Windows 2012 R2 ο χώρος εικονικών διευθύνσεων μπορεί να αυξηθεί έως και 128 TB. Επομένως, ενδέχεται να μην παρατηρήσετε αυτό το ζήτημα σε περιβάλλοντα Windows 2012 R2. Για περισσότερες πληροφορίες, ανατρέξτε στο ακόλουθο θέμα στο Κέντρο ανάπτυξης των Windows:

    Όρια μνήμης για εκδόσεις Windows και Windows Server

  • Εάν βλέπετε συνεχή ανάπτυξη στο χώρο εικονικών διευθύνσεων ακόμα και μετά την εφαρμογή της ενημέρωσης κώδικα, μπορείτε να προσδιορίσετε ποια ερωτήματα ή λειτουργίες απαιτούν μεγάλα τμήματα μνήμης, χρησιμοποιώντας το Page_allocated εκτεταμένο συμβάν. Ένα δείγμα δέσμης ενεργειών μοιάζει κάπως έτσι:

    CREATE EVENT SESSION [memory_tracking] ON SERVER
    ADD EVENT sqlos.page_allocated(
        ACTION(package0.callstack,sqlos.cpu_id,sqlos.task_address,sqlos.worker_address,sqlserver.database_id,sqlserver.query_hash,sqlserver.request_id,sqlserver.session_id,sqlserver.sql_text)
        WHERE ([number_pages]>(1)))
    ADD TARGET package0.event_file(SET filename=N'E:\Data\MSSQL11.MSSQLSERVER\MSSQL\Log\memory_tracking.xel')
    WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=PER_CPU,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
    GO
    
    
    

    Συνήθως, πρόκειται για αντίγραφα ασφαλείας αρχείων καταγραφής και εργασίες συντήρησης ευρετηρίου, οι οποίες συμβαίνουν συχνά.