In diesem Abschnitt
wird eine Möglichkeit beschrieben, den UOW-Ereignismonitor bei Routinedatenbankoperationen einzusetzen. In einigen Geschäftsumgebungen wird die Verarbeitungszeit, die die Anwendungen der
einzelnen Abteilungen benötigen, diesen Abteilungen in Rechnung gestellt. Mithilfe des UOW-Ereignismonitors können Sie die CPU-Zeit erfassen, die von verschiedenen
Anwendungen, Workloads oder Serviceklassen verwendet wird. Diese Informationen können dann wiederum in Buchhaltungsanwendungen verwendet werden,
mit denen die Abrechnung für Systemressourcen durchgeführt wird.
Vorbereitende Schritte
Die
Anweisung CREATE EVENT MONITOR erfordert einen Tabellenbereich mit einer Seitengröße von mindestens 8 KB, um die nicht formatierte
Ereignistabelle (UE-Tabelle), die der Ereignismonitor generiert, zu speichern. Der Standardtabellenbereich
für die Datenbank wird verwendet, sofern nicht in der Anweisung CREATE EVENT MONITOR ein Tabellenbereich
explizit angegeben wird.
Informationen zu dieser Task
In dieser Task
wird ein Basisszenario für die Leistungsverrechnung
beschrieben. Im folgenden Beispiel wird die gesamte auf dem System ausgeführte Arbeit überwacht. Aus den erfassten Daten werden Berichte erstellt, in denen die von den verschiedenen Anwendungen
verwendete CPU-Zeit dokumentiert ist.Abhängig von der Organisation Ihres Unternehmens kann die Überwachung der Systemzeit
auf der Basis von Workloads sinnvoll sein. Alternativ dazu können Sie auch die CPU-Zeit überwachen, die in verschiedenen Servicesuperklassen,
von bestimmten Workloads oder von verschiedenen Benutzern verwendet wird. Wenn die Daten in relationale Tabellen geschrieben werden, wie es das Beispiel in dieser Task zeigt,
können Sie die Daten mithilfe von SQL auf nahezu jede denkbare Weise abfragen und darstellen.
Hinweis : Aktivitäten innerhalb einer Arbeitseinheit können in verschiedenen Hilfsdienstunterklassen ausgeführt werden. Aus diesem Grund ist die Zusammenfassung von UOW-Informationen anhand der Serviceunterklasse nicht sinnvoll. Wenn Sie die CPU-Zeit anhand der Serviceklasse zusammenfassen möchten, verwenden Sie stattdessen den
Aktivitätsereignismonitor.
Prozedur
- Erstellen Sie einen UOW-Ereignismonitor, um Informationen zu UOWs zu erfassen,
wenn diese abgeschlossen werden.
Zum Erstellen eines Ereignismonitors mit dem Namen TRACKWORK können Sie beispielsweise
die folgende SQL-Anweisung verwenden:
CREATE EVENT MONITOR TRACKWORK FOR UNIT OF WORK WRITE TO UNFORMATTED EVENT TABLE
Mit dieser Anweisung wird ein UOW-Ereignismonitor erstellt, der in eine
nicht formatierte Ereignistabelle (UE-Tabelle) schreibt. Der Name der UE-Tabelle entspricht dem Namen des Ereignismonitors: TRACKWORK;
die UE-Tabelle wird im Standardtabellenbereich gespeichert.
- Weisen Sie den Datenbankmanager an, dass Ereignisinformationen für alle UOWs erfasst werden sollen,
die für die Datenbank abgeschlossen wurden, indem Sie den folgenden Befehl ausführen:
UPDATE DATABASE CONFIGURATION FOR dbname USING MON_UOW_DATA BASE
Dieser Befehl bewirkt, dass Informationen zu allen auf dem Datenserver ausgeführten UOWs
an die aktiven UOW-Monitore gesendet werden, sobald die UOWs abgeschlossen sind. Weitere Informationen zur Steuerung des Umfangs der erfassten Arbeitsdaten finden Sie unter
"Konfigurieren der Datenerfassung ".
- Aktivieren Sie dann den Ereignismonitor:
SET EVENT MONITOR TRACKWORK STATE 1
Hinweis : Standardmäßig wird dieser Ereignis-Monitor bei der Datenbankaktivierung automatisch gestartet, da die Option AUTOSTART standardmäßig angewendet wird. Da dieser Ereignismonitor jedoch in einer bereits aktiven Datenbank erstellt wird,
müssen Sie ihn mit dem Befehl SET EVENT MONITOR manuell starten.
Ab jetzt erfasst der UOW-Ereignismonitor Informationen für jede UOW, wenn diese abgeschlossen wird. Beim Abschluss jeder UOW fügt der Ereignismonitor einen Datensatz für das
Ereignis zur UE-Tabelle TRACKWORK hinzu.
- Wenn Sie Daten für die Berichterstellung erfassen möchten, müssen Sie die Datensätze aus der
UE-Tabelle TRACKWORK extrahieren.
Sie können diese Informationen im XML-Format oder im relationalen Format anzeigen,
indem Sie die Prozedur EVMON_FORMAT_UE_TO_XML bzw. die Prozedur EVMON_FORMAT_UE_TO_TABLES
für die Konvertierung der Daten in der UE-Tabelle verwenden. Alternativ dazu können Sie das Tool db2evmonfmt verwenden, um einen Textbericht
der vom Ereignismonitor zurückgegebenen Informationen zu erstellen. Dieses Beispiel zeigt die Verwendung von EVMON_FORMAT_UE_TO_TABLES zur Erstellung von relationalen Tabellen,
die Sie auf die für Sie am besten geeignete Weise abfragen können.
CALL EVMON_FORMAT_UE_TO_TABLES
('UOW', NULL, NULL, NULL, NULL, NULL, NULL, -1, 'SELECT * FROM TRACKWORK')
Die Prozedur EVMON_FORMAT_UE_TO_TABLES prüft die UE-Tabelle TRACKWORK, die der Ereignismonitor generiert hat.
Sie wählt jeden Datensatz der UE-Tabelle aus und erstellt daraus Zeilen mit den vom UOW-Ereignismonitor erfassten
Daten in zwei relationalen Tabellen:
Die erste Tabelle enthält die am häufigsten verwendeten Monitorelemente
und Messwerte für jedes erfasste Ereignis. Die zweite Tabelle enthält detaillierte Messwerte für die einzelnen Ereignisse.
Hinweise:
- Wenn Sie in Schritt 2 für den Konfigurationsparameter MON_UOW_DATA PKGLIST anstelle von BASE angeben, erstellt die Prozedur EVMON_FORMAT_UE_TO_TABLES eine dritte Tabelle mit dem Namen UOW_PACKAGE_LIST. Diese Tabelle enthält die Paketlisteninformationen für die UOWs. Da in diesem Beispiel jedoch nur grundlegende Monitorelemente erfasst werden (siehe Schritt 2 ), enthält diese Tabelle keine Daten. (Weitere Informationen zur Verwendung der Paketlisteninformationen finden Sie in den Informationen zum Unit of Work Event Monitor-Paket.)
- Die Werte in den Spalten von UOW_METRICS sind auch in dem XML-Dokument enthalten,
das sich in der Spalte METRICS der Tabelle UOW_EVENT befindet. Sie werden in der Tabelle UOW_METRICS bereitgestellt, die einen praktischeren,
spaltenorientierten Zugriff bietet.
- Führen Sie Abfragen für die im vorhergehenden Schritt erstellten Tabellen aus,
um die Nutzung der CPU-Zeit durch die Anwendungen anzuzeigen. Die nachfolgend dargestellte Anweisung gibt eine Aufgliederung der gesamten CPU-Zeit zurück,
die seit der Initialisierung des UOW-Ereignismonitors von verschiedenen Benutzern im System verwendet wurde. (In diesem Beispiel wird davon ausgegangen, dass sich Client-Anwendungen gegenüber der Datenbank mit dem
sqleseti API oder über die von Ihnen verwendete Anwendungsentwicklungsumgebung, beispielsweise IBM® Rational® Application Developer for WebSphere® Software. SELECT SUBSTR(E.CLIENT_USERID,1,10) AS CLIENT_ID,
SUBSTR(E.CLIENT_APPLNAME,1,80) AS CLIENT_APP,
SUBSTR(E.CLIENT_WRKSTNNAME,1,10) AS WKSTN,
SUM(M.TOTAL_CPU_TIME) AS CPU_TIME
FROM UOW_EVENT E, UOW_METRICS M
WHERE M.APPLICATION_ID = E.APPLICATION_ID
AND M.UOW_ID = E.UOW_ID
AND M.MEMBER = E.MEMBER
GROUP BY E.CLIENT_USERID, E.CLIENT_APPLNAME, E.CLIENT_WRKSTNNAME
ORDER BY CPU_TIME DESC;
Die vorhergehende Abfrage liefert die folgenden Ergebnisse:
CLIENT_ID CLIENT_APP WKSTN CPU_TIME
---------- -------------------------------------------------------------------------------- ---------- --------------------
987770013
DB2BATCH 249375000
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003021324173 91181678
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1004201047173 66097348
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003191536588 28824420
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003191536434 27555568
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003221122075 16203116
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003221118191 15759227
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003221531062 15630121
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003221117466 15236718
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003221116141 14607249
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003251550366 14427883
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003051054311 1312500
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003051053301 1296875
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003051139066 1296875
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003051152281 1281250
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003041230283 1046875
asrisk2 1031250
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003291503479 515625
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003251506219 484375
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003221444488 453125
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003021323249 406250
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003251544498 296875
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003171431559 171875
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003041227488 156250
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003221117188 109375
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003021333329 62500
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003191502148 62500
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003191527385 62500
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003191528492 62500
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003191530518 62500
CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003191533265 62500
CLP C:\Documents and Settings\All Users\Application Data\IBM\DB2\DB2COPY1\DB2DAS 62500
- Zu diesem Zeitpunkt erfasst der UOW-Ereignismonitor TRACKWORK weiterhin Informationen. Abhängig davon, wie Sie die von den verschiedenen Anwendungen, Benutzern oder Workloads verwendete CPU-Zeit
überwachen möchten, können Sie eine der folgenden Vorgehensweisen wählen:
- Wenn Sie die CPU-Nutzung auf einer täglichen Basis berechnen möchten,
können Sie diesen UOW-Ereignismonitor aktiviert lassen. Führen Sie jeden Tag die Prozedur EVMON_FORMAT_UE_TO_TABLES aus, um ausschließlich die
Messwerte für den Zeitbedarf für den vorhergehenden Tag abzurufen:
CALL EVMON_FORMAT_UE_TO_TABLES
('UOW', NULL, NULL, NULL, NULL, NULL, NULL, -1,
'SELECT * FROM TRACKWORK
WHERE (DATE(EVENT_TIMESTAMP)=(CURRENT DATE - 1 DAY))'
)
Mit dieser Methode werden die drei relationalen Tabellen, die mit der Prozedur
EVMON_FORMAT_UE_TO_TABLES erstellt werden, kontinuierlich größer und biete so ein Verlaufsprotokoll
der CPU-Nutzung über einen bestimmten Zeitraum hinweg. Die Abfrage in Schritt 5 gibt die kumulierten Summen für die CPU-Zeit zurück, seit die Tabellen erstmals mit der Prozedur EVMON_FORMAT_UE_TO_TABLES erstellt wurden. Sie können die Abfrage so modifizieren, dass nur die Ergebnisse des vorhergehenden Tags angezeigt werden.
Gehen Sie hierzu wie folgt vor:SELECT SUBSTR(E.CLIENT_USERID,1,10) AS CLIENT_ID,
SUBSTR(E.CLIENT_APPLNAME,1,80) AS CLIENT_APP,
SUBSTR(E.CLIENT_WRKSTNNAME,1,10) AS WKSTN,
SUM(M.TOTAL_CPU_TIME) AS CPU_TIME
FROM UOW_EVENT E, UOW_METRICS M
WHERE M.APPLICATION_ID = E.APPLICATION_ID
AND M.UOW_ID = E.UOW_ID
AND M.MEMBER = E.MEMBER
AND(DATE(E.EVENT_TIMESTAMP)=(CURRENT DATE - 1 DAY))
GROUP BY E.CLIENT_USERID, E.CLIENT_APPLNAME, E.CLIENT_WRKSTNNAME
ORDER BY CPU_TIME DESC;
Tipp : Wenn Sie die CPU-Auslastung täglich verfolgen, aber auch verwalten möchten, wie viele Daten Sie auf Ihrem System sammeln, entfernen Sie nicht mehr benötigte Daten aus der UE-Tabelle, nachdem Sie die relationalen Tabellen aktualisiert haben. Um beispielsweise die am Vortag erfassten Daten aus der UE-Tabelle TRACKWORK zu löschen,
verwenden Sie eine Anweisung DELETE ähnlich der folgenden:
DELETE FROM TRACKWORK WHERE (DATE(EVENT_TIMESTAMP)=(CURRENT DATE - 1 DAY))
Während ein
Ereignismonitor aktiv ist, hält er eine IX-Tabellensperre (IX = Intention Exclusive)
für alle Tabellen, in die er Informationen schreibt, um zu verhindern, dass diese Tabellen
gelöscht werden, während er sie verwendet. Wenn viele Zeilen gelöscht werden, bewirkt die Anweisung DELETE, dass eine große Anzahl
von Zeilensperren gehalten wird. In dieser Situation kann eine Sperreneskalation auftreten, da Zeilensperren möglicherweise in eine
Tabellensperre konvertiert werden. Diese Anforderung einer Tabellensperre kann zu einer Blockierung der Anweisung DELETE führen,
da der Ereignismonitor bereits eine Sperre für die Tabelle hält.
Zur Vermeidung dieser Situation können Sie ein Zeitlimit für Sperren festlegen,
bevor Sie die Anweisung DELETE absetzen:
SET CURRENT LOCK TIMEOUT 60
Wenn mit der Verlängerung des Zeitlimitintervalls für Sperren
das Problem nicht behoben wird, versuchen Sie, kleinere Untermengen der Daten zu löschen, z. B. die Datensätze
für kürzere Zeiträume (beispielsweise 6 oder 12 Stunden). Für diese Methode sind weniger Sperren erforderlich, sodass die Wahrscheinlichkeit einer Sperreneskalation
reduziert wird.
Es ist auch möglich, die von EVMON_FORMAT_UE_TO_TABLES generierten relationalen Tabellen
je nach Bedarf zu bereinigen, um den Speicherbedarf mit der Notwendigkeit, Protokolldaten anzuzeigen,
in Einklang zu bringen.
- Wenn die Berechnung der CPU-Zeit abgeschlossen ist, können Sie die Erfassung von
Ereignismonitorinformationen stoppen und den Ereignismonitor sowie die zugehörigen Tabellen
löschen, indem Sie die folgenden Schritte ausführen:
- Inaktivieren Sie die UOW-Datenerfassung für diese Ereignismonitorinformationen
mit dem Befehl SET EVENT MONITOR TRACKWORK STATE 0.
- Löschen Sie den Ereignismonitor selbst mit der Anweisung DROP EVENT MONITOR.
- Löschen Sie die zu diesem Ereignismonitor gehörenden Tabellen mit einer DROP TABLE-Anweisung. In diesem Fall müssen insgesamt vier Tabellen gelöscht werden:
- Die UE-Tabelle TRACKWORK, die zum Erfassen von Informationen des Ereignismonitors verwendet wurde
- UOW_EVENT
- UOW_METRICS
- UOW_PACKAGE_LIST
- Optional: Wenn keine weiteren aktiven Ereignismonitore vorhanden sind,
können Sie die Datenbankkonfiguration so aktualisieren, dass keine UOW-Ereignisinformationen mehr erfasst werden,
indem Sie den folgenden Befehl verwenden:
UPDATE DATABASE CONFIGURATION FOR dbname USING MON_UOW_DATA NONE
Variation: Erfassen von Messwerten für bestimmte Workloads
Im vorhergehenden Beispiel wird veranschaulicht, wie UOW-Messwerte für die gesamten auf dem
System ausgeführte Workloads erfasst werden können. Durch das Festlegen des Datenerfassungsbereichs mit dem Befehl UPDATE DATABASE CONFIGURATION
werden möglicherweise mehr Informationen erfasst als erforderlich. Es kann zum Beispiel erforderlich sein, nur die Verarbeitung bestimmter Workloads zu überwachen. In diesem Fall können Sie, anstatt die Erfassung von Arbeitseinheiteninformationen in der gesamten Datenbank zu ermöglichen, wie in Schritt 2 gezeigt, die Klausel COLLECT UNIT OF WORK DATA mit den Anweisungen CREATE oder ALTER WORKLOAD angeben. Diese Klausel bewirkt, dass nur Daten für die angegebene Workload vom Ereignismonitor erfasst werden. Verwenden Sie beispielsweise die folgende Anweisung, um UOW-Daten für die Workload PAYROLL zu erfassen:ALTER WORKLOAD PAYROLL COLLECT UNIT OF WORK DATA BASE
Sie können Daten für mehrere
Workloads erfassen, indem Sie eine Anweisung ALTER WORKLOAD für jede Workload ausführen.Die restlichen Schritte sind gleich, außer Schritt 5, bei dem Sie die Abfrage so ändern würden, dass sie der folgenden ähnelt:
SELECT E.WORKLOAD_NAME,
SUM(M.TOTAL_CPU_TIME) AS CPU_TIME
FROM UOW_EVENT E, UOW_METRICS M
WHERE M.APPLICATION_ID = E.APPLICATION_ID
AND M.UOW_ID = E.UOW_ID
AND M.MEMBER = E.MEMBER
GROUP BY E.WORKLOAD_NAME
ORDER BY CPU_TIME DESC
Mit der vorhergehenden Anweisung wird die CPU-Zeit für jede Workload
dokumentiert, für die die Messwerteerfassung aktiviert ist:WORKLOAD CPU_TIME
------------------------------ --------------------
PAYROLL 2143292042
MARKETING 492784916
2 record(s) selected.