keine Annahme von Anfragen beim Leeren des RAM

MajorTom67

Registered User
Hallo zusammen,
habe dieses Forum gerade neu entdeckt und wahrscheinlich noch nicht die richtige Suchroutine...

Arbeite mit einem MS SQL2000-Server (DELL) mit 2 3,4GHz-Xeon, 8 GB RAM, wovon 6 fix der SQL-DB zugewiesen sind, und 2GB SWAP. Der Server wird aus zwei Subnetzen angesprochen, hat allerdings nur eine IP aus einem Subnetz.
Es arbeiten ca. 100 User auf der DB (ständige Abfragen und neue Einträge), und die Beschwerden mehren sich.
Wie wir jetzt herausgefunden haben, wird der RAM mit den Anfragen bis zu 70% vollgeschrieben, und dann erfolgt das herausschreiben auf die Festplatte. Und genau in dieser Zeit nimmt der Server keinerlei Anfragen mehr an und die User monieren Wartezeiten von bis zu einer Minute, was unser Chef als nicht hinnehmbar bezeichnet.
Hat jemand eine Idee, ob evtl. die Auslagerungsdatei zu klein ist, oder wie ich den Server dazu bringe, während des Herausschreibens auf die HD trotzdem Anfragen anzunehmen?
Liebe Grüße,
Tom
 
Was Du beschreibst klingt mir eher wie ein Flaschenhals, der Server wird wohl auch waehrend er swapped Anfragen annehmen, sonst bekaemen die Anwender nicht verspaetet Antwort sondern keine oder Fehlermeldungen.

Sprich an irgendeiner Stelle (Flaschenhals) stauen sich die Dinge an und der Anteil der hinten anstehenden und deshalb merklich spaeter erledigten Anfragen waechst auch merklich. (Wenn Festplattenzugriffe so etwas verursachen ist das Limit wohl schon erreicht.)
Problem wird jetzt sein den Flaschenhals zu finden und die Frage was Ihr konkret dagegen tun koennt (z.B. stored procedures koennen "vorkompiliert" hinterlegt werden und sind auch sonst merklich schneller als individuelle queries auch kann man geschickt oder klotzig Indices bauen -> Wenn man den Daumen auf der Datenstruktur hat).

Was den Speicher angeht ... welcher wird da geswapped der fuer die DB-engine reservierte oder der "andere" und wie intensiv werden die denn jeweils genutzt?

Was den fuer die DB-engine reservierten angeht weiss ich dass dort Indices und Daten sowie stored procs gecached werden.
Unter Umstaenden testet doch dann mal der DB-engine beizubringen die Daten haeufiger zu "flushen" also die Aenderungen aus dem Arbeitsspeicher auf die Platten zu schreiben in der Hoffnung dass dabei zwar haeufiger aber geringere "Nebenlast" anfaellt.

Sollte der regulaere Speicher geswapped werden gebt dem System mehr und der DB-engine weniger wenn's Wirkung zeigt kann man evtl. Budget fuer mehr RAM locker machen.

Nochwas ... Dass der RAM mit "Anfragen vollgeschrieben wird" klingt mir etwas naja "fremd". Was ich mir vorstellen kann ist aber, dass die Transaktionslogs im Speicher gefuehrt werden und infolge vieler updates richtig gut wachsen (das kommt dem was Du beschreibst schon nahe). Mal testen ob es hilft die fruehzeitig abzuschneiden dass sie gar nicht erst so gross werden und nicht wegschreiben. Ist zwar riskant weil man damit ein Sicherheits-feature aushebelt aber naja. Auch hier die Anregung lieber haeufiger aber kleinere Haeppchen wegschreiben lassen als auf's dicke Ende warten ;> .

Ciao,
Mercy.
 
