Die Multiprogramming-Stufe des Datenbankservers ist die maximale Anzahl der Aufgaben, die gleichzeitig aktiv sein können, und wird von der Serveroption -gn gesteuert. Eine aktive Aufgabe ist eine, die derzeit von einem Thread (oder einer Faser) im Datenbankserver ausgeführt wird. Eine aktive Aufgabe kann einen Zugriffsplan-Operator ausführen oder eine andere nützliche Arbeit durchführen, kann aber auch beim Warten auf eine Ressource (wie z.B. auf einen I/O-Vorgang oder auf eine Zeilensperre) blockiert sein. Eine ungeplante Aufgabe ist eine, die bereit zum Ausführen ist, aber auf einen verfügbaren Thread bzw. Faser wartet. Die Anzahl der aktiven Aufgaben, die gleichzeitig ausführen können, hängt von der Anzahl der Datenbankserver-Threads und der Anzahl der logischen Prozessoren ab, die im System verwendet werden.
Die Multiprogramming-Stufe bleibt während der Serverausführung konstant und gilt für alle Datenbanken auf diesem Server. Die Standardeinstellung ist 20 aktive Aufgaben für den Netzwerk-Datenbankserver und für den Personal Datenbankserver, außer bei Windows Mobile, wo der Standardwert 3 ist.
Es kann schwierig sein zu bestimmen, ob die Multiprogramming-Stufe erhöht oder gesenkt werden soll. Beispiel: Wenn eine Anwendung gespeicherte Java-Prozeduren verwendet oder wenn die abfrageinterne Parallelität aktiviert ist, können die zusätzlichen, zur Verarbeitung dieser Anforderungen erstellten Serveraufgaben möglicherweise den Multiprogramming-Grenzwert überschreiten, und die Ausführung dieser Aufgaben muss warten, bis eine andere Anforderung abgeschlossen ist. In diesem Fall kann ein Erhöhen der Multiprogramming-Stufe das Richtige sein. Oft wird eine Anhebung der Multiprogramming-Stufe den Gesamtdurchsatz des Datenbankservers entsprechend erhöhen, weil dadurch zusätzliche Aufgaben (Anforderungen) gleichzeitig ausgeführt werden können. Es gibt allerdings auch Nachteile bei der Erhöhung der Multiprogramming-Stufe, die bedacht werden sollten. Dazu gehören:
Vermehrte Konflikte Indem Sie die Anzahl gleichzeitig möglicher Aufgaben erhöhen, erhöhen Sie möglicherweise auch die Wahrscheinlichkeit von Konflikten zwischen aktiven Anforderungen. Die Konflikte können Ressourcen wie Schemata und Zeilensperren bzw. interne Datenstrukturen des Datenbankservers und/oder Synchronisationsbasiselemente betreffen. So eine Situation kann den Serverdurchsatz durchaus verringern.
Zusätzlicher Server-Overhead Jede aktive Aufgabe erfordert die Zuordnung und Aufrechterhaltung eines Threads (im Fall von Windows und Linux einer Faser) und zusätzliche Protokollstrukturen, um ihre Zeitplanung zu steuern. Zusätzlich erfordert jede aktive Aufgabe die Vorabzuweisung von Adressenspeicherplatz für ihren Ausführungs-Stack. Die Größe des Stacks ist von Plattform zu Plattform verschieden, beträgt aber ungefähr 1 MByte auf einer 32-Bit-Plattform, und mehr auf 64-Bit-Plattformen. Auf Windows-Systemen wirkt sich die Zuweisung von Stack-Speicherplatz auf den Adressenspeicherplatz des Serverprozesses aus, aber der Stack-Speicher wird bei Bedarf zugewiesen. Auf Unix-Plattformen (einschließlich Linux) wird der Sicherungsspeicher für den Stack unmittelbar zugewiesen. Daher erhöht eine höhere Multiprogramming-Stufe den Speicherbedarf des Servers und vermindert die Menge des für den Cache verfügbaren Speichers, weil die Menge des Adressenspeicherplatzes vermindert wird.
Überlastung Der Datenbankserver kann einen Zustand der Überlastung erreichen, bei dem er signifikante Ressourcenmengen nur zur Verwaltung des Ausführungs-Overheads verwendet, anstatt nützliche Arbeit für eine bestimmte Anforderung auszuführen. Dieser Zustand wird üblicherweise "Thrashing" genannt. Thrashing kann z.B. auftreten, wenn zu viele aktive Anforderungen um Speicherplatz im Datenbank-Cache wetteifern, aber der Cache nicht groß genug ist, die Arbeitsmenge von Datenbankseiten aufzunehmen, der von der Menge der aktiven Anforderungen verwendet wird. Diese Situation kann zu Seitenentzug ("page stealing") führen, auf eine ähnliche Weise, wie er bei Betriebssystemen auftreten kann.
Auswirkung auf die Abfrageverarbeitung Der Datenbankserver wählt eine maximale Anzahl von speicherintensiven Anforderungen aus, die gleichzeitig abgearbeitet werden können. Auch wenn Sie die Multiprogramming-Stufe des Datenbankservers erhöhen, müssen Anforderungen möglicherweise warten, bis Speicher verfügbar wird. Weitere Hinweise finden Sie unter Der Speichernutzungswächter.
Speicher für Datenstrukturen Der Datenbankserver verwendet Ressourcen, um Anweisungen syntaktisch zu analysieren und zu optimieren. Bei sehr komplexen Anweisungen oder kleinen Cachegrößen kann der Speicher, der für Serverdatenstrukturen benötigt wird, die verfügbare Menge überschreiten. Ein Speichernutzungswächter beschränkt die Menge an Speicher, die für die Serverdatenstrukturen der einzelnen Aufgaben verwendet wird. Jede Aufgabe hat den folgenden Grenzwert:
(3/4 maximum cache size) / (number of currently active tasks) |
Wenn dieser Grenzwert überschritten wird, schlägt die Anweisung mit einem Fehler fehl.
Eine Verminderung der Multiprogramming-Stufe des Datenbankservers durch eine Verminderung der gleichzeitig ausführenden Aufgaben senkt üblicherweise den Durchsatz des Servers. Eine Verminderung der Multiprogramming-Stufe kann jedoch die Antwortzeit einzelner Anforderungen verbessern, weil es weniger Anforderungen gibt, die um Ressourcen wetteifern, und weil eine geringere Wahrscheinlichkeit für Sperrenkonflikte besteht.
In SQL Anywhere führen Threads (Fasern) Aufgaben auf eine kooperative Art und Weise durch. Wenn eine Aufgabe abgeschlossen ist, steht es dem Thread (der Faser) frei, die nächste Aufgabe, die auf die Ausführung wartet, entgegenzunehmen. Wenn die Aufgabe allerdings blockiert ist, z.B. beim Warten auf eine Zeilensperre, ist der Thread (die Faser) ebenfalls blockiert.
Wenn die Multiprogramming-Stufe zu niedrig angesetzt ist, kann ein Thread-Deadlock auftreten. Nehmen wir an, der Datenbankserver hat n Threads (Fasern). Ein Thread-Deadlock tritt auf, wenn n-1 Threads blockiert sind und der letzte Thread im Begriff ist, zu blockieren. Der Kernel des Datenbankservers kann nicht zulassen, dass dieser Thread blockiert, da dies dazu führen würde, dass alle Threads blockiert wären und der Server hängen würde. Stattdessen beendet der Datenbankserver die Aufgabe, die im Begriff ist, den letzten Thread zu blockieren, mit SQLSTATE 40W06.
Wenn die Multiprogramming-Stufe zur Arbeitslast passt, ist das Auftreten eines Thread-Deadlocks symptomatisch für ein Anwendungsdesignproblem, das zu substanziellen Konflikten führt und dadurch die Skalierbarkeit beeinträchtigt. Ein Beispiel ist eine Tabelle, die jede Anwendung ändern muss, wenn der Datenbank neue Daten hinzugefügt werden. Diese Technik wird häufig als Teil eines Schemas verwendet, um Primärschlüssel zu generieren. Die Konsequenz ist allerdings, dass alle Einfügetransaktionen der Anwendung tatsächlich serialisiert werden. Wenn die Rate der Einfügetransaktionen höher wird, als der Server aufgrund der Serialisierung der gemeinsam genutzten Tabelle verarbeiten kann, tritt üblicherweise ein Thread-Deadlock auf.
Es wird empfohlen, dass Sie mit der Arbeitslast Ihrer Anwendung experimentieren, um die Auswirkungen der Multiprogramming-Stufe des Servers auf den Serverdurchsatz und die Anforderungsantwortzeit zu analysieren. Verschiedene Performance-Zähler stehen entweder als Eigenschaftsfunktionen oder über den Windows-Systemmonitor unter Windows zur Verfügung, die Sie während der Tests Ihrer Anwendung bei der Analyse des Datenbankserver-Verhaltens unterstützen. Performance-Zähler, die sich auf aktive und ungeplante Anforderungen beziehen, sind bei dieser Analyse wichtig.
Wenn die Anzahl der aktiven Anforderungen stets niedriger als der Wert der Datenbankoption -gn ist, können Sie eine Verminderung der Multiprogramming-Stufe in Betracht ziehen, aber Sie müssen auch die Auswirkung der abfrageinternen Parallelität bedenken, die den Ausführungswarteschlangen des Servers zusätzliche Aufgaben hinzufügt. Wenn die abfrageinterne Parallelität marginal ist, kann die Multiprogramming-Stufe unbedenklich vermindert werden, ohne den Gesamtdurchsatz des Systems abzusenken. Wenn allerdings die Anzahl aller Anforderungen (aktiv + ungeplant) häufig größer als -gn ist, ist möglicherweise eine Erhöhung der Multiprogramming-Stufe empfehlenswert, abhängig von den oben beschriebenen Nachteilen. Beachten Sie, dass der Systemmonitor für Unix- oder Linux-Plattformen nicht verfügbar ist.
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |