Odzyskiwanie pamięci z SQL Server

10

Mam instancję programu SQL Server, której użycie pamięci stopniowo rośnie, dopóki system Windows nie da jej więcej. Wydaje się logiczne, że sporadyczny wynik dużego zapytania spowodowałby wzrost instancji.

Czy jest jakiś sposób, aby przekonać SQL Server do zwolnienia pamięci, której nie potrzebuje więcej (oprócz ponownego uruchomienia usługi)?

Edycja:
Używam SQL Server 2000 SQL Server 8.00.2039 - SP4 (edycja standardowa)

Udało mi się to ustalić za pomocą następującego zapytania:

SELECT 'SQL Server ' 
    + CAST(SERVERPROPERTY('productversion') AS VARCHAR) + ' - ' 
    + CAST(SERVERPROPERTY('productlevel') AS VARCHAR) + ' (' 
    + CAST(SERVERPROPERTY('edition') AS VARCHAR) + ')'
BIBD
źródło

Odpowiedzi:

19

Właśnie tak powinien działać SQL Server .

Jeśli masz inne usługi na tym komputerze i nie chcesz, aby SQL zużywał całą dostępną pamięć, musisz ustawić maksymalną pamięć serwera. Zobacz Opcje pamięci SQL Server w MSDN.

Portman
źródło
1
Brzmi bardziej jak błąd niż funkcja ... to się przydarza. SQL Server zajmuje 95% dostępnej pamięci RAM, aby coś zrobić, i nie zwalnia go po zakończeniu.
Alchemical,
1
@ Alchemical Zależy, co rozumiesz przez „ kompletny ”. SQL Server może korzystać z całej pamięci RAM w komputerze; używając go jako pamięci podręcznej dysku. Nie „ kończy ” używania go jako pamięci podręcznej dysku, dopóki nie skończysz używać SQL Server.
Ian Boyd
8

Inne plakaty mają rację, że jest to zgodne z projektem, ale absolutnie chcesz ograniczyć maksymalną pamięć do nieco mniejszej pamięci RAM serwera. Pomyśl o tej sekwencji wydarzeń:

  • SQL 2000 działa szczęśliwie, zużywa całą pamięć RAM serwera
  • Ktoś uruchomił RDP lub musisz pobrać IE, aby pobrać poprawkę, albo zaczniesz tworzenie kopii zapasowych, cokolwiek
  • SQL musi zwolnić miejsce i zwolnić wystarczającą ilość pamięci, aby system operacyjny mógł działać
  • Wydajność jest do bani, zwalniając pamięć i stronicowanie na dysk
  • Wszystko idzie dobrze, gdy jest stabilne
  • Druga operacja zostaje zakończona, a SQL stopniowo odzyskuje zwolnioną pamięć RAM
  • Powtarzać

Aby tego uniknąć, ustaw maksymalny limit pamięci serwera na około 80–90% faktycznej pamięci fizycznej. Instrukcje dotyczące SQL 2000: http://msdn.microsoft.com/en-us/library/ms178067.aspx

sh-beta
źródło
Pamiętaj, że jest to zachowanie 2005 i 2008 - 2000 nie zwalnia pamięci na żądanie do systemu operacyjnego.
Paul Randal
2
Nie do końca na żądanie, ale zwalnia pamięć z powrotem do systemu operacyjnego. Z linku, który napisałem: „Gdy SQL Server dynamicznie korzysta z pamięci, okresowo odpytuje system w celu ustalenia ilości wolnej pamięci fizycznej. W systemie Microsoft Windows 2000 SQL Server powiększa lub zmniejsza pamięć podręczną bufora, aby zachować wolną pamięć fizyczną między 4 MB i 10 MB w zależności od aktywności serwera. Utrzymanie tej wolnej pamięci zapobiega stronicowaniu systemu Windows 2000. Jeśli jest mniej wolnej pamięci, SQL Server zwalnia pamięć do Windows 2000. Jeśli jest więcej wolnej pamięci, SQL Server przydziela pamięć do puli buforów. ”
sh-beta
Ach - to prawda - polega to na wycofaniu odrobiny pamięci fizycznej - masz rację!
Paul Randal
4