Hi Mercy,
danke für die schnelle Antwort!
Bin halt nich so der Datenbank-Admin, mehr im Netzwerk und auf einzelnen Maschinen zuhause... Deshalb die fehlerhafte Terminologie.
Der Flaschenhals scheint tatsächlich die HD zu sein, wel, wie wir herausbekommen haben, immer beim Schreiben auf die HD diese extremen Verzögerungen auftreten. Wenn während des Herausschreibens mehrere Anfragen von einem Client ausgelöst werden, dann kommt die ganze Sache auch gern durcheinander, da die lokale Anwendung (Eigenentwicklung, auf dot.net basierend) auf sofortige Antwort vom Server geeicht ist.
Vielleicht sind tatsächlich die Indices zu klotzig, da kenne ich mich nicht aus, das müßte ich unseren Entwicklern vorlegen. Als Hinweis vielleicht: die DB wächst täglich um 260-270MB
Leider arbeitet mom keiner auf der DB, Samstags ist früher Feierabend, daher kann ich mit den mir bekannten Bordmitteln (Systemmonitor) nicht ermitteln, welche Seiten geswapped werden. Wir hatten anfänglich das Prob, daß die DB nicht auf die vollen 6 reservierten GB zugreifen wollte, wass durch WPA (?) geändert wurde. Gebessert hat sich praktisch nichts.
Mit dem "Vollschreiben des RAM" waren tatsächlich die Transactionlogs gemeint, und da wurde schon reduziert, soweit möglich, da unsere Chefitäten umfangreiche Recherche-Möglichkeiten zur Überwachung der Leistung der Mitarbeiter verlangen. Mir persönlich ist leider auch nicht bekannt, an welchem Hebel gedreht werden müßte, um die "kleineren Häppchen" wegschreiben zu lassen, und unsere Entwickler reagieren immer genervt, wenn ein "Laie" mit Vorschlägen kommt (obschon sie sich im Nachhinein manchmal auch als richtig herausstellen...). Dieses Ergebnis hatte ich schon, als ich darauf hinwies, daß laut Microdoof SQL-DB'en durchaus hin und wieder defragmentiert werden sollten, was bis heute nicht passiert ist. Auch die HD ist ziemlich fragmentiert (bei der letzten Überprüfung über 80%), da das aber ein RAID-Array ist, meinte unser Admin mit SQL-Kenntnissen, das bräuchte man nicht defragmentieren...
Uiii, das war jetzt aber 'ne Menge Text. Wäre toll, wenn Du mir da unter die Arme greifen könntest (gerne natürlich auch jemand weiteres). Habe zwar mom Urlaub, kann mich aber von zuhause auf den Server wählen.
Liebe Grüße,
Tom
:confused:
 
MajorTom67 said:
Vielleicht sind tatsächlich die Indices zu klotzig
Na das mit dem klotzig war nicht wirklich negativ gemeint; Die MS-SQL Server 6-7 waren noch schlau genug zu versuchen, Indices zu benutzen die bereits die benoetigten Spalten enthielten und dann im optimalen Fall gar nicht mehr auf die eigentliche Datengrube zuzugreifen. Das bringt bei lesen/suchen Aktionen schon einiges (man denke nur an die unzaehligen sortierten Auflistungen die Anwender sich anzeigen lassen) zumal die Indices meist eher in den Arbeitsspeicher passen als dann auch die gesamte Datengrube ... Wie gross ist eigentlich die Datenbank/sind die Indices?

Ich habe schonmal eine "objektorienterte" Datenstruktur auf einer relationalen engine abgebildet ... sollte "Engine-unabhaengig" sein (Chefetage und Marketing wollten es so), da kamen dann halt alle Spalten auch in die Indices rein und die Hardware Anforderungen wurden entsprechend hoch gezogen ;>
Wir hatten da das Problem, dass selbst Erstellungsscripte auf Oracle, PostgreSQL und MS-SQL identisch sein sollten was Konsequenzen mitunter fuer's locking hatte und da mussten dann halt die einzelnen queries so schnell durch sein, dass sie sich nicht im Wege stehn (bei 10 - 15 tsd. Anfragen in 3 Stunden taeglich einmalig zwischen 7 und 10 Uhr halt aber nicht alles aus Dialoganwendungen heraus).
Das war nicht lustig und konnte auch nur interdisziplinaer (Entwicklung client, Entwicklung Server Komponenten, Datenbankentwicklung) halbwegs geloest werden.

