Um das SQL Anywhere- Thread-Modell zu verstehen, müssen Sie auch die grundlegende Terminologie und die Konzepte von Threads bzw. der Anforderungsverarbeitung verstehen.
Anforderung Eine Anforderung ist eine Arbeitseinheit, wie z.B. eine Abfrage oder eine SQL-Anweisung, die an den Datenbankserver über eine Verbindung gesendet wird. Die Aktivitätszeit einer Anforderung reicht vom Zeitpunkt, an dem die Anforderung erstmals vom Datenbankserver empfangen wird, bis zu dem Zeitpunkt, an dem die letzten Ergebnisse zurückgegeben werden, Cursor geschlossen werden oder die Anforderung abgebrochen wird.
Aufgabe Eine Aufgabe ist die Einheit einer Aktivität, die im Datenbankserver durchgeführt wird, und die kleinste Arbeitseinheit, die vom Datenbankserver geplant wird. Im Datenbankserver wird jede Benutzeranforderung zu zumindest einer Aufgabe, und möglicherweise zu mehreren, wenn die abfrageinterne Parallelität verwendet wird. Zusätzlich zu Benutzeranforderungen kann der Datenbankserver auch seine eigenen Aufgaben planen, um interne Aufgaben durchzuführen, wie z.B. den Datenbank-Cleaner auszuführen oder Timer zu verarbeiten. Die maximale Anzahl von aktiven Aufgaben, die gleichzeitig ausgeführt werden können, richtet sich nach der Größe des Worker-Pools innerhalb des System-Kernels. Wenn eine Benutzeranforderung auf dem Datenbankserver ankommt und ihr ein Worker-Thread zugeordnet wird, wird die ActiveReq-Servereigenschaft um 1 erhöht. Wenn die Anforderung abgeschlossen ist, wird die ActiveReq-Servereigenschaft um 1 verringert. Wenn jedoch keine Worker-Threads zum Ausführen der Benutzeranforderung verfügbar sind, wird die Aufgabe in die Warteschlange gestellt und die UnschReq-Servereigenschaft wird um 1 erhöht. Wenn die Aufgabe aus der Warteschlange genommen wird, weil nun ein Worker-Thread verfügbar ist, wird die UnschReq-Servereigenschaft um 1 verringert und die ActiveReq-Eigenschaft wird um 1 erhöht.
Worker-Thread Ein Worker-Thread ist eine Abstraktion eines ausführenden Steuerungs-Threads innerhalb des Datenbankserver-Kernels. Unter Windows und Linux sind Worker-Threads unter Verwendung von Lightweight-Threads implementiert, die als Fasern bezeichnet werden. Auf anderen Plattformen werden Worker-Threads unter Verwendung von Betriebssystem-Threads implementiert. Worker-Threads führen Aufgaben aus, die ihnen vom Datenbankserver-Kernel zugeordnet sind. Der Datenbankserver verwendet einen Worker-Thread-Pool variabler Größe für die Verarbeitung der Arbeitslast des Servers. Die Größe des Pools entspricht der Multiprogramming-Stufe des Datenbankservers.
Personal Server wie auch Netzwerkserver unter Windows Mobile haben einen Pool fester Größe. Für diese Server wird die Anzahl von Worker-Threads, die beim Start des Datenbankservers erstellt wird, mit der Option -gn gesteuert. Für alle anderen Netzwerkserver erstellt der Datenbankserver die Anzahl der Worker-Threads, die mit der Option -gnh angegeben wird. Nur die Anzahl der von der Multiprogramming-Stufe des Servers festgelegten Worker-Threads darf jedoch Aufgaben verarbeiten. Standardmäßig wird die Größe des Worker-Pools dynamisch vom Kernel und abhängig von den Änderungen der Datenbankserver-Arbeitslast abgestimmt. Sie kann zwischen den mit den Optionen -gnl und -gnh festgelegten Unter- und Obergrenzen schwanken.
Aufgaben werden Worker-Threads auf First-In-First-Out-Basis (FIFO) zugewiesen. Die Priorität jeder Aufgabe wird basierend auf der Verbindung gesetzt, die die Aufgabe generiert hat. Wenn eine Aufgabe einem Worker-Thread zur Ausführung zugewiesen wurde, berücksichtigt der Scheduler des Kernels die Priorität der Aufgabe bei der Zuweisung von CPU-Zeit für den Worker-Thread. Wenn eine Aufgabe während der Verarbeitung aus irgendeinem Grund blockiert werden muss, wie etwa während des Wartens auf eine Sperre oder auf die Beendigung eines I/O-Vorgangs, bleibt der Worker-Thread an diese Aufgabe gekoppelt. Erst wenn die Aufgabe abgeschlossen wurde, wird der Worker-Thread für die Ausführung von anderen Aufgaben verfügbar.
Thread Ein Thread bzw. ein Verarbeitungs-Thread ist ein Betriebssystemkonstrukt, das die gleichzeitige Verarbeitung innerhalb eines einzelnen Prozesses ermöglicht. Jeder Betriebssystemprozess, einschließlich des Datenbankservers, wird von zumindest einem, aber möglicherweise von vielen Treads ausgeführt. Ein Thread wird außerhalb der Anwendung vom Betriebssystem geplant, und letztendlich wird die gesamte Ausführung einer Anwendung durch Threads durchgeführt. Unter Windows und Linux erstellt der Datenbankserver eine bestimmte Anzahl von Threads: einen Betriebssystem-Thread pro CPU-Kern, der von der Option -gtc gesteuert wird. Auf anderen Plattformen entspricht die Anzahl der erstellten Betriebssystem-Threads der Größe des Worker-Thread-Pools. Sie wird von den gleichen Mechanismen gesteuert, die für die Steuerung der Worker-Poolgröße verwendet werden.
Die Anzahl der Threads ist unabhängig von der Anzahl der Verbindungen zur Datenbank und der Datenbankserver stellt keinen Thread für eine bestimmte Verbindung bereit. Stattdessen wird Aufgaben, die zur Ausführung in den Datenbankserver gelangen, aus einem Pool fester Größe mit Server Threads dynamisch ein Thread zugewiesen. Wenn eine Aufgabe einem Thread zugewiesen ist, verarbeitet der Thread die Aufgabe, bis sie abgeschlossen ist oder abgebrochen wird.
Worker-Threads unter Unix
Worker-Threads unter Windows und Linux
Threading-Verhalten
Datenbankserverkonfiguration der Multiprogramming-Stufe
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2013, SAP AG oder ein SAP-Konzernunternehmen. - SAP Sybase SQL Anywhere 16.0 |