Zostanie zwolniony tylko wtedy, gdy system operacyjny zasygnalizuje, że RAM jest głodny lub jeśli zatrzymasz i uruchomisz ponownie usługę; należy ograniczyć maksymalną ilość, jaką SQL zużyje, konfigurując wartość „maksymalnej pamięci serwera”. Jeśli na serwerze nie ma nic innego, co wymagałoby pamięci RAM (i mam nadzieję, że nie ma), nie martwiłbym się tym.

SqlACID
źródło
4

Podsumowując odpowiedzi:

Nie ma sposobu, aby zachęcić MS SQL Server do zwolnienia pamięci, której nie potrzebuje natychmiast. Program SQL Server powinien automatycznie zwalniać pamięć, gdy jest to wymagane, ale nie wcześniej. A jeśli masz problemy z pamięcią, powinieneś zmniejszyć wartość opcji pamięci „maksymalna pamięć serwera”.

BIBD
źródło
3

SQL Server zużywa pamięć i jej nie zwraca, chyba że system operacyjny poinformuje ją o presji pamięci. Jak wskazał Portman, jest to zgodne z projektem, a jeśli chcesz ograniczyć zużycie pamięci, musisz ustawić maksymalną pamięć serwera, z której będzie korzystać SQL Server.

K. Brian Kelley
źródło
2

Pamiętaj, że zachowanie, które wszyscy opisujesz, pochodzi od SQL Server 2005, kiedy menedżer pamięci został przepisany, aby (między innymi) odpowiadać na żądania ciśnienia pamięci z systemu operacyjnego.

W przypadku SQL Server 2000 i wcześniej, gdy tylko pobierze pamięć, nie zwróci jej, bez względu na to, jak bardzo system operacyjny na to krzyczy.

CodeSlave - korzystasz z 2000, 2005 lub 2008 roku?

Paul Randal
źródło
Ach ha ... tak, rzeczywiście SQL 2000.
BIBD
3
Nie zwraca go, gdy system operacyjny tego krzyczy, ale zwróci go, jeśli zobaczy, że system operacyjny znajduje się poniżej pewnego progu wolnej pamięci fizycznej. Zobacz msdn.microsoft.com/en-us/library/ms178067.aspx
sh-beta
Aby wzmocnić to, co powiedział sh-beta, SQL Server 2000 zwalnia pamięć tylko wtedy, gdy zauważy, że w systemie operacyjnym jest mało pamięci fizycznej, ponieważ dopiero w Windows XP (2001) system Windows dodał interfejs API, aby „ system operacyjny mógł krzyczeć o to ”( msdn.microsoft.com/en-us/library/aa366799(v=vs.85).aspx ). SQL Server 2005 korzysta z tej nowej funkcji systemu Windows. Ale kiedy napisano SQL Server 2000, system operacyjny nie mógł krzyczeć o to, zmuszając SQL Server do okresowego sprawdzania ciśnienia pamięci.
Ian Boyd
0

Wiem, że stare pytanie, ale sposobem na zmuszenie (przynajmniej nowszego) SQL do zwolnienia pamięci jest napisanie aplikacji przydzielającej tak dużo pamięci, jak to możliwe w porcjach, czekając (powiedzmy) 15 sekund (np. Sleep (15000)) oraz uwolnienie przydzielonej pamięci i wyjście; Próbowałem tego i SQL zwalnia pamięć, więc system odzyskuje pamięć RAM; pisanie kodu takiego jak powyższy jest prawie banalne przy użyciu C / C ++, wystarczy kwestia skonfigurowania łańcucha przewodów do przechowywania łańcucha bloków pamięci (wskaźnik i rozmiar), stopniowo zmniejszaj rozmiar, gdy „malloc ()” zawiedzie, dopóki nie osiągnie minimum (powiedzmy mniej niż 1024), a następnie przeglądaj połączoną listę, aby zwolnić przydzielone bloki

Przechodzień
źródło