Naja aber das mit den indices ist immer ein Zweischneidiges Schwert und hochindividuell unter Einbeziehung der Umfeldes abzuwiegen.
Wenn ich einen schlanken Index habe (optimal nur numerische Werte mit Maschinenwort-Laenge und davon dann auch noch moeglichst wenige) dann sind Such-, Sortier-, Einfuegeoperationen am schnellsten; Die dazugehoerenden Daten schaufeln muss ich allerdings so oder so noch, kein Anwender sucht nach internen Satznummern einer Datenbank.
Die Indices so fett machen, dass sie nicht mehr in den Arbeitsspeicher passen hingegen ist auch Mist und bei haeufigen Aenderungen evtl. zu langsam.
Multiple Indices speziell fuer einzelne Anwendungsfaelle sind eine tolle Sache brauchen aber halt auch zusaetzlichen Platz im Arbeitsspeicher.

MajorTom67 said:
Als Hinweis vielleicht: die DB wächst täglich um 260-270MB
Die DB oder die translogs?
Letztes Jahr hatte ich noch einen Kunden erleben duerfen, der unser "Verfahren" seit Jahren einsetzte. Laut Marketing und Chefetage mussten wir ja DB-unabhaengig sein, weil die Kunden bereits die Server im Einsatz hatten samt hochqualifizierter Administration und Konfiguration und so, wir sollten dann halt in eine bestehende (eh-da) Umgebung rein gehn koennen statt unsere eigene Engine mitzubringen (zu der dann aber auch der Rest optimal passen wuerde).
Naja, jedenfalls kam der Kunde samt Administratoren spezialisiert auf diese DB-Engine nicht damit zurecht (und hatte es auch nicht selbst gemerkt), dass inzwischen die translogs >80 GB auf dem einzigen Volume des Servers beschlagnahmten, als da der Platz ausging sagte der Server halt "uff". ;>
Denen durften wir (Entwickler) dann erstmal verklickern, dass man translogs nach einer Sicherung abschneidet.

MajorTom67 said:
Der Flaschenhals scheint tatsächlich die HD zu sein, wel, wie wir herausbekommen haben, immer beim Schreiben auf die HD diese extremen Verzögerungen auftreten.
...
Wir hatten anfänglich das Prob, daß die DB nicht auf die vollen 6 reservierten GB zugreifen wollte, wass durch WPA (?) geändert wurde. Gebessert hat sich praktisch nichts.
Mit dem "Vollschreiben des RAM" waren tatsächlich die Transactionlogs gemeint, und da wurde schon reduziert, soweit möglich, da unsere Chefitäten umfangreiche Recherche-Möglichkeiten zur Überwachung der Leistung der Mitarbeiter verlangen.

Wenn das so ist ist das wohl tatsaechlich kein Ding fuer die Entwickler mehr, wenn die Datenbankdateien (auch translogs) so gut wachsen, tun sie das ja weil sie das auch sollen. ;>
Nichts desto trotz scheint das Teil ja am Limit zu kratzen.

MajorTom67 said:
Mir persönlich ist leider auch nicht bekannt, an welchem Hebel gedreht werden müßte, um die "kleineren Häppchen" wegschreiben zu lassen,

Mir faellt da was anderes ein...
Es gibt bei MS-SQL pro Datenbank Einstellungsmoeglichkeiten fuer die (initialen) Dateigroessen und die "Zuwachsgroessen", dort wo auch angegeben wird, wo die Dateien liegen sollen (fuer Datenbank und translog).
Dort kann man dann angeben, um wieviel (MB oder %) die Datei vergroessert werden soll, wenn sie voll wird.
Das koennte dann in euerm Fall wenn denn soviele neue Daten anfallen (zumindest in den translogs) helfen. Einfach mal richtig gut groesser machen. Kleine Haeppchen bringen hier wenig weil die Daten in der Datei ja beim Vergroessern nicht unberuehrt bleiben. Wenn ihr den Platz auf dem Datenvolume nicht anderweitig braucht einfach mal alles grosszuegig sinnvoll auf die Dateien aufteilen, dann entfaellt dieses staendige Erweitern und neu Organisieren der Dateien schonmal.

Alternativ wenn noch nicht so gehandhabt koenntet ihr dem SQL-Server bei Gelegenheit auch mal einfach eine rohe Partition zum selbermachen geben (ich nehme an ihr habt im Moment noch ein normales Dateisystem auf einer Partition und darin die Datenbankdateien).

