Monthly Archives: February 2011

Display the true average response time, CPU time, db time …

REPORT ZTRUERSP NO STANDARD PAGE HEADING.
*********************************************************************
* Display the true average response time.
* The result of this report contains the same data the ST03-workload
* overview screen has with one major difference: the values belonging
* to a defined set of abaps usually running online and taking a very
* long time to complete are ignored during the calculation. These
* abap's response time is not a real dialog response time (even if 
* they run in dialog mode) and it can completely offset the actual
* response time of ST03 as well as all the other values (cpu time,
* sequential read ...)
*********************************************************************
TABLES: TRDIR.
DATA: R TYPE P DECIMALS 1, K TYPE P DECIMALS 1, I TYPE I, X TYPE I,
 Y TYPE I, ELEM_PER_ROW TYPE I VALUE 8, LASTREC(8), ELAPSTIM(8).
*
DATA: BEGIN OF LIST OCCURS 10.
 INCLUDE STRUCTURE MSXXLIST.
DATA: END OF LIST.
DATA: BEGIN OF SUMMARY OCCURS 50.
 INCLUDE STRUCTURE SAPWLSUMRY.
DATA: END OF SUMMARY.
DATA: BEGIN OF HI OCCURS 50.
 INCLUDE STRUCTURE SAPWLHITL.
DATA: END OF HI.
DATA: BEGIN OF STAB.
 INCLUDE STRUCTURE SAPWLSUMRY.
DATA: END OF STAB.
*
PARAMETERS: DATE LIKE SY-DATUM MODIF ID SC1 OBLIGATORY.
PARAMETERS: SERVER(8) MODIF ID SC1 OBLIGATORY LOWER CASE.
PARAMETERS: TRUE_RSP AS CHECKBOX.
SELECT-OPTIONS ABPAP FOR TRDIR-NAME NO INTERVALS.
*
PERFORM CALCULATE.
FORMAT INTENSIFIED OFF.
* box1
PERFORM BOX USING 1 4 'Instance'.
SKIP TO LINE 2. POSITION 2.
* line1
WRITE: /2 'SAP System',
 18 SY-SYSID,
 29 'First record',
 45 '00:00:00',
 56 'Date',
 72 DATE.
* line2
IF DATE = SY-DATUM.
 LASTREC = SY-UZEIT.
ELSE.
 LASTREC = '235959'.
ENDIF.
WRITE: / 'Server' UNDER 'SAP System',
 SY-HOST UNDER SY-SYSID,
 'Last record' UNDER 'First record',
 LASTREC USING EDIT MASK '__:__:__' UNDER '00:00:00'.
* line3
READ TABLE LIST INDEX 1.
TRANSLATE LIST-SERV USING 's a p d '.
CONDENSE LIST-SERV NO-GAPS.
WRITE: / 'Instance no.' UNDER 'SAP System',
 LIST-SERV UNDER SY-SYSID,
 'Elapsed time' UNDER 'First record',
 LASTREC USING EDIT MASK '__:__:__' UNDER '00:00:00'.
* box2
PERFORM BOX USING 7 14 'Workload'.
SKIP TO LINE 8. POSITION 2.
* line1
WRITE: /2 'CPU time',
 26 STAB-CPUTI LEFT-JUSTIFIED,
 38 'Database calls',
 62 STAB-PHYCALLS LEFT-JUSTIFIED.
* line2
R = STAB-READDIRCNT + STAB-READSEQCNT + STAB-CHNGCNT.
WRITE: / 'Elapsed time' UNDER 'CPU time',
 STAB-ELAPSEDTI UNDER STAB-CPUTI LEFT-JUSTIFIED,
 'Database requests' UNDER 'Database calls',
 R UNDER STAB-PHYCALLS LEFT-JUSTIFIED.
* line3
WRITE: / ' Direct reads' UNDER 'Database calls',
 STAB-READDIRCNT UNDER STAB-PHYCALLS LEFT-JUSTIFIED.
* line4
WRITE: / 'Dialog steps' UNDER 'CPU time',
 STAB-COUNT UNDER STAB-CPUTI LEFT-JUSTIFIED,
 'Sequential reads' UNDER 'Database calls',
 STAB-READSEQCNT UNDER STAB-PHYCALLS LEFT-JUSTIFIED.
