!*********************************************************************** !* !* EMAS performance monitoring package !* !*********************************************************************** ! ENDOFLIST INCLUDE "ERCC07.CTOPT" LIST ! !*********************************************************************** !* !* Record formats !* !*********************************************************************** ! RECORDFORMAT COMF(INTEGER OCPTYPE,IPLDEV,SBLKS,SEPGS,NDISCS, DLVNADDR,GPCTABSIZE,GPCA,SFCTABSIZE,SFCA,SFCK,DIRSITE, DCODEDA,SUPLVN,TOJDAY,DATE0,DATE1,DATE2, TIME0,TIME1,TIME2,EPAGESIZE,USERS,CATTAD,SERVAAD, BYTEINTEGER NSACS,RESV1,SACPORT1,SACPORT0, NOCPS,RESV2,OCPPORT1,OCPPORT0, INTEGER ITINT,CONTYPEA,GPCCONFA,FPCCONFA,SFCCONFA, BLKADDR,RATION,SMACS,TRANS,LONGINTEGER KMON, INTEGER DITADDR,SMACPOS,SUPVSN,PSTVA,SECSFRMN,SECSTOCD, SYNC1DEST,SYNC2DEST,ASYNCDEST,MAXPROCS,INSPERSEC,ELAPHEAD, COMMSRECA,STOREAAD,PROCAAD,SFCCTAD,DRUMTAD,TSLICE,FEPS, MAXCBT,PERFORMAD,SP1,SP2,SP3,SP4,SP5,SP6, LSTL,LSTB,PSTL,PSTB,HKEYS,HOOT,SIM,CLKX,CLKY,CLKZ, HBIT,SLAVEOFF,INHSSR,SDR1,SDR2,SDR3, SDR4,SESR,HOFFBIT,BLOCKZBIT,BLKSHIFT,BLKSIZE,END) RECORDFORMAT PERFORMF(INTEGER RECAPN,PTURNN,PSHAREN,NEWPAGEN, PAGEOUTN,PAGEZN,SNOOZN,ABORTN,SNOOZOK, SNOOZTO,SNOOZAB, LONGINTEGER CLOCK, LONGINTEGERARRAY SERVIT,SERVIC(0:LOCSN0+3), INTEGERARRAY SERVN(0:LOCSN0+3)) RECORDFORMAT RF(INTEGER CONAD,FILETYPE,DATASTART,DATAEND) RECORDFORMAT CATTABF(BYTEINTEGER PRIORITY,EPLIM,RTLIM,MOREP,MORET, LESSP,SP0,SUSP,RQTS1,RQTS2,STROBEI,SP2) ! Scheduling category tables RECORDFORMAT PROCF(STRING (6) USER, BYTEINTEGER INCAR,CATEGORY,P4TOP4, RUNQ,ACTIVE, INTEGER ACTW0,LSTAD,BYTEINTEGER EPA,EPN,HALFINTEGER LAMTX, INTEGER STACK,STATUS) ! Process information, etc. ! 2**0 = Holds a semaphore ! 2**1 = On a page fault ! 2**2 = A background job ! 2**3 = Deallocating AMT (&drum) only ! 2**4 = AMT lost ! 2**5 = Had time on fly ! 2**6 = Had epages on fly ! 2**7 = Snoozing ! 2**8 = LC stack read failure ! 2**9 = State X(LC stk snoozed) ! Remainder unused RECORDFORMAT TABF(STRING (15) S,INTEGER PERCENT) ! OWNRECORD (PROCF)ARRAYFORMAT PROCAF(0:MAXPROCS) ! ! !*********************************************************************** !* !* Constants !* !*********************************************************************** ! CONSTANTSTRING (10) PFILE = "T#PERF" CONSTANTSTRING (4) ARRAY PROCESSOR TYPE(1:6) = C "2950","2960","2970","2980","2972","2976" CONSTANTSTRING (31) ARRAY STATES(0:9)= C "holds sema", "page fault", "", "dealloc AMT", "AMT lost ", "Time on fly", "Pages on fly", "snoozing ", "LC failed ", "LC snoozed" CONSTANTSTRING (15)ARRAY SERVROUT(0:LOCSN0+3) = "Idle time", "Nowork time","Deadlock rcvry","Schedule", "Pageturn","Get epage","Return epage","File semaphore","Active mem", "","ElapsedInt","Update time","DPONputonq","Turnon ER", "Activemem(Poll)","Schedule(Oper)","Overalloc Cntrl",""(15), "Disc","Disc transfers","Disc interrupt","","Move requests", "Move transfers",""(2), "Drum transfers","","Drum interrupt",""(5),"GPC requests","Tape", "Oper","LP adaptor","CR adaptor","CP adaptor","Printer", "Comms control","Combine","FEP adaptor","GPC interrupt", ""(2),"BMrep","COMrep",""(2),"Local control","Foregrnd users", "Backgrnd users" CONSTANTRECORD (COMF)NAME COM = X'80C00000' ! ! !*********************************************************************** !* !* Subsystem references !* !*********************************************************************** ! EXTERNALSTRINGFUNCTIONSPEC INTERRUPT SYSTEMROUTINESPEC CONNECT(STRING (31) FILE,INTEGER MODE,HOLE, PROT,RECORD (RF)NAME R,INTEGERNAME FLAG) EXTERNALSTRINGFUNCTIONSPEC DATE SYSTEMSTRINGFUNCTIONSPEC FAILUREMESSAGE(INTEGER MESS) SYSTEMROUTINESPEC FILL(INTEGER LENGTH,FROM,FILLER) SYSTEMSTRINGFUNCTIONSPEC ITOS(INTEGER N) SYSTEMROUTINESPEC MOVE(INTEGER LENGTH,FROM,TO) SYSTEMROUTINESPEC OUTFILE(STRING (31) FILE,INTEGER SIZE,HOLE, PROT,INTEGERNAME CONAD,FLAG) EXTERNALROUTINESPEC PRINTCHS(STRING (255) S) EXTERNALROUTINESPEC PROMPT(STRING (255) S) SYSTEMINTEGERFUNCTIONSPEC PSTOI(STRING (63) S) EXTERNALSTRINGFUNCTIONSPEC TIME EXTERNALSTRINGFUNCTIONSPEC UCSTRING(STRING (255) S) EXTERNALSTRINGFUNCTIONSPEC VDUS(INTEGER I) ! ! !*********************************************************************** !* !* Director references !* !*********************************************************************** ! EXTERNALINTEGERFUNCTIONSPEC DDELAY(INTEGER SECS) ! ! !*********************************************************************** !* !* Own variables !* !*********************************************************************** ! OWNRECORD (PERFORMF)NAME OLDTIMES,PERFORM ! ! !*********************************************************************** !* !* Service routines !* !*********************************************************************** ! LONGINTEGERFUNCTION CLOCK LONGINTEGER L ! *RRTC_ 0 *ST_ L RESULT = (L >> 33 << 32!L & X'0FFFFFFFF') << 1 END ; ! of CLOCK ! ! ROUTINE GET SUPERVISOR TIME INTEGER I,FLAG,CONAD RECORD (RF) RR RECORD (PERFORMF) NEWTIMES ! I = SIZEOF(OLDTIMES) + SIZEOF(PERFORM) CONNECT(PFILE,3,0,0,RR,FLAG) IF FLAG = 218 THEN START OUTFILE(PFILE,I+32,0,X'20000000',CONAD,FLAG) ! Make 'very temporary' IF FLAG = 0 THEN START RR_CONAD = CONAD FILL(I,CONAD+32,0) FINISH FINISH IF FLAG # 0 THEN START PRINTSTRING(FAILUREMESSAGE(FLAG)) STOP FINISH OLDTIMES == RECORD(RR_CONAD+32) PERFORM == RECORD(RR_CONAD+32+SIZEOF(OLDTIMES)) MOVE((11+2+5*68)*4,COM_PERFORMAD,ADDR(NEWTIMES)) PERFORM_CLOCK = CLOCK OLDTIMES_CLOCK = NEWTIMES_CLOCK IF OLDTIMES_CLOCK = 0 NEWTIMES_CLOCK = PERFORM_CLOCK PERFORM_RECAPN = NEWTIMES_RECAPN - OLDTIMES_RECAPN PERFORM_PTURNN = NEWTIMES_PTURNN - OLDTIMES_PTURNN PERFORM_PSHAREN = NEWTIMES_PSHAREN - OLDTIMES_PSHAREN PERFORM_NEWPAGEN = NEWTIMES_NEWPAGEN - OLDTIMES_NEWPAGEN PERFORM_PAGEOUTN = NEWTIMES_PAGEOUTN - OLDTIMES_PAGEOUTN PERFORM_PAGEZN = NEWTIMES_PAGEZN - OLDTIMES_PAGEZN PERFORM_SNOOZN = NEWTIMES_SNOOZN - OLDTIMES_SNOOZN PERFORM_ABORTN = NEWTIMES_ABORTN - OLDTIMES_ABORTN PERFORM_SNOOZOK = NEWTIMES_SNOOZOK - OLDTIMES_SNOOZOK PERFORM_SNOOZTO = NEWTIMES_SNOOZTO - OLDTIMES_SNOOZTO PERFORM_SNOOZAB = NEWTIMES_SNOOZAB - OLDTIMES_SNOOZAB PERFORM_CLOCK = NEWTIMES_CLOCK - OLDTIMES_CLOCK FOR I = 0,1,LOCSN0+3 CYCLE PERFORM_SERVIT(I) = NEWTIMES_SERVIT(I) - OLDTIMES_SERVIT(I) PERFORM_SERVIC(I) = NEWTIMES_SERVIC(I) - OLDTIMES_SERVIC(I) PERFORM_SERVN(I) = NEWTIMES_SERVN(I) - OLDTIMES_SERVN(I) REPEAT PERFORM_SERVIC(0) = PERFORM_SERVN(0) PERFORM_SERVIC(1) = PERFORM_SERVN(1) OLDTIMES = NEWTIMES END ; ! of GET SUPERVISOR TIME ! ! ROUTINE PRINT TABLE(RECORD (TABF)ARRAYNAME TABLE,INTEGER N,LIMIT, STRING (255) T) INTEGER I,J RECORD (TABF) TEMP ! CYCLE J = 0 FOR I = 0,1,N-1 CYCLE IF TABLE(I)_PERCENT<TABLE(I+1)_PERCENT THEN START TEMP = TABLE(I) TABLE(I) = TABLE(I+1) TABLE(I+1) = TEMP J = 1 FINISH REPEAT EXIT IF J = 0 REPEAT ! N = 20 IF N > 20 SPACES((72-LENGTH(T))//2) PRINTSTRING(T) NEWLINE SPACES(17) WRITE(I,4) FOR I = 0,10,100 NEWLINE FOR I = 0,1,N CYCLE EXIT IF TABLE(I)_PERCENT < LIMIT PRINTSTRING(TABLE(I)_S) SPACES(16-LENGTH(TABLE(I)_S)) WRITE(TABLE(I)_PERCENT,2) PRINTSTRING("% ") PRINTSYMBOL('*') FOR J = 0,1,TABLE(i)_PERCENT//2 NEWLINE REPEAT END ; ! of PRINT TABLE ! ! ROUTINE TIMEOUT INTEGER I,K LONGREAL PERIOD,TOTAL,SERVTIME STRING (255) S,TITLE RECORD (TABF)ARRAY TABLE(0:LOCSN0+4) ! TITLE="EMAS2900 SUP".STRING(ADDR(COM_SUPVSN))." Measurements ". C DATE." ".TIME." Period=".ITOS(PERFORM_CLOCK//1000000)." secs" PERIOD = PERFORM_CLOCK*COM_NOCPS K = -1 TOTAL = 0 CYCLE I = 0,1,LOCSN0+3 S = SERVROUT(I) SERVTIME = COM_ITINT*PERFORM_SERVIT(I) IF S # "" AND PERFORM_SERVN(I) # 0 AND 100*SERVTIME/PERIOD > 1.0 THEN START K = K + 1 TABLE(K)_S = S TABLE(K)_PERCENT = INT(100*SERVTIME/PERIOD) FINISH TOTAL = TOTAL + SERVTIME REPEAT K = K + 1 TABLE(K)_S = "INT/ACT/SEMA" TABLE(K)_PERCENT = INT(100*(PERIOD-TOTAL)/PERIOD) PRINTCHS(VDUS(1)) PRINT TABLE(TABLE,K,1,TITLE) END ; ! of TIMEOUT ! ! ROUTINE PAGEING OUT STRING (255) TITLE RECORD (TABF)ARRAY TABLE(0:3) ! TITLE = "EMAS2900 SUP".STRING(ADDR(COM_SUPVSN))." Page ins ". C DATE." ".TIME." Period=".ITOS(PERFORM_CLOCK//1000000)." secs" TABLE(0)_S = "Transfers" TABLE(0)_PERCENT = 100*(PERFORM_PTURNN-PERFORM_RECAPN-PERFORM_PSHAREN C -PERFORM_NEWPAGEN)//PERFORM_PTURNN TABLE(1)_S = "Recaptures" TABLE(1)_PERCENT = 100*PERFORM_RECAPN//PERFORM_PTURNN TABLE(2)_S = "Shared" TABLE(2)_PERCENT = 100*PERFORM_PSHAREN//PERFORM_PTURNN TABLE(3)_S = "Newpages" TABLE(3)_PERCENT = 100*PERFORM_NEWPAGEN//PERFORM_PTURNN PRINTCHS(VDUS(1)) PRINT TABLE(TABLE,3,0,TITLE) END ; ! of PAGEING OUT ! ! !*********************************************************************** !* !* P R I N T C A T E G O R Y T A B L E !* !*********************************************************************** ! EXTERNALROUTINE PRINT CATEGORY TABLE(STRING (255) PARMS) INTEGER MAXCAT ! MAXCAT = INTEGER(COM_CATTAD) ! RECORD (CATTABF)ARRAYFORMAT CATTABAF(0:MAXCAT) RECORD (CATTABF)ARRAYNAME CATTAB INTEGER I ! CATTAB == ARRAY(COM_CATTAD+4,CATTABAF) PRINTCHS(VDUS(1)); ! Clear VDU screen PRINTSTRING(STRING(ADDR(COM_SUPVSN))." ") PRINTSTRING("Dual ") IF COM_NOCPS # 1 PRINTSTRING(PROCESSOR TYPE(COM_OCPTYPE)) PRINTSTRING(" Store=") WRITE(COM_SBLKS*128,0) PRINTSTRING("K Page size=") WRITE(COM_EPAGESIZE,0) PRINTSTRING("K Time slice=") PRINT(COM_TSLICE/1000000,1,4) PRINTSTRING("s ") PRINTSTRING(DATE." ".TIME) NEWLINE PRINTSTRING(C "Category Priority Store Time More More Less Wait RQueue RQueue Strobe") NEWLINE PRINTSTRING(C " queue limit limit store time store slice1 slice2 time") NEWLINE FOR I = 1,1,MAXCAT CYCLE WRITE(I,2) IF CATTAB(i)_SP0 = 'B' THEN PRINTSTRING(" Back") ELSE PRINTSTRING(" Fore") WRITE(CATTAB(I)_PRIORITY,6) WRITE(CATTAB(I)_EPLIM*COM_EPAGESIZE,7); PRINTSYMBOL('K') PRINT((CATTAB(I)_RTLIM*COM_TSLICE)/1000000,2,2); PRINTSYMBOL('s') WRITE(CATTAB(I)_MOREP,4) WRITE(CATTAB(I)_MORET,5) WRITE(CATTAB(I)_LESSP,5) WRITE(CATTAB(I)_SUSP,4) WRITE(CATTAB(I)_RQTS1,6) WRITE(CATTAB(I)_RQTS2,6) IF CATTAB(I)_STROBEI # 0 THEN START PRINT((CATTAB(I)_STROBEI*COM_TSLICE)/1000000,5,2); PRINTSYMBOL('s') FINISH NEWLINE REPEAT PROMPT("") READSYMBOL(I) WHILE I # NL END ; ! of PRINT CATEGORY TABLE ! ! !*********************************************************************** !* !* P R I N T P R O C E S S L I S T !* !*********************************************************************** ! EXTERNALROUTINE PRINT PROCESS LIST(STRING (255) PARMS) INTEGER MAXCAT RECORD (PROCF)ARRAYNAME PROCA ! PROCA == ARRAY(COM_PROCAAD,PROCAF) ! MAXCAT = INTEGER(COM_CATTAD) RECORD (CATTABF)ARRAYFORMAT CATTABAF(0:MAXCAT) RECORD (CATTABF)ARRAYNAME CATTAB ! CATTAB == ARRAY(COM_CATTAD+4,CATTABAF) ! RECORD (PROCF)NAME PROC INTEGER I,J ! FOR I = 1,1,MAXPROCS CYCLE PROC == PROCA(I) IF PROC_USER # "" AND (PARMS = "" OR PROC_USER = PARMS) THEN START WRITE(I,3) IF PROC_STATUS & 4 # 0 THEN PRINTSYMBOL('*') ELSE SPACE PRINTSTRING(PROC_USER) WRITE(PROC_CATEGORY,2) IF PROC_P4TOP4 # 0 THEN WRITE(PROC_P4TOP4,3) ELSE SPACES(4) IF PROC_ACTIVE = 255 THEN START IF PROC_STATUS & 2 = 0 THEN START IF PROC_STATUS & 8 = 0 THEN START IF PROC_RUNQ # 0 THEN START PRINTSTRING(" run Q") WRITE(PROC_RUNQ,1) FINISH ELSE START PRINTSTRING(" Store Q") WRITE(CATTAB(PROC_CATEGORY)_PRIORITY,1) FINISH SPACE FINISH ELSE PRINTSTRING(" ".STATES(3)) FINISH ELSE PRINTSTRING(" ".STATES(1)) SPACES(7) FINISH ELSE START FOR J = 0,1,9 CYCLE IF J # 0 AND J # 1 AND J # 3 AND J # 5 AND J # 6 AND C PROC_STATUS & (1<<J) # 0 AND STATES(J) # "" THEN START PRINTSTRING(" ".STATES(J)) EXIT FINISH REPEAT IF PROC_ACTIVE # 0 THEN START WRITE(PROC_ACTIVE*20,4) PRINTSTRING(" s") FINISH ELSE SPACES(7) FINISH IF PROC_EPA # 0 THEN START PRINTSTRING(" pages") WRITE(PROC_EPA,3) PRINTSTRING(" used") WRITE(PROC_EPN,3) FINISH ELSE SPACES(19) IF PROC_ACTIVE = 255 THEN START PRINTSTRING(" ".STATES(0)) IF PROC_STATUS & 1 # 0 PRINTSTRING(" ".STATES(5)) IF PROC_STATUS & 32 # 0 PRINTSTRING(" ".STATES(6)) IF PROC_STATUS & 64 # 0 PRINTSTRING(" ".STATES(7)) IF PROC_STATUS & 128 # 0 PRINTSTRING(" ".STATES(9)) IF PROC_STATUS & 512 # 0 FINISH NEWLINE EXIT IF PARMS = PROC_USER FINISH REPEAT END ; ! of PRINT PROCESS LIST ! ! !*********************************************************************** !* !* W A T C H !* !*********************************************************************** ! EXTERNALROUTINE WATCH(STRING (255) PARMS) INTEGER SECONDS,I STRING (15) INT STRING (255) USER,TEMP ! IF PARMS -> USER.(",").TEMP THEN START SECONDS = PSTOI(TEMP) FINISH ELSE START USER = PARMS SECONDS = 2 FINISH SECONDS = 2 IF SECONDS < 0 CYCLE PRINTPROCESSLIST(USER) I = DDELAY(SECONDS) INT = UCSTRING(INTERRUPT) EXIT IF INT = "STOP" REPEAT END ; ! of WATCH ! ! !*********************************************************************** !* !* P R I N T S U P E R V I S O R T I M E !* !*********************************************************************** ! EXTERNALROUTINE PRINT SUPERVISOR TIME(STRING (255) PARMS) INTEGER I LONGREAL PERIOD,TOTAL,SERVTIME STRING (15) S ! GET SUPERVISOR TIME PRINTCHS(VDUS(1)); ! Clear screen I = ADDR(COM_DATE0) + 3 PRINTSTRING(" EMAS2900 SUP".STRING(ADDR(COM_SUPVSN))." Timing ". C STRING(I)." ".STRING(I+12)." Period=") PRINT(PERFORM_CLOCK/1000000,1,1) PRINTSTRING(" secs") PERIOD = PERFORM_CLOCK*COM_NOCPS PRINTSTRING(" Service Calls Time(secs) Average(msecs) %Of total") NEWLINE TOTAL = 0 CYCLE I = 0,1,LOCSN0+3 S = SERVROUT(I) SERVTIME = COM_ITINT*PERFORM_SERVIT(I) IF S # "" AND PERFORM_SERVN(I) # 0 THEN START PRINTSTRING(S) SPACES(16-LENGTH(S)) PRINT(PERFORM_SERVN(I),9,0) PRINT(SERVTIME/1000000,11,3) PRINT((SERVTIME/1000)/PERFORM_SERVN(I),10,3) PRINT(100*SERVTIME/PERIOD,8,1) PRINTSTRING("%"); NEWLINE FINISH TOTAL = TOTAL + SERVTIME REPEAT PRINTSTRING("Int/Act/Sema etc.") SPACES(9) PRINT((PERIOD-TOTAL)/1000000,11,3) SPACES(20) PRINT(100*(PERIOD-TOTAL)/PERIOD,2,1) PRINTSTRING("%"); NEWLINE END ; ! of PRINT SUPERVISOR TIME ! ! !*********************************************************************** !* !* P R I N T S U P E R V I S O R P A G I N G !* !*********************************************************************** ! EXTERNALROUTINE PRINT SUPERVISOR PAGING(STRING (255) PARMS) GET SUPERVISOR TIME PRINTCHS(VDUS(1)); ! Clear screen PRINTSTRING(" EMAS2900 SUP".STRING(ADDR(COM_SUPVSN))." Paging ".DATE." ".TIME." Period=") PRINT(PERFORM_CLOCK/1000000,1,3) PRINTSTRING(" secs") PRINTSTRING(" Pageins=".ITOS(PERFORM_PTURNN)." Recaptures=".ITOS(PERFORM_RECAPN)." Shared pages=".ITOS(PERFORM_PSHAREN)." New pages=".ITOS(PERFORM_NEWPAGEN)." Writeouts=".ITOS(PERFORM_PAGEOUTN)." Pages zeroed=".ITOS(PERFORM_PAGEZN)." Pages snoozed=".ITOS(PERFORM_SNOOZN)." Pages aborted=".ITOS(PERFORM_ABORTN)) PRINTSTRING(" Snoozes complete =".ITOS(PERFORM_SNOOZOK)." Snoozes timedout =".ITOS(PERFORM_SNOOZTO)." Snoozes abandoned=".ITOS(PERFORM_SNOOZAB)." ") END ; ! of PRINT SUPERVISOR PAGING ! ! !*********************************************************************** !* !* P R I N T T I M E !* !*********************************************************************** ! EXTERNALROUTINE PRINT TIME(STRING (255) PARMS) GET SUPERVISOR TIME TIMEOUT END ; ! of PRINT TIME ! ! !*********************************************************************** !* !* P R I N T P A G I N G !* !*********************************************************************** ! EXTERNALROUTINE PRINT PAGING(STRING (255) PARMS) GET SUPERVISOR TIME PAGEING OUT END ; ! of PRINT PAGING ENDOFFILE