!***********************************************************************
!*
!* 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