SQL Server 2005: memoria di sistema insufficiente per eseguire questa query


13

Uno dei nostri server SQL, che è rimasto stabile per un bel po 'di tempo (anni), ha recentemente lanciato errori di memoria insufficienti. Dal registro eventi dell'applicazione, vediamo:

ID evento: 701

Descrizione: memoria di sistema insufficiente per eseguire questa query.

Il nostro team che gestisce questo server è composto principalmente da sviluppatori che raddoppiano le mansioni di amministratore di sistema. Tuttavia, la nostra competenza principale è lo sviluppo. Detto questo, non siamo in grado di risolvere il problema. Abbiamo setacciato forum e quant'altro e non abbiamo trovato nulla che corrisponda

Quindi, ecco alcuni dettagli per aiutare nella risoluzione dei problemi:

  • La memoria minima del nostro server è impostata su 0.
  • La memoria massima del nostro server è impostata su 2000.
  • La memoria fisica totale è di 3.325,85 MB (da sysinfo).
  • La memoria virtuale totale è di 7,10 GB (da sysinfo).
  • Non stavamo usando AWE per allocare memoria, ma ora vediamo se fa la differenza.
  • Questo errore è stato generato da un processo che stava eseguendo il backup di un registro delle transazioni, senza eseguire una query.
  • Abbiamo molti server collegati. I tipi di RDBMS dall'altro lato sono i sistemi SQL Server (2005 e 2000), Oracle 10g e OSI PI.
  • È intermittente a questo punto. Sembra che non possiamo correlare qualsiasi momento o evento agli errori.
  • Naturalmente, il riavvio sembra farla scomparire per un po ', il che ha senso a causa della natura del messaggio di errore.
  • Questo server triplica come un server applicazioni (un paio di servizi Windows) e un server Web, oltre che come server database.

MODIFICARE:

Siamo su SP3. La maggior parte dei post che abbiamo trovato erano pre SP1, il che non si applica a noi.

SELECT  SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

ritorna

9.00.4035.00 SP3 Standard Edition


Puoi rivedere il registro errori di SQL Server in quanto potrebbero esserci ulteriori dettagli su questo errore.
John Sansom,

Risposte:


4

Suggerirei di usare anche il parametro di avvio -g. Sembra funzionare per la maggior parte delle persone e probabilmente funzionerà anche per te. La mia unica preoccupazione sarebbe che il problema sottostante non potesse essere risolto. Ad esempio, se si verifica una perdita di memoria dovuta a un server collegato e l'MTL viene aumentato a 512 Mb, sarà solo un periodo più lungo tra i problemi di memoria? Non conosco la risposta ma tendo ad essere d'accordo con UndertheFold in quanto un perfmon potrebbe essere un buon inizio.


7

Il messaggio di errore "Memoria di sistema insufficiente per eseguire questa query". si riferisce al fatto che Virtual Address Space (VAS) non è disponibile e non la memoria in senso convenzionale, ovvero all'interno dello spazio del processo di SQL Server.

Dato che stai usando solo 3 GB su questo server e SQL Server è stato assegnato fino a 2 GB, questo significa che il sistema operativo e, soprattutto, qualsiasi altra cosa sulla scatola ha meno di 1 GB con cui giocare. Non è un sacco di memoria.

Se questo problema è effettivamente il risultato di una perdita di memoria, viene consumato il VAS esterno allo spazio del processo di SQL Server (memToLeave).

Suggerirei di utilizzare il parametro di avvio -g per assegnare più memoria alla porzione memToLeave.

Vedere il seguente articolo per ulteriori informazioni:

http://www.johnsansom.com/sql-server-memory-configuration-determining-memtoleave-settings/

Potresti anche voler ridurre l'impostazione di memoria massima di SQL Server, ma lo farei come ultima risorsa.


Buon articolo Grazie anche per averlo creato! Abbiamo diversi scaricamenti di AppDomain nei nostri registri SQL. Abbiamo solo 2 procedure CLR memorizzate e sostanzialmente ottengono e inseriscono dati da / verso un servizio web. Sembra strano che queste 2 stored procedure CLR utilizzino troppa VAS pronta all'uso.
Aaron Daniels,

Prego. Come forse saprai, l'allocazione predefinita per memToLeave è solo 256 MB. Questa è una sandbox piuttosto piccola per i tuoi AppDomain, tutto il CLR / codice gestito, le query del server collegato, SSIS ecc. Specialmente se stai utilizzando tutta la memoria disponibile sul server. Suggerirei di raddoppiarlo a 512 MB usando il parametro di avvio -g.
John Sansom,

1

Questo potrebbe essere correlato a una perdita di memoria di un driver del server collegato, secondo questo thread del forum :

Di seguito è ciò che Microsoft ci ha detto.

Apparentemente, l'elaborazione dei dati utilizzando un server collegato in particolare il driver fox pro provoca perdite di memoria che si accumulano nel tempo.


0

Questo server triplica come un server applicazioni (un paio di servizi Windows) e un server Web, oltre che come server database.

Vorrei impostare la tua memoria minima - è del tutto possibile che questi altri processi "rubino" la memoria da SQL

È possibile eseguire un registro contatore utilizzando perfmon per confermare questo e / o darsi ulteriori informazioni per identificare quale sia il vero problema.


0

Riferimento tratto da questo blog!

Esistono diverse alternative per risolvere questo problema.

Innanzitutto, controlla le impostazioni di SQL Server per "memoria minima del server" e "memoria massima del server". Se hai riscontrato differenze minime in entrambi i valori, aumenta la "memoria massima del server".

In secondo luogo, ho scoperto query a esecuzione prolungata con le informazioni sull'utilizzo della memoria e se questa query è inattiva, verifica e termina questo processo. L'ottimizzazione delle prestazioni del database è una cosa importante per l'utilizzo della memoria.

In terzo luogo, abbiamo scoperto gli utilizzi dell'indice per query a esecuzione prolungata perché senza l'indicizzazione corretta il tuo I / O DISK di sistema aumenta e ha un impatto diretto sulla memoria.

In quarto luogo, controllare le dimensioni del file di paging della memoria virtuale e aumentare le dimensioni di questo file.

In quinto luogo, controllare la dimensione della "memoria minima per query", in realtà è di default 1024 KB, ma in rare situazioni è possibile ridurre la dimensione di questo parametro. In realtà, questo non è consigliabile, ma puoi provarlo.

In sesto luogo, provare a eseguire questo comando DBCC e, di nuovo, non è consigliabile perché potrebbe influire sulle prestazioni complessive del server. Ma puoi provare questo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.