* line5
R = STAB-RESPTI / STAB-COUNT.
WRITE: / ' AV. response time' UNDER 'CPU time',
 R UNDER STAB-CPUTI LEFT-JUSTIFIED,
 'Changes' UNDER 'Database calls',
 STAB-CHNGCNT UNDER STAB-PHYCALLS LEFT-JUSTIFIED.
* line6
R = STAB-CPUTI / STAB-COUNT.
WRITE: / ' AV. CPU time' UNDER 'CPU time',
 R UNDER STAB-CPUTI LEFT-JUSTIFIED.
* line7
R = STAB-QUEUETI / STAB-COUNT.
K = STAB-READDIRTI + STAB-READSEQTI + STAB-CHNGTI.
K = K / ( STAB-READDIRCNT + STAB-READSEQCNT + STAB-CHNGCNT ).
WRITE: / ' AV. wait time' UNDER 'CPU time',
 R UNDER STAB-CPUTI LEFT-JUSTIFIED,
 'Time per DB request' UNDER 'Database calls',
 K UNDER STAB-PHYCALLS LEFT-JUSTIFIED.
* line8
R = STAB-READDIRTI / STAB-READDIRCNT.
K = STAB-LOADGENTI / STAB-COUNT.
WRITE: / ' AV. load time' UNDER 'CPU time',
 K UNDER STAB-CPUTI LEFT-JUSTIFIED,
 ' Direct reads' UNDER 'Database calls',
 R UNDER STAB-PHYCALLS LEFT-JUSTIFIED.
* line9
R = STAB-READSEQTI / STAB-READSEQCNT.
K = ( STAB-READDIRTI + STAB-READSEQTI + STAB-CHNGTI ) / STAB-COUNT.
WRITE: / ' AV. DB req. time' UNDER 'CPU time',
 K UNDER STAB-CPUTI LEFT-JUSTIFIED,
 ' Sequential reads' UNDER 'Database calls',
 R UNDER STAB-PHYCALLS LEFT-JUSTIFIED.
* line10
R = ( STAB-BYTES / 1024 ) / STAB-COUNT.
K = STAB-CHNGTI / STAB-CHNGCNT.
IF TRUE_RSP = 'X'.
 WRITE: / ' AV. bytes req.' UNDER 'CPU time' COLOR 6,
 R UNDER STAB-CPUTI LEFT-JUSTIFIED COLOR 6,
 ' Changes and commis' UNDER 'Database calls',
 K UNDER STAB-PHYCALLS LEFT-JUSTIFIED.
ELSE.
 WRITE: / ' AV. bytes req.' UNDER 'CPU time',
 R UNDER STAB-CPUTI LEFT-JUSTIFIED,
 ' Changes and commis' UNDER 'Database calls',
 K UNDER STAB-PHYCALLS LEFT-JUSTIFIED.
ENDIF.
* line11
WRITE: / .
* line12
R = STAB-ROLLINTI / STAB-ROLLINCNT.
WRITE: / 'Roll-ins' UNDER 'CPU time',
 STAB-ROLLINCNT UNDER STAB-CPUTI LEFT-JUSTIFIED,
 'Av. time/roll in' UNDER 'Database calls',
 R UNDER STAB-PHYCALLS LEFT-JUSTIFIED.
* line13
R = STAB-ROLLOUTTI / STAB-ROLLOUTCNT.
WRITE: / 'Roll-outs' UNDER 'CPU time',
 STAB-ROLLOUTCNT UNDER STAB-CPUTI LEFT-JUSTIFIED,
 'Av. time/roll out' UNDER 'Database calls',
 R UNDER STAB-PHYCALLS LEFT-JUSTIFIED.
* box3
PERFORM BOX USING 23 6 'Task types'.
SKIP TO LINE 24. POSITION 2.
WRITE /2
'Only dialog times! The following long running reports are excluded:'.
FORMAT INTENSIFIED ON.
LOOP AT ABPAP.
 Y = 25 + ( ( SY-TABIX - 1 ) DIV ELEM_PER_ROW ).
 X = ( ( SY-TABIX - 1 ) MOD ELEM_PER_ROW ) * 9 + 2.
 SKIP TO LINE Y. POSITION X.
 WRITE ABPAP-LOW.
