Berechnen der CPU-Zeit für verschiedene Anwendungen oder Workloads mithilfe des UOW-Ereignismonitors

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

  1. 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.
  2. 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 ".
  3. 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.
  4. 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:
    • UOW_EVENT
    • UOW_METRICS
    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.
  5. 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
  6. 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:
      1. Inaktivieren Sie die UOW-Datenerfassung für diese Ereignismonitorinformationen mit dem Befehl SET EVENT MONITOR TRACKWORK STATE 0.
      2. Löschen Sie den Ereignismonitor selbst mit der Anweisung DROP EVENT MONITOR.
      3. 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
      4. 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.