Und nochwas ... wenn man nach angemessenem Zeitraum die translogs sichert und abschneidet wachsen sie auch nicht mehr dann erledigt sich das auch. Kommt halt darauf an, wie lange die fuer die Auswertungen eurer Chefitaeten gebraucht werden.

Soweit die Massnahmen um HD-Zugriffe die auf einen Schlag anfallen (Vergroessern der Dateien) abzufangen.

Eine andere Sache ist die, mal mit der Prozessorbelegung rumzuspielen, dass waehrend das OS mit Dateisystemzugriffen zugange ist der SQL-Server nicht gestoert ist; Der MS-SQL Server hat noch ein paar Einstellungsmoeglichkeiten fuer die CPU-Nutzung/Bindung bei SMP-Systemen, hau da mal Deinen Kollegen an das koennte noch interessant sein.
Unter Umstaenden macht es Sinn den SQL-Server nur auf einer CPU laufen zu lassen, wenn er im Gegenzug vom Tagesgeschaeft des OS unberuehrt bleibt (Vorausgesetzt natuerlich das reicht dann noch).

MajorTom67 said:
Dieses Ergebnis hatte ich schon, als ich darauf hinwies, daß laut Microdoof SQL-DB'en durchaus hin und wieder defragmentiert werden sollten, was bis heute nicht passiert ist. Auch die HD ist ziemlich fragmentiert (bei der letzten Überprüfung über 80%), da das aber ein RAID-Array ist, meinte unser Admin mit SQL-Kenntnissen, das bräuchte man nicht defragmentieren...
Nun das ist nun wirklich nicht mehr Sache eines Entwicklers ;)
(Zu der Sippschaft zaehle ich mich auch wenn ich dummerweise nicht spezialisiert bin.)
Wenn die Defragmentierung nichts von dem RAID weiss bringt es wirklich nicht viel weil dort die aufeinander folgenden Sektoren einer Datei eh nicht auf derselben Platte sein sollten (RAID 5 nehme ich an?).
Ich sehe aber im Moment eh mehr in dem Groesenwachstum der translogs, die sich taeglich um 2-3 hundert MB aufblasen und dann den Inhalt womoeglich noch reorganisieren da hilft auch Defragmentieren nicht. (300 MB einfach nur wegschreiben glaub ich nicht dass das so lange und so intensiv aufhalten wuerde.)
Mit Defragmentieren der DB meinst Du wohl das was sich klassicherweise Reorganisation der DB schimpft (aus einem Land vor unserer Zeit als Backup noch DaSi hiess und man keine Umlaute in der shell hatte ;> wink@DJ), auch das geht einen Entwickler eigentlich nichts an insofern ...
Aber grundsaetzlich sollten Datenbanken natuerlich regelmaessig im Wartungsfenster auch einen Reorg durchlaufen sag nicht, das macht ihr nicht.?!
Findet sich bei MS-SQL glaube ich auch irgendwo unter Wartungsjobs des Servers da wo auch die hauseigenen Sicherungen eingerichtet werden.

Schaut erstmal nach den Dateigroessen und zieht die von vorne herein so hoch, dass schonmal die Dateien die Woche unter nicht vergroessert werden muessen (da kann man schonmal schaun wie der Fuellgrad jeweils ist und der Wachstumsfaktor eingestellt ist um zu sehen ob das ein Problem sein koennte).
Wenn ich mich recht entsinne ist die standard Einstellung fuer den Wachstumsfaktor eine absolute und kleine Zahl wenn das nicht geaendert wurde ist das bei 300 MB Wachstum am Tag natuerlich fatal.!

Noch was ... Da bei euch ja das Fuehren und Aufbewahren der translogs "ausschliessslich" ein Beduerfnis der Chefetage befriedigt und ja wohl die translogs auch das Problem sind sollte auch der Verursacher der die Leistung beansprucht dafuer aufkommen, also im Zweifel mal in Richtung mehr Hardware/Cluster aus 2 Servern zu Lasten des Deckungsbeitrages der Chefetage hinarbeiten ;> .

Ciao,
Mercy.
 
Back
Top