ENDLOOP.
*
INITIALIZATION.
 DATE = SY-DATUM.
 SERVER = SY-HOST.
*
*---------------------------------------------------------------------*
* FORM BOX *
*---------------------------------------------------------------------*
FORM BOX USING VALUE(YPOS) HEIGHT TEXT.
*
 DATA: WIDTH TYPE I VALUE 84,
 R TYPE I, K TYPE I.
* Bottom horizontal line
 R = HEIGHT + YPOS.
 SKIP TO LINE R.
 DO WIDTH TIMES.
 WRITE '-' NO-GAP.
 ENDDO.
* Top horizontal line with text
 K = STRLEN( TEXT ).
 R = WIDTH - 2 - K.
 SKIP TO LINE YPOS.
 WRITE: '--'.
 WRITE AT 3(K) TEXT NO-GAP.
 DO R TIMES.
 WRITE: '-' NO-GAP.
 ENDDO.
* Vertical lines
 DO HEIGHT TIMES.
 SKIP TO LINE YPOS.
 WRITE: '|'. POSITION WIDTH. WRITE: '|'.
 YPOS = YPOS + 1.
 ENDDO.
ENDFORM.
*---------------------------------------------------------------------*
* FORM CALCULATE *
*---------------------------------------------------------------------*
FORM CALCULATE.
* Get the performance data
 CALL FUNCTION 'TH_SERVER_LIST'
 TABLES
 LIST = LIST.
 CALL FUNCTION 'SAPWL_GET_SUMMARY_STATISTIC'
 EXPORTING
 PERIODTYPE = 'D'
 HOSTID = SERVER
 STARTDATE = SY-DATUM
 TABLES
 SUMMARY = SUMMARY
 HITLIST_RESPTI = HI.
 LOOP AT SUMMARY.
 IF SUMMARY-TASKTYPE = 'DIALOG'.
 MOVE-CORRESPONDING SUMMARY TO STAB.
 ENDIF.
 ENDLOOP.
* Correction with the abaps
 IF TRUE_RSP = 'X'.
 LOOP AT HI.
 LOOP AT ABPAP.
 IF HI-REPORT = ABPAP-LOW.
 STAB-CHNGCNT = STAB-CHNGCNT - HI-UPDCNT -
 HI-DELCNT - HI-INSCNT.
 STAB-CHNGTI = STAB-CHNGTI - HI-UPDTI - HI-DELTI -
 HI-INSTI.
 STAB-COUNT = STAB-COUNT - 1.
 STAB-CPUTI = STAB-CPUTI - HI-CPUTI.
 STAB-LOADGENTI = STAB-LOADGENTI - HI-GENERATETI -
 HI-REPLOADTI - HI-CUALOADTI - HI-DYNPLOADTI.
 STAB-PHYCALLS = STAB-PHYCALLS - HI-PHYDELCNT -
 HI-PHYREADCNT - HI-PHYINSCNT - HI-PHYUPDCNT.
 STAB-QUEUETI = STAB-QUEUETI - HI-QUEUETI.
 STAB-READDIRCNT = STAB-READDIRCNT - HI-READDIRCNT.
 STAB-READDIRTI = STAB-READDIRTI - HI-READDIRTI.
 STAB-READSEQCNT = STAB-READSEQCNT - HI-READSEQCNT.
 STAB-READSEQTI = STAB-READSEQTI - HI-READSEQTI.
 STAB-RESPTI = STAB-RESPTI - HI-RESPTI.
 STAB-ROLLINCNT = STAB-ROLLINCNT - HI-ROLLINCNT.
 STAB-ROLLOUTCNT = STAB-ROLLOUTCNT - HI-ROLLOUTCNT.
 STAB-ROLLOUTTI = STAB-ROLLOUTTI - HI-ROLLOUTTI.
 ENDIF.
 ENDLOOP.
 ENDLOOP.
 ENDIF.
ENDFORM.