none
Server mit der Zeit sehr langsam, belegt viel Speicher RRS feed

  • Frage

  • Heute meldeten mir meine Kollegen, dass unser CRM System sehr langsam ist und plötzlich wurden Anfragen gar nicht mehr beantwortet. Ich schaute auf dem Server nach (Win Server 2016) und sah, das der SQL Server mittlerweile eine Speichernutzung von über 2GB aufwies (im Taskmanager). Damit war mein Systemspeicher fast komplett voll. Eine Tabelle des Servers nahm keine Datenänderung mehr entgegen - es kommt zum Timeout, andere Tabellen waren davon nicht betroffen. Sehr seltsam.. hatte ich aber schon einmal...

    Darauf hin startete ich den Server neu und alles lief wieder super.

    Woran kann das liegen? Lässt sich die Speichernutzung irgendwie erklären? Falls der Server im Hintergrund viel Speicher mit der Zeit ansammelt, lässt sich das irgendwie automatisch "bereinigen"? Warum tritt der Fehler bei einer Tabelle auf und bei anderen nicht?

    Viele Grüße


    .::datekk::.


    • Bearbeitet datekk2 Freitag, 6. September 2019 08:34
    Freitag, 6. September 2019 08:33

Antworten

Alle Antworten

  • Hi,

    setzt Du wirklich SQL Server Express ein? Falls ja, kann die Instanz max. 1,4 GB RAM verwalten. Alles, was darüber hinausgehen würde, wird dann vom System an sich u.a. über Auslagerungsdateien, ... (in der Regel also Festplattenzugriffe, die die Performance extrem runterziehen) umgesetzt.

    Es empfiehlt sich daher bei höherem RAM Bedarf nicht, Express einzusetzen.

    Wenn dein Server aber an sich nur 2 GB RAM hat, solltest Du mal darüber nachdenken, das zu erhöhen. Das ist weder zeitgemäß noch für ein Windows Server 2016 System ausreichend.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 6. September 2019 08:41
    Moderator
  • Hi, der Server hat insgesamt 8GB Arbeitsspeicher. Und ja, es ist eine Express Instanz. Jetzt nach dem Neustart liegt die Speichernutzung bei 380MB.

    Gibt es die Möglichkeit einer automatischen Bereinigung oder wäre es ratsam, den Server alle x Tage mal neu starten zu lassen?


    .::datekk::.

    Freitag, 6. September 2019 08:44
  • Hi,

    man kann den SQL Server Dienst bspw. jede Nacht neu starten lassen (den ganzen Server neu zu starten wäre unnötig). Aber schön oder wirklich sinnvoll ist das nicht.

    SQL Server baut, wie andere DBMS auch, bspw. verschiedene Caches auf, um Abfragen schneller bedienen zu können. Das verhinderst Du mit solchen Aktionen natürlich.

    Leg dir lieber eine andere Edition zu (Standard, ...) und sorg dafür, dass ausreichend Speicher zur Verfügung steht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 6. September 2019 08:49
    Moderator
  • Gibt es die Möglichkeit einer automatischen Bereinigung oder wäre es ratsam, den Server alle x Tage mal neu starten zu lassen?

    Moin,

    was da passiert, ist im Groben folgendes:

    • bei lesenden Abfragen kommen die Ergebnisse in den Cache und verbleiben dort, bis sie ausaltern (sprich: kein Cache mehr da, aber neue Leseabfragen werden ausgelöst)
    • Der Cache wächst, bis der konfigurierter Instanz-Speicher erreicht ist.
    • Bei Express ist es so, dass nur 1 GB RAM adressiert werden kann, dieses Limit ist nach einer Weiter->Weiter->Finish-Installation aber nicht konfiguriert.
    • Wenn man die SQL-Instanz neu startet, ist der Cache leer. Das heißt, der RAM ist zwar frei, aber die zwischengespeicherten Ergebnisse sind halt auch weg und müssen aus den Datendateien besorgt werden.

    Es kann sein, dass die Abfragen der CRM-Anwendung zu viele Daten lesen. Es kann auch sein, dass zu lange Datenfelder wie BLOB oder TEXT inflationär verwendet werden. Auf all das hat nur der Entwickler der Applikation einen Einfluss, aber nicht Du.

    Was manchmal vorkommt, ist, dass vergessen wird, ein Feld, nach dem man sucht oder selektiert, zu indizieren. Das kann auch zu dem bei Dir beobachteten Verhalten führen, da Daten ja dann komplett gelesen werden.

    Ich würde folgendes machen:

    1. RAM-Begrenzung für die Instanz auf 1024 MB setzen
    2. Instanz und Applikation so lange laufen lassen, bis der RAM-Verbrauch lt. Task Manager diese Größe auch erreicht
    3. Dann im PerfMon die Werte der folgenden Counter auslesen und hier posten: 
    • MSSQL$<Instanz>:Memory Manager: „Zielserverspeicher“
    • MSSQL$<Instanz>:Memory Manager: „Serverspeicher gesamt“
    • MSSQL$<Instanz>:Memory Manager: „Datenbank-Cachespeicher“
    • MSSQL$<Instanz>:Memory Manager:„Gestohlener Serverspeicher“
    • MSSQL$<Instanz>:Puffer-Manager: „Lebenserwartung der Seite“
    • MSSQL$<Instanz>:Puffer-Manager: „Puffercache-Trefferquote“

    Wenn der Zielspeicher deutlich über dem Gesamtspeicher liegt, braucht die Datenbank mehr RAM. Da musst Du entweder mit dem Entwickler der Applikation sprechen (über Schema- und Abfragenoptimierung) oder mit Deinem Lizenzmanagement (über Anschaffung von SQL Standard-Lizenzen).


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Freitag, 6. September 2019 09:00
  • Ich konnte das Problem ausfindig machen. Einer meiner Kollegen tätigte eine Marketingkampagne. Zur Selektierung der Kunden wird eine ziemlich große Ergebnismenge durch eine Abfrage geliefert, welche der Mitarbeiter zu seinem gewünschten Ergebnis filtert. Ich nehme an, dass diese Abfrage in den Cache gewandert ist und die Datenbank abgewürgt hat.

    Gibt es bei den Abfragen oder Sichten im Einzelfall Einstellungsmöglichkeiten die der Datenbank sagen, dass diese nicht gecacht werden sollen?



    .::datekk::.

    Dienstag, 10. September 2019 07:25
  • Nein, eine solche Einstellmöglichkeit gibt es nicht, der SQL Server regelt selbst, was er in den Cache (genauer Buffer Pool) nimmt und wie lange es vorgehalten wird.

    Wenn es denn wirklich irgendwie am Cache liegen sollte, kann man den mit DBCC DROPCLEANBUFFERS (Transact-SQL) leeren, dann sind aber auch die guten Cache Daten für die anderen Abfragen weg.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Dienstag, 10. September 2019 12:16
  • OK, lieben Dank erstmal. Ich werde diesen Code nutzen, wenn die Abfrage für die Marketingaktion ausgeführt wird, was nicht sooo häufig der Fall ist.

    Später werde ich versuchen, das Abfrageergebnis im Vorfeld stärker vom User eingrenzen zu lassen, sodass die Ergebnismenge sich deutlich reduziert.

    Viele Grüße


    .::datekk::.

    Dienstag, 10. September 2019 12:22
  • Hallo,
    Du kannst die Speicherverwendung der Instanz einstellen.
    Das geht etwa so:

    EXEC sys.sp_configure N'show advanced options', N'1'  RECONFIGURE WITH OVERRIDE
    GO
    EXEC sys.sp_configure N'min server memory (MB)', N'1500'
    GO
    EXEC sys.sp_configure N'max server memory (MB)', N'2222'
    GO
    RECONFIGURE WITH OVERRIDE
    GO
    EXEC sys.sp_configure N'show advanced options', N'0'  RECONFIGURE WITH OVERRIDE
    GO
    Siehe: https://docs.microsoft.com/de-de/sql/database-engine/configure-windows/server-memory-server-configuration-options?view=sql-server-2017

    Das Maximum von 1.4 GB gilt für den "Puffer Pool". Der SQL Server kennt aber weitere Speicherpools.
    Hier haben die letzten Jahre diverse Anpassung der Beschreibung seitens MS gehabt. 
    Siehe: https://docs.microsoft.com/de-de/sql/sql-server/editions-and-components-of-sql-server-2017?view=sql-server-2017

    HTH
    Grüße Alexander 

    Mittwoch, 11. September 2019 17:36