MainframeSupports
tip uge 10/2006:

Normalt bekymrer vi programmører os ikke vildt meget for CPU forbruget i vores programmer. Og hvis vi endelig gør, så får DB2 næsten altid skylden. En vigtig forudsætning for at kunne bedømme CPU forbruget er at kunne måle det. I batchjobs kan man finde CPU forbruget på stepniveau i JES messageloggen. I CICS må man ty til SMF records pr. transaktion.

Hvis man vil måle på enkelte dele af sit program, så bliver det straks meget vanskeligere. De fleste installationer med respekt for sig selv har udviklet assembler programmer for mere end 20 år siden, der kan hjælpe dig. Problemet er typisk, at ingen længere kan huske, hvad disse assembler programmer hedder og ingen kan kode assembler mere, så man kan ikke sådan lige lave sin egen CPU måler. Heldigvis kan det faktisk lade sig gøre at måle CPU forbruget alene ved hjælp af COBOL, som de fleste mainframe programmører stadig behersker. Du kan gøre det således:

DATA DIVISION.
WORKING-STORAGE SECTION.
01  PSA-POINTER POINTER.
01  WORKUSED PIC S9(9) BINARY.
01  LASTUSED PIC S9(9) BINARY.
01  CPUUSAGE PIC S9(9) BINARY.
LINKAGE SECTION.
01  PSA.
  02  FILLER PIC X(548).
  02  ASCB-POINTER POINTER.
01  ASCB.
  02  FILLER PIC X(64).
  02  CPUTIME PIC S9(18) BINARY.
PROCEDURE DIVISION.
...
MOVE 0 TO LASTUSED
SET PSA-POINTER TO NULL
SET ADDRESS OF PSA TO PSA-POINTER
SET ADDRESS OF ASCB TO ASCB-POINTER
COMPUTE WORKUSED = CPUTIME / 4096000
COMPUTE CPUUSAGE = WORKUSED - LASTUSED
MOVE WORKUSED TO LASTUSED
... ALL THE WORK I WANT TO MEASURE
COMPUTE WORKUSED = CPUTIME / 4096000
COMPUTE CPUUSAGE = WORKUSED - LASTUSED
MOVE WORKUSED TO LASTUSED
DISPLAY 'MEASURED CPU CONSUMPTION IN 1/1000 SECONDS = ' CPUUSAGE
...

Ovenstående stumper kode kan indsættes de rigtige steder i hvilket som helst eksisterende COBOL program. Feltet CPUTIME i ASCB'en (det hedder i virkeligheden noget andet, men jeg har glemt, hvad det hedder, undskyld til MVS-hajerne) indeholder til enhver tid det antal 1/4096 del mikrosekunder, som TCB'er i address spacet har eksekveret på CPU'er på den pågældende MVS. Da vores almindelige COBOL-programmer i batch og under TSO eksekveres på een TCB, som ikke deles med andre, så vil ovenstående programstumper beregne det præcise CPU forbrug for den stump kode, der eksekveres mellem de to COMPUTE WORKUSED = CPUTIME / 4096000. WORKUSED indeholder altså CPU forbruget i 1/1000 sekunder siden den første TCB i address spacet blev startet.

Bemærk, at programkoden ikke kan anvendes i PL/I, da en PIC S9(18) BINARY i PL/I svarer til en FIXED BIN(63), som desværre ikke kan erklæres. Og til sidst en advarsel. Ovenstående måde at måle CPU forbrug på vil ikke give det rigtige resultat, hvis den anvendes i CICS. CICS afvikler mange samtidige transaktioner i samme address space og faktisk også på samme TCB. Kun hvis du har en CICS helt for dig selv, så vil du måske få det rigtige resultat, men hvem har det?

Forrige danske tip        Last tip in english        Tip oversigten