MainframeSupports
tip uge 13/2007:

For lidt over et år siden i uge 10 skrev jeg om hvordan du kan måle CPU forbruget for en stump kode i et program. Jeg gjorde også opmærksom på, at kodestumpen med stor sandsynlighed ikke ville give det rigtige resultat for CICS programmer. Jeg har nu med held anvendt følgende stump kode for at kunne måle CPU forbruget i CICS:

DATA DIVISION.
WORKING-STORAGE SECTION.
01  DFHMNTDS-POINTER POINTER.
01  WORKUSED PIC S9(9) BINARY.
01  LASTUSED PIC S9(9) BINARY.
01  CPUUSAGE PIC S9(9) BINARY.
LINKAGE SECTION.
01  DFHMNTDS.
  02  FILLER PIC X(1264).
  02  CPUTIME PIC S9(9) BINARY.
PROCEDURE DIVISION.
...
MOVE 0 TO LASTUSED
EXEC CICS
  COLLECT STATISTICS SET(DFHMNTDS-POINTER)
  MONITOR(EIBTASKN) NOHANDLE
END-EXEC
IF EIBRESP = 0
  SET ADDRESS OF DFHMNTDS TO DFHMNTDS-POINTER
  COMPUTE WORKUSED = CPUTIME / 62,5
  COMPUTE CPUUSAGE = WORKUSED - LASTUSED
  MOVE WORKUSED TO LASTUSED
ELSE
  MOVE 0 TO WORKUSED
  MOVE 999999999 TO CPUUSAGE
END-IF
... ALL THE WORK I WANT TO MEASURE
EXEC CICS
  COLLECT STATISTICS SET(DFHMNTDS-POINTER)
  MONITOR(EIBTASKN) NOHANDLE
END-EXEC
IF EIBRESP = 0
  SET ADDRESS OF DFHMNTDS TO DFHMNTDS-POINTER
  COMPUTE WORKUSED = CPUTIME / 62,5
  COMPUTE CPUUSAGE = WORKUSED - LASTUSED
  MOVE WORKUSED TO LASTUSED
ELSE
  MOVE 0 TO WORKUSED
  MOVE 999999999 TO CPUUSAGE
END-IF
DISPLAY 'MEASURED CPU CONSUMPTION IN 1/1000 SECONDS = ' CPUUSAGE
...

For at ovenstående skal virke, så skal du først og fremmest kompilere dit program med PROCESS XOPTS(XP), da EXEC CICS COLLECT er en del af systemprogrammør interfacet til CICS. Hvis CPUUSAGE er 999999999, så skyldes det at EXEC CICS COLLECT fejlede. Hvis EXEC CICS COLLECT fejler skyldes det, at de målinger, der skal til for at CICS opsamler CPU-forbruget, ikke er slået til. Det skal du bede CICS systemprogrammøren om. Jeg vil dog stærkt gå ud fra, at netop disse målinger er slået til på stort set alle insallationer. Ellers kan performance folkene ikke se CPU forbruget på transaktionsniveau i SMF.

Bemærk i øvrigt, at CPUTIME i CICS ikke har nogen særlig høj opløsning. Den opdateres faktisk kun 62,5 gange for hver gang, der er brugt 1/1000 CPU sekund. Du kan derfor nemt opleve, at CPU forbruget bliver 0. Jeg bruger blandt andet koden til at måle CPU forbruget for hele transaktionen, da det i sig selv er en klar forbedring i forhold til at skulle vente på, at performance folkene får opsamlet og formidlet dette tal.

I øvrigt har de systemprogrammører, jeg har talt med for at få ovenstående skruet sammen, sagt, at jeg ikke kan forvente, at det virker korrekt, hvis transaktionen, jeg måler, kører threadsafe. Så nu er du advaret, hvis du synes, at CPU forbruget ikke ser helt rigtigt ud. Jeg har sammenlignet CPU forbruget målt med ovenstående kode med CPU forbruget målt i SMF og det stemmer overens. På den anden side ved jeg ikke om de transaktioner, jeg har målt på, kører threadsafe. En threadsafe transaktion kører på en såkaldt L8 TCB, og i følge den dokumentation, jeg har læst, så bliver L8 TCB forbruget også talt med i CPUTIME feltet, så jeg tror på, at min kodestump virker korrekt i alle tilfælde. I øvrigt hedder CPUTIME feltet TMRCPUT i den assembler macro, der beskriver DFHMNTDS recorden. I SMF hedder det samme felt USRCPUT.

Forrige danske tip        Last tip in english        Tip oversigten