MXG - Simplified

Download Report

Transcript MXG - Simplified

MXG - Simplified
(MXG for Dummies)
Chuck Hopf
Merrill Consultants
Copyrights

Lots of companies own copyrights on
products and tools mentioned herein. All
of the copyrights are acknowledged.
Agenda
Primarily focused on MVS/ Zos /
OS/390 use of MXG
 Setting up SMF and RMF
 Installing and tailoring MXG
 Using some MXG tools


Ask questions when you feel the need and know that I try to not take all this very
seriously
Tech Note
Code samples assume a minimum level
of MXG of 22.10.
 This is a living document with frequent
updates. The current version will
always be on the MXG download page
at www.mxg.com

Who is this Bozo talking?








Started working with MXG prior to first GA in 1983
Installed MXG and SAS in many data centers (lost count around
50)
Number 1 ‘Code Shark’ - 283 changes as of October 2004
Past chair SWCMG
Past VP of CMG
Past President of CMG
Past General Chair of CMG
Now a resident CMG curmudgeon
Getting Ready - Part 1
Deciding what you need
 SMF Parameters
 RMF Parameters
 Collecting SMF data
 Managing Growth
 Deciding what to keep
 Deciding how long to keep it

Deciding What You Need

What will be the purpose of the MXG
installation?
–
–
–
Charge-back?
Capacity planning?
Problem solving?
Charge-back?

Will need job information
–

May need CICS data
–

type 110
May need DB2 data
–

type 6 26 30
type 101
Other?
–
–
DASD space?
TAPE Usage?
Capacity Planning?
RMF
 Probably same data as chargeback
 DASD space?
 Tape Usage?
 Network?

Problem Solving
Jobs data
 RMF data
 CICS
 DB2
 DCOLLECT
 datasets (14 15 64 61 65 66 42)
 ????????????????

Why Care? It’s Just SMF Data

Volume can go up quickly
–

x*number of LPARs*intervals per day for
type 74 (where x is the number of online
UCBs) can be huge in a hurry. Consider
20000 online 3390-3 across 9 LPARs on
15 minute intervals - 20000*9*96/day
The capacity of the SMF subsystem is
not unlimited - it is limited by the speed
of the devices on which the MAN
datasets reside (among other things.)
Why Care?
If a 3390-3 holds 2.7GB of data and the
speed is 10MB/second then at full
speed it could be filled in 270 seconds
(6.5 minutes). Then you have to dump
and clear which would take 13.
 We fill a 3390-3 every 10 minutes.
 If ANYTHING slows down the SMF
writer - the buffers fill and we lose data.

Why Care?
It takes 10-15 minutes to DUMP/CLEAR
 If we fill in 10 but it takes 10-15 to
DUMP, then there is a 5 minute period
where 2 datasets are being dumped
and 1 is active
 Must have at least 4 datasets in that
instance

Why Care?

So what can slow it down?
–
–
–
–
IO to some other device on the RAID group
Channel contention
Some moron reading the live MANx
dataset with MXG
All of the things that can cause IO to
degrade
Usual Case
You need all of these things - chargeback, capacity planning, and problem
solving.
 And then there are your auditors with
their own set of requirements for data
and data retention.

So why bother?

Why not just keep it all?

Due diligence and to make conscious
versus unconscious choices
Crazy Chuck Axiom #1

When capacity planning becomes a
capacity planning issue, something is
wrong.
Crazy Chuck Corollaries to Murphy’s Law

The piece of data you threw away or did
not enable will be the piece you need to
solve a problem.

Murphy was an optimist.
Setting up SMF
MAN datasets
 SMF parameters
 Processing
 Managing Growth

MANx Datasets

A long time ago in a galaxy far far
away…
–
–
datasets had to be named SYS1.MANx
datasets had to be catalogued in the
MASTER catalog
MANx Datasets

In today’s brave new world
–
–
Datasets can have any name
Datasets can live in a user catalog
MANx Datasets
Let the names conform to some
convention that identifies them
 May or may not be advantageous to
place them in a USER catalog

–
–
Plus side, they can be used by any LPAR
Negative side, they must be cleared on the
system where they are in use
MANx Datasets

For each LPAR:
–
–
–
Two full volume MAN datasets (minimum higher volumes could require more)
Third smaller dataset as a backup
Use different control units/paths just like
you would with PAGE datasets
MANx Datasets

Full Volumes?
–
–
–
Minimizes switching
Minimizes impacts from other workloads
hitting the same volumes
Does not eliminate self-inflicted wounds
(reading of a live SMF dataset with MXG.)
MANx Datasets

What CISIZE?
–
Let the data drive the decision. Member
ANALSMF will do an analysis of your SMF
data and tell you what the optimal CISIZE
will be. But… if you have lots of CICS, the
optimal size will be 16384.
MANx Datasets – CISIZE
SMF Parameters
ACTIVE
/* ACTIVE SMF RECORDING */
DSNAME(SYS1.MANx,SYS1.MANy,SYS1.MANz)
LISTDSN
/* LIST DSN AT IPL
*/
SID(xxxx)
/* SYSTEM ID */
REC(PERM)
/* TYPE 17 PERM RECORDS */
MAXDORM(0500)
/* WRITE IDLE AFTER 05M */
STATUS(SMF,SYNC)
/* WRITE STATS EVERY 15M */
JWT(0014)
/* 522 AFTER 14 MINUTES */
SYNCVAL(59)
/* SYNC TO MINUTE 59 */
INTVAL(15)
/* 15 MINUTE INTERVALS */
DDCONS(NO)
/* DON'T CONSOL T30 EXCP */
NOPROMPT
/* DONT PROMPT OPERATOR */
DUMPABND(NORETRY)
/* DEFAULT RETRY
*/
NOBUFFS(MSG)
/* DEFAULT TO MESSAGE */
LASTDS(MSG)
/* DEFAULT TO MESSAGE */
SYS(NOTYPE(4,5,16,19,34,35,40,69),
EXITS(IEFU83,IEFU84,IEFACTRT,IEFUJV,IEFUSI,IEFUJI,IEFUTL,
IEFU29,IEFUJP),
NOINTERVAL,
NODETAIL)
SUBSYS(STC,EXITS(IEFU29,IEFU83,IEFU84,IEFACTRT,IEFUJP,IEFUSO),
INTERVAL(SMF,SYNC))
SUBSYS(BP01,INTERVAL(001500))
SUBSYS(BT01,INTERVAL(001500))
SUBSYS(OMVS,EXITS(IEFU29,IEFU83,IEFU84,IEFACTRT,IEFUJP,IEFUSO),
INTERVAL(SMF,SYNC))
SUBSYS(HSC0,INTERVAL(SMF,SYNC),TYPE(235))
SUBPARM(HSC0(SUBTYPE(1,2,3,4,5,6,7,8,10-29)))
SMF Parameters
Mostly self-explanatory
 However...

SMF Parameters





SYS(NOTYPE(4,5,16,19,34,35,40,69),
EXITS(IEFU83,IEFU84,IEFACTRT,IEFUJV,IEFUSI,IEFUJI,IEFUTL,
IEFU29,IEFUJP),
NOINTERVAL,
NODETAIL)
Says suppress the 4 5 16 19 34 35 40
and 69 SMF record types
 Use all of the exits
 Do not create detail
 This applies to all subsystems unless
otherwise noted

SMF Parameters
Type 4 5 34 35 are obsolete job and
TSO user records
 Type 16 Old DFSORT records
 Type 19 DASD Volume info (there are
better sources)
 Type 40 - dynamic de-allocation
 Type 69 - VSAM catalog records

SMF Parameters




STATUS(SMF,SYNC)
JWT(0014)
SYNCVAL(59)
INTVAL(15)
/* WRITE STATS EVERY 15M */
/* 522 AFTER 14 MINUTES */
/* SYNC TO MINUTE 59 */
/* 15 MINUTE INTERVALS */
Write SMF 23 every 15 minutes (buffer
status)
 Kill jobs after 14 minutes of waiting
 Synchronize SMF intervals to minute 59
 Write interval records every 15 minutes

SMF Parameters

DDCONS(NO)

From Chapter 3 of MXG:

Number of DDs




70,000
35,000
10,000
/* DON'T CONSOLIDATE T30 EXCP */
CPU Before
DDCONS(YES)
CPU After
DDCONS(NO)
4 hr 5 min
1 hr 3 min
6 min
8 min
3 min
1 min
SMF Parameters

OTOH…
–
We have seen instances where long
running tasks with 10s of thousands of DD
segments write type 30 records so huge
that they cause SMF buffer shortages. This
problem was solved by detecting in an exit
that this was happening and imposing a 10
second delay between type 30 segments.
SMF Parameters


SUBSYS(STC,EXITS(IEFU29,IEFU83,IEFU84,IEFACTRT,IEFUJP,IEFUSO),
INTERVAL(SMF,SYNC))

For the STC subsystem, use these exits AND write
interval records synchronized with the SYNCVAL

This can be important for tracking availability
SMF Parameters



SUBSYS(BP01,INTERVAL(001500))
SUBSYS(BT01,INTERVAL(001500))
Not all subsystems (Batch Pipes in this
case) recognize the SYNCVAL
SMF Parameters



SUBSYS(HSC0,INTERVAL(SMF,SYNC),TYPE(235))
SUBPARM(HSC0(SUBTYPE(1,2,3,4,5,6,7,8,10-29)))
Some subsystems (in this case STK
HSC for controlling tape subsystems)
have their own needs.
SMF Parameters

What about type 99 records?
–
–
–
Refer to Crazy Chuck’s corollaries to
Murphy’s law
As sure as you don’t have it… and it will
be too late to turn it on
Throw them away or redirect them during
the processing cycle
Processing SMF Data
Use the IEFU29 exit to detect a switch
and dump/clear the full dataset
 On a daily basis, consolidate all
dumped data into a single dataset
 On a weekly basis, consolidate daily
data into a weekly dataset (maybe)
 Some sites repeat at the monthly level
but...

Processing SMF Data

Timing
–
–
–
–
Force a switch at chosen time
Dump/clear last dataset of day
Do daily consolidation
Midnight may be ideal but may be
impractical
Processing SMF Data

SMF data is generally a great candidate
for extended format striped compressed
datasets. Compression ratios of 9 or 10
to 1 are not uncommon. There are lots
of binary zeros and blanks in the data.
Processing SMF Data - Simple Case
Single System that does not fill a full dataset in a day
Working Copy
Daily SMF
I SMF
IFASMFDP
Archival
Daily SMF
MANx
Processing SMF Data - Less Simple
Multiple Systems that do not fill a full dataset in a day
I SMF
SYS1
IFASMFDP
Daily SMF
SYS1
MANx
I SMF
SYS2
IFASMFDP
Working Copy
Daily SMF
IFASMFDP
Daily SMF
SYS2
At this point does not HAVE to be
IFASMFDP
Archival
Daily SMF
MANx
Repeat as needed for more
systems
Processing SMF Data -Usual Case
Multiple Systems that fill multiple datasets in a day
When datasets fill and at end of day,
issue I SMF on each system
I SMF
IFASMFDP
MANx
SMF
Dumps
After all dumps are complete
EOD
SMF
SMF
Dumps
SMF
Dumps
SMF
Dumps
SMF
Dumps
Dumps
Working Copy
Daily SMF
IFASMFDP
Archival
Daily SMF
Setting up RMF
RMF Monitor I Parameters
 RMF Monitor III Parameters
 Run both?
 RMF Monitor III Archiving

RMF Monitor I Parameters - Part I
/*********************************************************************/
/* PART 1: MEASUREMENTS
*/
/*********************************************************************/
CHAN
/* CHANNEL STATISTICS
*/
CACHE
/* CACHE RMF REPORTER
*/
CPU
/* CPU STATISTICS
*/
DEVICE(DASD)
/* DIRECT ACCESS DEVICES MEASURED
*/
DEVICE(TAPE)
/* MEASURE TAPE DEVICES
*/
DEVICE(NOCHRDR)
/* NO CHARACTER READER DEVICES MEASURED */
DEVICE(NOUNITR)
/* NO UNIT RECORD DEVICES MEASURED
*/
DEVICE(COMM)
/* COMMUNICATION DEVICES MEASURED */
DEVICE(NOGRAPH)
/* NO GRAPHICS DEVICES MEASURED
*/
DEVICE(NOSG)
/* NO SELECTION BY STORAGE GROUPS
*/
ENQ(DETAIL)
/* DETAILED ENQUEUE REPORT
*/
IOQ(DASD)
/* DASD I/O QUEUEING MEASURED
*/
IOQ(TAPE)
/* TAPE I/O QUEUEING MEASURED
*/
IOQ(NOCHRDR)
/* NO CHARACTER READER I/O QUEUEING */
IOQ(NOUNITR)
/* NO UNIT RECORD DEVICE I/O QUEUEING */
IOQ(COMM)
/* COMMUNICATION I/O QUEUEING
*/
IOQ(NOGRAPH)
/* NO GRAPHICS DEVICE I/O QUEUEING
*/
PAGESP
/* PAGE/SWAP DATASET STATISTICS
*/
PAGING
/* PAGING DATA
*/
TRACE(MCVSTCRI,ALL)
/* HIGH UIC
*/
TRACE(MCVMGAGE,ALL)
/* MIGRATION AGE
*/
TRACE(MCVTWSS,ALL)
/* TARGET WORKING SET SIZE
*/
TRACE(MCVFRCNT,ALL)
/* FORCE STEAL FRAME COUNT
*/
TRACE(RCENWSF,ALL)
/* NON-WSS MOVE TO AUX
*/
TRACE(RCEWSDNE,ALL)
/* WORKING SET MOVE TO AUX
*/
TRACE(RCVAFQA,ALL)
/* AVERAGE AVAILABLE FRAME COUNT
*/
TRACE(RCVUICA,ALL)
/* AVERAGE UNREF. INTERVAL COUNT
*/
TRACE(RMCARSSC,ALL)
/* CENTRAL STORAGE SHORTAGE SWAPS
*/
VSTOR(S)
/* VIRTUAL STORAGE SUMMARY DATA
*/
WKLD(PERIOD,SYSTEM)
/* WORKLOAD MANAGER DATA BY PERIOD */
RMF Monitor I Parameters - Part II
/*********************************************************************/
/* PART 2: TIMING
*/
/*********************************************************************/
CYCLE(0500)
/* SAMPLE TWICE PER SECOND
*/
NOSTOP
/* ACTIVE UNTIL OPERATOR ISSUES STOP */
SYNC(SMF)
/* SYNC INTERVAL
*/
RMF Monitor I Parameters - Part III
/*********************************************************************/
/* PART 3: REPORTING / RECORDING OF DATA
*/
/*********************************************************************/
NOOPTIONS
/* OPTIONS NOT DISPLAYED, NO REPLY */
RECORD
/* WRITE SMF RECORDS EVERY INTERVAL */
NOREPORT
/* NO WRITTEN REPORTS TO SYSOUT
*/
SYSOUT(U)
/* REPORTS TO CLASS U, IF REPORT
*/
RMF Monitor I Parameters - Part IV
/*********************************************************************/
/* PART 4: USER EXITS (ALSO USED BY CACHE REPORTER OFFERING)
*/
/*********************************************************************/
NOEXITS
/* DO NOT TAKE USER EXITS
*/
RMF Monitor I Parameters
Stored in SYS1.PARMLIB as
ERBRMF00
 Can be modified while active

–
F RMF,MODIFY ZZ,xxxxxxxx
RMF Monitor III Parameters
CYCLE(1000)
/* SAMPLE EVERY SECOND (1000 MSEC)
*/
DATASET(ADD(SYS3V.&SYSNAME..RMFMON3A))
DATASET(ADD(SYS3V.&SYSNAME..RMFMON3B))
DATASET(ADD(SYS3V.&SYSNAME..RMFMON3C))
DATASET(ADD(SYS3V.&SYSNAME..RMFMON3D))
DATASET(ADD(SYS3V.&SYSNAME..RMFMON3E),SWITCH)
DATASET(START)
/* DATASET SUPPORT
*/
DATASET(WHOLD(7))
/* CONTROLS BUFFER PAGES IN STORAGE */
MINTIME(60)
/* LENGTH OF MINTIME
*/
NOOPTIONS
/* DO NOT DISPLAY OPTIONS
*/
RESOURCE(*JES2,JES2)
/* SPECIFIES JES STARTED TASK NAME
*/
NOSTOP
/* RUN UNTIL OPERATOR ISSUES STOP
*/
SYNC(00)
/* MINTIME SYNCHRONIZATION
*/
SYSOUT(7)
/* MESSAGES TO SYSOUT CLASS A
*/
WSTOR(32)
/* SIZE OF INSTORAGE BUFFER (IN MB) */
IOSUB
/* I/O SUBSYSTEM GATHERING ACTIVE
*/
NOCACHE
/* TURN OFF CACH RMF REPORTER
*/
RMF Monitor III Parameters









DATASET(ADD(SYS3V.&SYSNAME..RMFMON3A))
DATASET(ADD(SYS3V.&SYSNAME..RMFMON3B))
DATASET(ADD(SYS3V.&SYSNAME..RMFMON3C))
DATASET(ADD(SYS3V.&SYSNAME..RMFMON3D))
DATASET(ADD(SYS3V.&SYSNAME..RMFMON3E),SWITCH)
Uses SYSNAME symbolic to assign that portion of the monitor 3 data store
Stored as ERBMF04 in SYS1.PARMLIB
1 data store can hold up to 18 hours of data or less depending on activity and
volume regardless of size
Turning on CACHE gets very expensive - we have seen 20% of a CPU
RMF Monitor III Parameters

Can be modified on the fly
–
F RMF,MODIFY III,xxxxxxxxxxxxx
RMF - Should I Run Both I and III?

They serve different purposes
–
–

Monitor I feeds MXG with SMF data
Monitor III provides real-time problem
solving capabilities - in some cases
superior to other monitoring tools
Both provide data that can be postprocessed
RMF - Monitor III Archiving
It may be wise to archive monitor III
data against the possible need for
problem diagnosis
 No tools provided but it is not difficult to
do

RMF Monitor III Archival
RMF III
Switch
detected
RMF III
DATA
STORE
IDCAMS
REPRO
ERB813I indicating a new RMF III dataset is active
RMF III
ARCHIVE
Crazy Chuck Axiom #2

Work expands to exceed any available
capacity
Managing Growth

What do you do as the data starts to
grow?
–
Put it on tape
 Single
–
user - still cannot share tapes
Break it into pieces
 Divide
and conquer
 Break into as many pieces as needed on DASD
 Put archive copy on tape
Managing Growth
CICS and DB2 are likely the first
problems - split them out early in the
process.
 Replicate the SMF process in miniature
for these components.

Managing Growth
When datasets fill and at end of day,
issue I SMF on each system
I SMF
IFASMFDP
MANx
Do the CLEAR in a second
step
After all dumps are complete
Duplicate process for CICS and DB2
but eliminate disk copy
SMF
NOTYPE
99 101 110
EOD
SMF
CICS
TYPE 110
SMF
TYPE 101
DB2
SMF
TYPE 99
WLM
SMF
SMF
Dumps
SMF
Dumps
SMF
Dumps
SMF
Dumps
Dumps
Working Copy
Daily SMF
IFASMFDP
Archival
Daily SMF
Managing Growth

Assume that the input DD is INDD, the
primary output is OUTSMF, the CICS data
should go to OUTCICS, and the DB2 type
101 to OUTDB2, type 99 to OUTWLM:
– IFASMFDP Control cards are:
 INDD(INDD,OPTIONS(DUMP))
 OUTDD(OUTSMF,NOTYPE(99,101,110))
 OUTDD(OUTCICS,TYPE(110))
 OUTDD(OUTDB2,TYPE(101))
 OUTDD(OUTWLM,TYPE(99))
Managing Growth
Eventually, you have to go deeper.
CICS/DB2 may each grow to the point
where they have to be broken up
 This requires using some exit points in
IFASMFDP to read enough of the data
to determine APPLID or some other
identifying information to drive the split

Managing Growth
When datasets fill and at end of day,
issue I SMF on each system
I SMF
MANx
SMF
TYPE
99
SMF
NOTYPE
101 110
IFASMFDP
CICS1
TYPE 110
CICS APPL 1
CICS2
TYPE 110
CICS APPL 2
CICS3
TYPE 110
CICS APPL 3
SMF
TYPE 101
DB2
WLM
Managing Growth
Requires some assembler programming
skills
 See the SMF manual for details on exits
 There are three IFASMFDP exits:

–
–
–
Exit 1 is called when records are read
Exit 2 is called when records are selected
for output
Exit 3 is called when output datasets are
closed
Managing Growth
–
IFASMFDP Control cards are:








INDD(INDD,OPTIONS(DUMP))
OUTDD(OUTSMF,NOTYPE(99,101,110))
OUTDD(OUTCICS1,TYPE(110))
OUTDD(OUTCICS2,TYPE(110))
OUTDD(OUTCICS3,TYPE(110))
OUTDD(OUTDB2,TYPE(101))
OUTDD(OUTWLM,TYPE(99))
USER3(YOUR3)
USER2(YOUR2)
USER1(YOUR1)
Managing Growth

CICS allows for some tailoring of the
records written. You can drop fields that
are obsolete or that you do not use or
think that you need.
Managing Growth
Tailored
MCT
Rollout
Managing Growth

Tailoring the MCT requires tailoring of
MXG as well. UTILEXCL will build the
code to read the records based on the
CICS dictionary contents but… change
control is very very important. If it
changes, you must rebuild the code.
Deciding What to Keep
Refer to axiom 1
 At least at the daily level, keep
everything
 After the daily level, it becomes a matter
of cost benefit analysis - what do you
get out of keeping the data vs the cost
 May also be auditing/security concerns

Deciding What to Keep
It can get very expensive to keep
CICS/DB2 and other high volume data
 Tapes are not forever
 Consolidating to the WEEKLY level may
reduce tape volumes used. Beyond
weekly, reduction is usually minimal but
the resource cost can be high.

Deciding How Long to Keep It

Largely an audit/legal concern
–
–
–
May be legal reasons to keep the data for
many years
Beyond 6 months the likelihood it will be
needed for problem solving is minimal
Beyond 5 years the likelihood of being able
to read the tapes drops quickly
Now That You Have the Data

Installing MXG
–
–
–
–
–
–
–
–
–
Conventions
SOURCLIB
FORMATs
 Installing
Tailoring Exits
Tailoring MXG
Weekly/Monthly/TREND Processing
Non-SMF Data Sources
Managing Growth
Using Some MXG Tools
MXG - Conventions
All datasets are controlled by MACRO
variables
 MACRO variables are set in VMXGINIT
 Can be overridden INSTREAM
 For every IMACxxxx there is a macro
variable MACxxxx
 All tailoring could be done INSTREAM

MXG - Conventions
IMACxxxx - Installation exits
 VMACxxxx - Code to read data
 TYPExxxx - Reads data into WORK
 TYPSxxxx - Reads/sorts data into PDB
 VMXGxxxx - A macro
 ANALxxxx - Some sort of analysis
 GRAFxxxx - Graphical analysis

MXG Conventions
ACHAPxx - Chapters from MXG book
 ADOCxxxx- documentation
 CHANGES - current changes
 CHANGESS - all changes
 NEWLTRS - News letters
 JCLxxxxx - JCL examples

MXG - SOURCLIB
Must be a PDS
 Keep 3 levels:

–
USERID.SOURCLIB
 Your
–
changes/additions to MXG
CHANGES.SOURCLIB
 Important
–
changes between releases
MXG.SOURCLIB
 Current
production release
MXG - SOURCLIB

May also want a NULL PDS as filler:
–
–
–
–
–
–
–
//STEP1 MXG PROC …..
// TAILORNG=‘MXG.NULL.SOURCLIB’,
…
//SOURCLIB DD DSN=&TAILORNG
// DD DSN=USERID.SOURCLIB
// DD DSN=CHANGES.SOURCLIB
// DD DSN=MXG.SOURCLIB
MXG - FORMATs
FORMATs are used by SAS to provide
human intelligible descriptions of data.
 Does ‘01’X have meaning or is ‘1:
Mount Missed, Too Fast’ more
descriptive?
 Saves space
 FORMAT library needs less than 5
cylinders

MXG Installation - 1st Time

Build using ISPF option 3.2
–
–
–
–
–
MXG.NULL.SOURCLIB - 1 track
MXG.USERID.SOURCLIB - 15 cylinders
MXG.CHANGES.SOURCLIB - 15 cylinders
All with LRECL=80 BLKSIZE=27920
RECFM=FB DSORG=PO
Directory blocks can be 25
MXG Installation - 1st Time

Using JCL:
–
–
–
–
–
–
–
–
–
–
–
–
–
//STEP1 EXEC PGM=IEBUPDTE,PARM=NEW
//SYSPRINT DD DUMMY
//SYSIN DD DSN=MXG.IEBUPDTE
//SYSUT2 DD DSN=MXG.PROD.SOURCLIB,
// DISP=(,CATLG,DELETE), RECFM=FB,
// LRECL=80,BLKSIZE=27920,
// DSORG=PO,SPACE=(CYL,(225,25,999))
//STEP2 EXEC SAS
//SOURCLIB DD DSN=MXG.PROD.SOURCLIB,DISP=SHR
//LIBRARY DD DSN=MXG.PROD.FORMATS,DISP=(,CATLG,DELETE),
// SPACE=(CYL,(15,15))
//SYSIN DD *
%INCLUDE SOURCLIB(FORMATS);
MXG Installation - 1st Time
Build MXG Proc:
//MXG PROC ENTRY=SASHOST,
//
CONFIG='MXG.PROD.SOURCLIB(CONFIG08)',
//
SASNODE='SAS.PROD',
//
MXGNODE='MXG',
//
TAILORNG='MXG.NULL.SOURCLIB',
//
OPTIONS=,
//
LIST='*',
//
LOG='*',
//
SORT=4,
//
SORTWK=100,
//
WORKUNIT=CYL,
//
WORKNUM=1,
//
WORK='150,30
...
MXG Installation - 1st Time
//SAS EXEC PGM=&ENTRY,PARM='SORT=&SORT &OPTIONS'
//STEPLIB DD DISP=SHR,DSN=&SASNODE..LIBRARY
//CTRANS DD DSN=&SASNODE..SASC.TRANSLIB,DISP=SHR
//CONFIG DD DISP=SHR,DSN=&SASNODE..CNTL(BATCHXA)
//
DD DISP=SHR,DSN=&CONFIG
//SASHELP DD DISP=SHR,DSN=&SASNODE..SASHELP
//SASMSG DD DISP=SHR,DSN=&SASNODE..SASMSG
//WORK
DD UNIT=(SYSDA,&WORKNUM),SPACE=(&WORKUNIT,(&WORK),RLSE),
//
DCB=RECFM=FS
//SORTWKxx DD UNIT=SYSDA,SPACE=(CYL,&SORTWK)
//SASLOG DD SYSOUT=&LOG
//SASLIST DD SYSOUT=&LIST
//SASPARM DD UNIT=SYSDA,SPACE=(400,(100,300)),
//
DCB=(RECFM=FB,LRECL=80,BLKSIZE=400,BUFNO=1)
//SYSUDUMP DD SYSOUT=*
//LIBRARY DD DSN=&MXGNODE..PROD.FORMATS,DISP=SHR
//SOURCLIB DD DSN=&TAILORNG,DISP=SHR
//
DD DSN=&MXGNODE..USERID.SOURCLIB,DISP=SHR
//
DD DSN=&MXGNODE..CHANGES.SOURCLIB,DISP=SHR
//
DD DSN=&MXGNODE..PROD.SOURCLIB,DISP=SHR
MXG Installation - 1st Time
May not need SASC transients but it is
simpler to have them there than to go
back and add them.
 SORTWKxx is the number of SORTWK
datasets you think you may need. It
can always be overridden and more
added as needed. I start with 6.

MXG Installation - After the 1st
Simpler
//STEP1 EXEC PGM=IEBUPDTE,PARM=NEW
//SYSPRINT DD DUMMY
//SYSIN DD DSN=MXG.IEBUPDTE
//SYSUT2 DD DSN=MXG.Vrelease.SOURCLIB,
// DISP=(,CATLG,DELETE), RECFM=FB,
// LRECL=80,BLKSIZE=27920,
// DSORG=PO,SPACE=(CYL,(225,25,999))
//STEP2 EXEC SAS
//SOURCLIB DD DSN=MXG.Vrelease.SOURCLIB,DISP=SHR
//LIBRARY DD DSN=MXG.Vrelease.FORMATS,DISP=(,CATLG,DELETE),
// SPACE=(CYL,(15,15))
//SYSIN DD *
%INCLUDE SOURCLIB(FORMATS);
release is the MXG release number
MXG Installation - After the 1st
Do testing:
//STEP1 EXEC MXG
//LIBRARY DD DSN=MXG/Vrelease.FORMATS,DISP=SHR
//SOURCLIB DD
//
DD
//
DD DSN=MXG.Vrelease.SOURCLIB,DISP=SHR
MXG Installation - After the 1st
I test all production jobs (there are more
than 20) with production inputs
 Output compared using VMXGCOMP to
drive a PROC COMPARE of all
datasets

MXG Installation - After the 1st

When testing is finished and you are
ready to install
–
–
–
Delete all members from MXG.CHANGES.SOURCLIB
Copy MXG.Vrelease.SOURCLIB to MXG.PROD.SOURCLIB
Copy MXG.Vrelease.FORMATS to MXG.PROD.SOURCLIB (use PROC
COPY)
MXG Exits
Was originally much more complex
 There were many exit points to be
touched
 Now down to only a few

MXG Exits
IMACINIT
 IMACSHFT
 IMACKEEP
 IMACUCB
 RMFINTRV
 Others

MXG Exits - IMACINIT
IMACINIT is a place to put things you
ALWAYS want to have invoked
whenever MXG is invoked
 Some examples of usage will follow:

MXG Exits - IMACINIT

You have LPARs in multiple time zones
but want all times to be uniform. Add to
IMACINIT:
–
–
%TIMEBILD(TIMEBILD=YES);
to use VMXGTIME and TIMETABL to
adjust the timestamps of SMF data to a
common time zone.
MXG Exits - IMACINIT

You have site specific global macro
variables you want to initialize. Add to
IMACINIT:
–
–
%GLOBAL MYVAR;
%LET MYVAR=XYZ;
MXG Exits - IMACSHFT
Classic SHIFT definitions may not have
the same meaning they once did
 There is still usually a big difference in
daytime versus nighttime processing
 It is useful to assign a FORMAT to the
SHIFT variable that describes the
SHIFT

Crazy Chuck Axiom #3
You can lead a manager to the
documentation but you cannot make
him/her read it or remember it from day
to day.
 Dilbert Principle Summarized:

–
“A retarded chimpanzee can drink a case
of beer and still perform most management
functions.” Scott Adams - Dilbert and the Way of the
Weasels
MXG Exits - IMACSHFT

Standard IMACSHFT Defines Shifts as:
–
–
–
8:00-17:00 Monday-Friday = P
17:00-08:00 Monday-Friday = N
08:00 Saturday - 08:00 Monday = W
MXG Exits - IMACSHFT
Are holidays important?
 They can make a significant difference
in data at the weekly level
 It is a management decision. If they
want it reported separately - separate it.

MXG Exits - IMACSHFT
Crazy Chuck Axiom #4
Never argue with managers about how
they want data reported. You cant win
(unless you are a consultant.) Being
right is not enough.
 They say it is possible to teach a pig to
sing but the process annoys the pig and
is very frustrating.

MXG Exits - IMACSHFT

Assume that all you want to change is
to apply the format you built called
$SHIFT to the SHIFT variable.
–
Place the following in IMACINIT in your
USERID.SOURCLIB
 %LET

 );
MACSHFT=%QUOTE(
FORMAT SHIFT $SHIFT.;
MXG Exits - IMACSHFT

Building the $SHIFT format:
–
Place the following in IMACFMTS:
 PROC
FORMAT LIBRARY=LIBRARY;
 VALUE $SHIFT
 ‘P’=‘8:00-17:00 Monday-Friday’
 ‘N’=‘17:00-08:00 Monday-Friday’
 ‘W’=‘Weekends’;
MXG Exits - IMACSHFT
Could also use the FMTSEARCH option
and place user formats in a separate
library.
 In IMACINIT:

–
OPTION FMTSEARCH=MYFORMAT LIBRARY;
MXG Exits - IMACKEEP
Only thing that needs to be here is the
identity of all user SMF records.
 Could be done INSTREAM
 Could be done in IMACINIT

MXG Exits - IMACKEEP

General Syntax:
–
–
–
–
MACRO _IDxxxx yyyy %
where xxxx is the NAME of the record type
and yyyy is the record number
Assume STK silos use record number 218
MACRO _IDSTC 218 %
MXG Exits - IMACKEEP

Using IMACKEEP
–
–
–
–
–
MACRO _IDSTC 218 %
MACRO _SYNCID 208 %
MACRO _IDHSMDS 219 %
etc etc
Last statement must be:
 &MACKEEP
;
MXG Exits - IMACKEEP

Doing it INSTREAM:
–
%LET MACKEEP=%QUOTE(
 MACRO
–
–
_IDSTC 218 %
);
%INCLUDE SOURCLIB(TYPSSTC);
MXG Exits - IMACKEEP

Using IMACINIT
–
–
–
–
MACRO _IDSTC 218 %
MACRO _SYNCID 208 %
MACRO _IDHSMDS 219 %
etc etc
MXG Exits - IMACKEEP

So which is best?
–
–
I use IMACKEEP but from time to time may
override using the INSTREAM approach
when testing new releases
Using IMACKEEP in USERID.SOURCLIB
ensures that all users get the right answers
MXG Exits -IMACUCB

Suppose you have:
–
–
–
–
–
–
–
–
–
–
Real 3480 drives
Real 3490 drives
Virtual tape drives
Robotic 3490 drives
Autoloader 3490 drives
Manual 3490 drives
SHARKs
HDS 9900
HDS 7700
etc
MXG Exits - IMACUCB

Device variable for tape drives will be:
–
–
–

3480
3490
3590
Device variable for DASD devices will
be:
–
3390 (maybe 3380 but not very likely)
MXG Exits - IMACUCB

It may be important to know:
–
–
–
–
–
Was it real tape or virtual?
Was it robotic/autoloader/manual?
Which VTS was it?
Was it a 3390-3 or a 3390-9?
Which RAID box is it in?
MXG Exits - IMACUCB
IMACUCB can answer the questions by
hammering the DEVICE variable into
something more meaningful based on
DEVNR.
 Makes summaries by DEVICE more
meaningful
 Allows for reporting by the real DEVICE
type

MXG Exits - IMACUCB
MXG Exits - IMACUCB
Can be done as hard-coded IF-THENELSE logic
 Can be done as a user FORMAT

MXG Exits - IMACUCB
IF 400X LE DEVNR LE 43FX THEN DEVICE=‘VT01 ‘;
ELSE IF 440X LE DEVNR LE 47FX THEN DEVICE=‘VT02 ‘;
ELSE IF DEVICE=:’3490’ THEN DO;
IF 210X LE DEVNR LE 28FX THEN DEVICE=‘ROBOTIC’;
ELSE IF 2B0X LE DEVNR LE 2BFX THEN DEVICE=‘AUTOLOAD’;
END;
ELSE IF DEVICE=:’3390’ THEN DO;
IF 1200X LE DEVNR LE12FFX THEN DEVICE=‘7700-1’;
ELSE IF 0A000X LE DEVNR LE 0A7FFX THEN DEVICE=‘9900-1’;
ELSE IF 0B000X LE DEVNR LE 0B5FFX THEN DEVICE=‘SHARK 1’;
END;
MXG Exits - IMACUCB
Using FORMAT - IMACUCB is:
DEVICE=PUT(DEVNR,MYDEVS.);
Building the FORMAT:
PROC FORMAT LIB=MYFMTS;
VALUE MYDEVS
400X-47FX=‘VT01’
440X-47FX=‘VT02’
210X-28FX=‘ROBOTIC’
2B0X-2BFX=‘AUTOLOAD’
1200X-12FFX=‘7700-1’
0A000X-0A7FFX=‘9900-1’
0B000X-0B5FFX=‘SHARK 1’
;
MXG Exits - RMFINTRV
Was originally done in IMACWORK
 Moved here to allow for more workloads
to be defined
 Can still be done in IMACWORK but
this is a more flexible way to do it

MXG Exits - RMFINTRV
RMFINTRV is the call to VMXGRMFI
which builds the RMFINTRV dataset
during the BUILDPDB process.
 Lots of parameters and options
 Primary focus here is defining
workloads

MXG Exits - RMFINTRV

Should I use report classes or service
classes? Report performance groups or
control performance groups?

It Depends!
Crazy Chuck Axiom #5

All questions can be answered with one
of the following:
–
–
–
–
–
–
42
It Depends
Green
huh?
A withering stare
What is the air speed velocity of a fully laden swallow?

European or African?
MXG Exits - RMFINTRV
If you are in compatibility mode unless
you are very careful with report
performance groups it is easy to double
dip the CPU time
 If you are in Goal Mode, that is not an
issue (no task can be in more than a
single report class) but you can still
double dip if you mix report classes and
service classes

MXG Exits - RMFINTRV
My opinion (Goal Mode):
 Use one or the other but don’t try to use
both. It almost invariably causes
problems. If you use report classes,
EVERY task must be assigned to a
report class. No exceptions. I have a
strong tendency towards report classes
since there can be many more.

MXG Exits - RMFINTRV
My opinion - compat mode
 Use performance groups exclusively. It
is safer and simpler.

MXG Exits - RMFINTRV
Coding RMFINTRV:
%VMXGRMFI(
PDB=PDB,
OUTDATA=PDB.RMFINTRV,
INTERVAL=QTRHOUR,
SYNC59=1.1,
IMACWORK=NO,
USECNTRL=COMPAT,
USEREPRT=GOAL,
WORKxx=zzzz/yyyyyyyy/pgns/srvclass/system/sysplex/workload
…..
);
MXG Exits - RMFINTRV

WORKxx=
–
xx is number from 1 to 99
zzzz - first four characters of variable names
yyyyyyy - first line of label
pgns - performance group(s) in this workload
srvclass - service class(s) in this workload
system - system(s) participating
sysplex - sysplex(s) participating
–
workload - workload(s) participating
–
–
–
–
–
–
MXG Exits - RMFINTRV

Workloads that are not categorized
(they fall thru the workload definitions)
will be lumped into ‘OTHR’ variables.
MXG Exits - RMFINTRV

WORK1=BAT/Test Batch/1/BATCH
–
Says there will be variables in RMF starting
with BAT that have labels starting with ‘Test
Batch’ where the data was derived from
type72 records with a performance group
of 1 or a service class of ‘BATCH’.
MXG Exits - RMFINTRV

What if….
–
–

System A has report class TSO which is really test
System B (different plex) has same report class which is not
and has TSOTEST which is
Solution:
–
–
–
–
WORKx=TSO/TSO Test//TSO/SYSA//2,
WORKy=TSO/TSO Test//TSOTEST/SYSB//2
WORKz=TSOP/TSO//TSO/SYSB//3
...
MXG Exits - RMFINTRV

What if you want to have different
summary levels?

Invoke RMFINTRV twice!
MXG Exits - RMFINTRV

Add an RMF interval dataset by
workload
%VMXGRMFI(
PDB=PDB,
OUTDATA=PDB.RMFWORK,
INTERVAL=QTRHOUR,
SYNC59=1.1,
IMACWORK=NO,
USECNTRL=GOAL,
WORK1=TSO/TSO//////TSO,
WORK2=BATCH/BATCH/////BATCH,
WORK3=CICS/CICS/////CICS,
WORK4=STC/STC/////STC,
WORK5=DB2/DB2/////DB2,
WORK6=DDF/DDF/////DDF
);
MXG Exits - Others
EXTY30UD - controls the existence of
type 30 DD segments
 IMACINTV - controls the existence of
SMF interval records
 IMACACCT- allows you to limit the
number of accounting fields kept and
their size

Defining Kept Variables

Can be done using the ‘MACKEEP’
macro variable to redefine the
_Vdddddd macro for a dataset or by
using the _Kdddddd macro for the
dataset.
Defining Kept Variables

Using MACKEEP - drop ZDATE UNITADR
UCBTYPE
%LET MACKEEP=%QUOTE(
MACRO _VTY21
_WTY21 /* TYPE21 */
(LABEL='TY21: TYPE 21 SMF - TAPE ERROR STATS'
KEEP=BLKSIZE BYTEREAD BYTEWRIT CLEAN
DCBOFLG DENSITY DEVICE DEVNR
ERASE ERRORS LCU NOISE OPEN PERMREAD
PERMWRIT SIOCOUNT SMFTIME SYSTEM
TAPCUSER TEMPREAD TEMPRBER TEMPRFER
TEMPWRER TEMPWRIT
VOLSER
)
%
);
Defining Kept Variables

Using _Kdddddd - drop ZDATE UNITADR
UCBTYPE
%LET MACKEEP=%QUOTE(
MACRO _KTY21
DROP=ZDATE UNITADR UCBTYPE
%
);
Defining Kept Variables

Using MACKEEP - ADD variable DRIVE
%LET MACKEEP=%QUOTE(
MACRO _VTY21
_WTY21 /* TYPE21 */
(LABEL='TY21: TYPE 21 SMF - TAPE ERROR STATS'
KEEP=BLKSIZE BYTEREAD BYTEWRIT CLEAN
DCBOFLG DENSITY DEVICE DEVNR
ERASE ERRORS LCU NOISE OPEN PERMREAD
PERMWRIT SIOCOUNT SMFTIME SYSTEM
TAPCUSER TEMPREAD TEMPRBER TEMPRFER
TEMPWRER TEMPWRIT
UCBTYPE UNITADR
VOLSER
ZDATE DRIVE
)
%
);
Defining Kept Variables

Using _Kdddddd - add variable DRIVE
%LET MACKEEP=%QUOTE(
MACRO _KTY21
DRIVE
%
);
Defining Kept Variables

Using MACKEEP - ADD variable DRIVE
%LET MACKEEP=%QUOTE(
MACRO _VTY21
_WTY21 /* TYPE21 */
(LABEL='TY21: TYPE 21 SMF - TAPE ERROR STATS'
KEEP=BLKSIZE BYTEREAD BYTEWRIT CLEAN
DCBOFLG DENSITY DEVICE DEVNR
ERASE ERRORS LCU NOISE OPEN PERMREAD
PERMWRIT SIOCOUNT SMFTIME SYSTEM
TAPCUSER TEMPREAD TEMPRBER TEMPRFER
TEMPWRER TEMPWRIT
UNITADR
VOLSER
ZDATE DRIVE
)
%
);
Defining Kept Variables

Using _Kdddddd - add variable DRIVE
and drop variable UCBTYPE
%LET MACKEEP=%QUOTE(
MACRO _KTY21
DRIVE DROP=UCBTYPE
%
);
Which Technique is Correct?

Both
–
–
First listing all variables makes it more
clear
Second is a lot less typing
Hardware Compression






Applies only to tape format SAS datasets on
disk
May be striped
May be compressed
May be striped and compressed
Only a single SAS dataset per DD can be
open at any point in time
Useful for things like CICSTRAN DB2ACCT
MXG Installation - BUILDPDB

If you want nothing but the standard
PDB, you are ready to rock and roll
but… if you want to add records or
tailor things you have more work to do.
MXG Installation - BUILDPDB

Originally, if you wanted to add records,
you had to use several exits:
EXPDBINC EXPDBCDE EXPDBVAR
EXPDBOUT. This technique will still
work but there is a simpler way.
MXG Installation - UTILBLDP

Say you wanted to add HSM records to
the PDB being built. UTILBLDP (a
macro utility) can construct the exits as
part of MACKEEP in your SYSIN.

For example - to add HSM to the PDB:
MXG Installation - UTILBLDP
%UTILBLDP(
OUTFILE=MYSYSIN,
BUILDPDB=YES,
USERADD=HSM/204
);
Tells UTILBLDP that you want to run BUILDPDB, include HSM data on
SMF type 204 records in the PDB, and write the SYSIN out to a
DD/FILENAME of MYSYSIN.
The SYSIN constructed would be:
MXG Installation - UTILBLDP
%LET MACKEEP=%QUOTE(
MACRO _SPINCNT 0 %
MACRO _SPINUOW 0 %
MACRO _TIMEDIF 0 %
MACRO _IDHSMDS 204 %
MACRO _VARUSER
_VARHSM
%
MACRO _CDEUSER
_CDEHSM
%
MACRO _EPDBOUT
_SHSM
%
);
%LET EPDBINC %QUOTE(
VMACHSM
);
%INCLUDE SOURCLIB(BUILDPDB);
...
MXG Installation - UTILBLDP
%INCLUDE SOURCLIB(ASUMUOW);
%INCLUDE SOURCLIB(ASUMCICX);
%INCLUDE SOURCLIB(ASUM70PR);
%INCLUDE SOURCLIB(ASUMCACH);
%INCLUDE SOURCLIB(ASUMTAPE);
%INCLUDE SOURCLIB(ASUMTMNT);
%INCLUDE SOURCLIB(ASUMTALO);
%INCLUDE SOURCLIB(ASUMDB2A);
%INCLUDE SOURCLIB(ASUMDB2B);
Defaults included after BUILDPDB - unless the input
data is suppressed.
MXG Installation - UTILBLDP

As many user SMF record types as
desired can be added (region size may
have to be increased):
–
USERADD=HSM/208 SYNC/214
TSOM/220 ….
–
Separated by spaces terminated with a
comma or );
MXG Installation - UTILBLDP

What if you want to suppress some
records? Say CICS DB2 and the type
74 RMF records
%UTILBLDP(
BUILDPBD=YES,
OUTFILE=SOURCLIB(MYPDB),
SUPPRESS=110 DB2 74
);
MXG Installation - UTILBLDP

What if you want to suppress just the 74
subtype 1?
%UTILBLDP(
BUILDPBD=YES,
OUTFILE=SOURCLIB(MYPDB),
SUPPRESS=74.1
);
MXG Installation - UTILBLDP

It is not required that you store the
output of UTILBLDP. You can run and
execute the code as your SYSIN.
%UTILBLDP(
BUILDPBD=YES,
MYFILE=INSTREAM,
SUPPRESS=110 DB2 74
);
%INCLUDE INSTREAM;
Retaining Data
Weekly/Monthly Processing vs
WTD/MTD processing
 TREND processing
 How long?

Processing Cycle
Original Implementation Circa 1983
 Worked when SMF volume was small
 Breaks down as volumes increase
without major changes

–
primarily a space issue - how large is the
largest dataset when you try to create it at
a monthly level
Processing Cycle
Daily
SMF
STOP
NO
NO
YES
BUILDPDB
Monday?
1st
Month?
WEEKBLD
YES
MONTHBLD
Monthly
PDB
7
DAILY
PDBs
5
Weekly
PDB
Weekly Processing
Uses previous 7 daily PDBs
 Builds the datasets in sequence
 May be to tape or to disk
 Volume can quickly become a problem

WTD Processing
Same logic as weekly but run each day
 At end of week, the same datasets are
created but the resource consumption is
spread out
 A key is to reduce the number of
variables kept

Monthly Processing
Use last 5 weekly and last 7 daily PDBs
to construct the previous calendar
month.
 Logic MUST run on 1st day of month
 Can be extraordinarily resource
intensive
 Uses tape format datasets on disk to
avoid multiple mounts

MTD Processing
Like the WTD processing, runs each
day with a job at the end of the month to
create the next MTD PDB.
 Reduce the variables even further than
the WTD process
 Reduce the datasets retained

WTD/MTD Processing

Both rely on a new macro VMXG2DTE
–
You specify input and output Ddnames,
dataset name, by list if appropriate,
whether or not to use PROC APPEND,
what cycle and when to start the cycle, and
a list of variables to keep or drop
(whichever is shorter).
WTD/MTD Processing

Month-to date starting on 1st of month
using PROC APPEND
%VMXG2DTE(
DDIN=MTDPDB,
DDOUT=MTDPDB,
APPEND=YES,
PDB=PDB,
DATASET=JOBS,
INITIT=M1,
DROPPER=var1 var2
);
WTD/MTD Processing

WTD starting on Monday (day 2 of
week) NOT using PROC APPEND
%VMXG2DTE(
DDIN=WTDPDB,
DDOUT=WTDPDB,
PDB=PDB,
DATASET=RMFINTRV,
BYLIST=SYSPLEX SYSTEM STARTIME,
INITIT=W2,
KEEPER=VAR1 var2 …
);
WTD/MTD Processing

To append or not to append - that is the
question
–
–

Appending destroys sort order but uses
many fewer resources
Not appending preserves sort order
Personally, in most cases if I am doing
reporting I have to sort anyway
WTD/MTD Processing
OTOH, if there is an ABEND, PROC
APPEND makes recovery much harder.
 Using data steps preserves sort order,
allows for recovery by using GDG as
input and output.

TRENDing
Most of the important data has a
TREND component (member
TRNDxxxx)
 Utilizes VMXGSUM to do
summarization
 Radical reduction in space for highly
summarized data (6 years history in just
under 1000 cylinders)

TRENDing

Designed to run weekly but can be done
daily by changing the WEEK.xxxxxxxx
to PDB.xxxxxxxx in the member
%VMXGSUM(INVOKEBY=TRNDTMNT,
INDATA= WEEK.TAPEMNTS (IN=INWEEK)
TREND.TAPEMNTS,
…..
);
TRENDing

At the same time, change the DD on the
input and output TREND datasets so
that the TREND database can be a
GDG.
%VMXGSUM(INVOKEBY=TRNDRMFI,
INDATA= PDB.RMFINTRV (IN=INWEEK)
TRENDIN.TRNDRMFI,
OUTDATA=TRENDOUT.TRNDRMFI,
…..
);
TRENDing

Or by changing the WEEK.xxxxxxxx to
PDB.xxxxxxxx using overrides
%LET TRENDINP=PDB;
%INCLUDE SOURCLIB(TRNDTMNT);
%INCLUDE SOURCLIB(TRNDTALO);
...
TRENDing

TREND database can be made a GDG
by using the TRENDNEW TRENDOLD
macro variables.
%LET TRENDINP=PDB;
%LET TRENDOLD=TRENDOLD;
%LET TRENDNEW=TRENDNEW;
%INCLUDE SOURCLIB(TRNDTMNT);
%INCLUDE SOURCLIB(TRNDTALO);
...
What Cycles Should You Run?

‘It depends…’
–
Volume is the key. If volume is small, the canned
structures work fine. As volume grows, these
structures become untenable. The run time
becomes longer than can be tolerated. The disk
space required for temporary datasets that are
pseudo-tape may be unattainable. A daily job that
runs for a day is not practical. A weekly job that
cannot be completed between IPL’s is impractical.
Retention - One Man’s View







Daily PDB is a GDG with 255 generations
Weekly PDB is a GDG with 255 generations with a
reduced set of variables and datasets
Monthly PDB is a GDG with 255 generations but a
drastically reduced set of variables and datasets
TREND dataset(s) are GDG with 30 generations
SPIN dataset(s) are GDG with 30 generations
WTDPDB/MTDPDB are GDG with 30 generations
Use of GDGs makes all jobs recoverable by CA11
(which means automatically)
So??? What do you do?
No WEEKLY process
 No MONTHLY process
 TREND updated daily (which means the
current week is incomplete)
 Reduced variable counts
 No detail at the WEEKLY/MONTHLY
level

Processing Cycle
Daily
SMF
Daily
BUILD
SPIN
WTD
Build
Daily
PDB
WTD
PDB
TREND
Build
TREND
MTD
Build
MTD
PDB
!st of
Week?
Copy
to Week
Last
Week
STOP
!st of
Month?
Copy
to Month
Last
Month
Where to run - Mainframe vs PC
If you are the only SAS user on the
mainframe, the cost of SAS may be
onerous. Even if you have a ‘penalty
box’ it can be very expensive.
 If you are not the only mainframe SAS
user, the data management facilities
and IO capabilities are generally better
on the mainframe.

PC Data Management

VMXGALOC
–
–
–
Allocates directory yourbase\wddmmmyy
on first day of week
Allocates directory yourbase\mddmmmyy
on first day of month
Allows for normal or wtd/mtd processing
and long term data retention without a lot
of manual manipulation
PC Data Management

VMXGALOC will soon be built into
BLDNTPDB and BLDSMPDB
Where to run?

So, the answer one more time is:

It depends.
Running on a PC

It has been found that using the FTP
method built into SAS is more efficient
than converting the data to RECFM=U
and then downloading. It not only saves
a step on the mainframe, it eliminates a
write of the data on the PC and jobs
have been found to run in 1/3 the time
of the FTP and SAS step combined.
Running on a PC
BLDSMPDB automates the MVS/OS
390/zOS BUILDPDB process. It is
parameter driven and will handle weekly
monthly and trend processing.
 With the soon to be addition of
VMXGALOC it will be (almost) self
sustaining.

Running on a PC

BLDNTPDB is the NT SMF equivalent
of BUILDPDB and the base on which
BLDSMPDB was constructed.
Using FTP Access
filename smf ftp
"’your.smf.dsn'"
host=’your.ftp.site’
S370VS rcmd='site rdw' lrecl=32760
prompt;
%include sourclib(buildpdb);
run;
Note the quoting pattern on the
dataset name and the rcmd option.
NOT Using FTP Access

Data must be converted to RECFM=U
to preserve the BDW/RDW and
downloaded BINARY to preserve the
EBCDIC bit patterns.
MXG Installation - Non-SMF

Most common sources
–
–

TMS - tape library
DCOLLECT - grazing the DASD farm
Less common
–
–
–
NTSMF
SYSLOG
AIX/other platforms
MXG Installation - Non-SMF

TMS/DCOLLECT may need to be timed
to coordinate with a disaster recovery
SYNCHPOINT
–
–
–
Run DCOLLECT at SYNCHPOINT time
Run TYPETMS5 after daily TMS runs
Bring output together to run DAILYDSN
MXG Installation - Non-SMF
TMC
TYPETMS5
TMC
Data
DAILYDSN
DATASETS
Every dataset in the
shop is represented
here.
DASD
FARM
DCOLLECT
DCOLLECT
DATA RAW
TYPEDCOL
DCOL****
datasets
My Jobs Run Too Long!!!
IO connect time (data transfer) is the
largest single component of the run-time
of MXG.
 Connect time can be reduced by

–
–
–
–
reducing kept variables
eliminating unneeded datasets
passing only the SMF records of interest
eliminating sorts
My Jobs Run Too Long!!!

Most likely causes of volume problems
–
–
–
–
–
–
–
CICSTRAN
DB2ACCT
DB2ACCTP
DB2ACCTB
TYPE74
TYPE74CA
TYPE42DS - if you add TYPE42 data
SMF Volumes
SMF Volumes
Tailored
MCT
Rollout
My Jobs Run Too Long!!!!!!
It is after all, just an application not
unlike any other application
 Apply all of the tricks and techniques
you use on applications
 Parallelism may be the answer - if it
won’t run serially, run it in parallel

Parallel Streams

Stream 1 - MYBLDPDB
–
Processes normal BUILDPDB but excludes
all CICS, DB2, and IO related data
 is
the average response time to DASD across
20,000+ volumes a significant metric in
RMFINTRV? Probably not.
Parallel Streams - Stream 1
%UTILBLDP(
SUPPRESS=DB2 CICS 73 74 75 78,
ZEROOBS=73 74 75 78,
USERADD=whatever,
OUTFILE=SOURCLIB(MYBLDPDB)
);
There will be MXGWARN messages in the
LOG about datasets not being included that
RMFINTRV is expecting.
Parallel Streams

Stream 2 - BLDIOPDB
–
Process IO related data
 type
42
 type 73
 type 74
 type 75
 type 78
 etc.
Parallel Streams - Stream 2
%UTILBLDP(
BUILDPDB=NO,
USERADD=42 73 74 75 78,
INCLAFTR=ASUMCACH ASUM42DS,
OUTFILE=SOURCLIB(BLDIOPDB)
);
Parallel Streams

Stream 3 - BLDCISTA
–

Stream 4 - DALYDSET
–

Process CICS Statistics
MXG member ANALDSET
Stream 5 - BILDDCOL
–
Process DCOLLECT data
Parallel Streams

Stream 6 - BUILDTMS
–

Stream 7 - BILDDSNS
–

Process TMS Catalog
Combine TMS and DCOLLECT data
Stream 8 - DB2PDB (3 times daily)
–
Process DB2 data
Parallel Streams

Stream 9 - BLDCISTR (3 times daily)
–

Process CICS transaction data
Stream 10 - ASUMUOW
–
Combine CICS/DB2 into Unit of Work
summary
First Do This!!!!!!!
When datasets fill and at end of day,
issue I SMF on each system
I SMF
IFASMFDP
MANx
Do the CLEAR in a second
step
After all dumps are complete
Duplicate process for CICS and DB2
but eliminate disk copy
SMF
NOTYPE
99 101 110
EOD
SMF
CICS
TYPE 110
SMF
TYPE 101
DB2
SMF
TYPE 99
WLM
SMF
SMF
Dumps
SMF
Dumps
SMF
Dumps
SMF
Dumps
Dumps
Working Copy
Daily SMF
IFASMFDP
Archival
Daily SMF
So?? What do you do?

Parallel Jobs - example
CMF
Data
TYPE110
CICSTRAN
ASUMUOW
DB2
SMF Data
TYPEDB2
DB2PDB
BUILDPDB
Daily
PDB
Daily
SMF/RMF
ASUMUOW
WTD
PDB
WTD/MTD
BLDIOPDB
Daily
IO PDB
MTD
PDB
CICS/DB2 Volume Problem



Processing of CICS/DB2 SMF data into ASUMUOW is
time consuming
3 times/day 3-4 hours each (was 7-9 hours before latest
re-architecture)
– CICS volume is 176GB of SMF data 30M observations
(and this was a light day)
– DB2 volume is 106GB SMF data 40M obs in
DB2ACCT
– Other SMF (excluding type 99) was only 35GB in 31M
records
– Type 99 is about 20GB
Volume is growing 30-40%/year
CICS/DB2 Volume Problem




CICSTRAN and DB2ACCT must be sorted prior to
merge
TAPE IO is bottleneck - CICSTRAN dataset is 5-6
volumes of tape at 10-15 minutes/volume to move
data
Data is read/written by data step, by sort then read by
data step - 5 full passes
DB2ACCT is even worse. Created in huge volumes
(10-12 cartridges 3 times/day) but likely never ever
read again!
Original Architecture
2002
CICS
SMF
TYPE110
5-6 tapes
CICSTRAN
SORT
CICSTRAN
SORTED
5-6 tapes
5-6 tapes
ASUMUOW
ASUMUOW
1-2 tapes
DB2
SMF
TYPEDB2
DB2ACCT
SORT
8-9 Hours
DB2ACCT
SORTED
Using VIEW from DATA Step to SORT
2003
CICS
SMF
TYPE110/
SORT
CICSTRAN
SORTED
ASUMUOW
DB2
SMF
TYPEDB2/
SORT
6-8 Hours
DB2ACCT
SORTED
ASUMUOW
Still a Problem

Most of the elapsed time in the DB2
thread is due to the writing of 3 detail
datasets that are HUGE
–
–
–
DB2ACCT
DB2ACCTB
DB2ACCTP
Using VIEW from DATA Step to SORT
Today
CICS
SMF
TYPE110/
SORT
All OBS only variables
wanted by capacity
planning
All variables only OBS
GT 5 second elapsed
DB2
SMF
CICSTRAN
SORTED
ASUMUOW
ASUMUOW
CAPPLAN
DB2ACCT
Other DB2
Data
DB2PDB
DB2ACCT
TYPEDB2/
SORT
3-4 Hours
UOWDB2
Only OBS with QWHCATYP=4
and only variables needed for
ASUMUOW
Success!!
Observations reduced by 90-95%!!
 Run time significantly reduced!


But… remember axiom 2. As current
growth rates continue, the run time will
expand and when it reaches 6 hours (at
3 times per day that is 18 hours) it will
be time to adjust again.
But… what about space?
As volumes grow, getting DASD space
can be a problem.
 Options

–
–
–
SAS compression
DASD hardware compression
Tape
SAS Compression
Default in MXG
 Advantages

–
–

simple - it is already there
allows data to flow across many volumes
Disadvantages
–
CPU cost
DASD Compression

Advantages
–

Allows for the use of striping and lots of
buffers
Disadvantages
–
–
–
CPU time
Only 1 dataset per DD can be open
Cannot be used for work
Tape Datasets

Advantages
–

CPU for compression offloaded to control
unit
Disadvantages
–
–
–
Tape mount delays
Overloading of VTS
Channel delays
So which is best?
Guess what? - It depends!
 SAS compression used on almost
everything
 Some cases (TYPE74 TYPE74CA)
DASD compression used
 Some cases (CICSTRAN DB2ACCT)
tape is used

CICS Growth
Fri after
Turkey
Day
Fri After
Turkey Day
DB2 Growth
HOURS!!!
Growth

“Forecasting: A method invented by
weasels to make people stop asking
questions.” Dilbert and the Way of the
Weasel
Using VIEW from DATA Step to SORT
PIPE from SORT to ASUMUOW
Next Step
CICS
SMF
TYPE110/
SORT
fitting
CICSTRAN
SORTED
pipe
ASUMUOW
ASUMUOW
pipe
DB2
SMF
TYPEDB2/
SORT
fitting
2.3 Hours
DB2ACCT
SORTED
DB2
Processing
Using VIEW from DATA Step to SORT
PIPE from SORT to ASUMUOW
Requires batch pipes for SAS - that will
mean at least V8.2 and maybe V9
 DB2 Processing must be in 2 steps

–
the fitting for DB2ACCT can’t be reopened
for input within the same job step. There
may be a way to get around this but I
haven’t found it yet.
In the Toolbox

I hate writing and rewriting the same
programs so I write tools (macros) that
handle the repetitive tasks. Where
appropriate they find their way into
MXG.
Using Some MXG Tools
VMXGSUM
 UTILBLDP for Ad-Hoc processing
 ANALCNCR
 ANALDB2R
 VMXGGETM
 VMXGGMT
 VMXGCOMP
 VMXGPRAL

VMXGSUM

Generalized summarization of ANY SAS
dataset
–
–
–
–
–
–
–
Uses PROC MEANS to do summarization
SORTs data
Allows for changes in input and output data
Optimizes variables kept
Carries labels and formats thru summarization
Allows for long variable names
Allows for normalization of variables and changing time
intervals
VMXGSUM

Common in reporting:
–
–
–
–
–
–
DATA xxxx;
SET yyyy;
PROC SORT DATA=xxxx;
PROC MEANS DATA=XXXX OUT=zzzz;
DATA final;
SET zzzz;
VMXGSUM
VMXGSUM is a short-hand way of
coding a repetitive set of commands.
 Used extensively internally in many
MXG members but especially common
in ASUM**** and TRND**** members.

VMXGSUM - SYNTAX

%VMXGSUM(
–
–
–
–
–
INDATA= input dataset(s) name
OUTDATA= output dataset name
SUMBY= list of variables by which data
should be sorted
INCODE= a stub of SAS code executed
during the first data step
OUTCODE= a stub of SAS code executed
during the final data step
VMXGSUM - SYNTAX
–
INTERVAL= how to change the time
interval. Valid values are:
 QTRHOUR
HALFHOUR HOUR THREEHR
 MINUTE WEEK MONTH MYTIME
–
–
DATETIME= the variable name of the
variable containing the datetime value on
which INTERVAL= will be applied
SYNC59= if your time is synched to 59
minutes, will add 60 seconds before
calculating interval if set to YES
VMXGSUM - SYNTAX
ID= list of variables that will be carried
forward as ID values
 AUTONAME=YES/NO autoname = yes
says to use the autonaming functions of
SAS V8 to name the output variables.

This allows the specification of the same variable name in
multiple lists but changes the output variable name to
variable_suffix where suffix is the name of the function
performed on the variable.
VMXGSUM - SYNTAX
SUM= list of variables to be summed
 MAX= list of variables to be maxxed
 MIN= list of variables to be minned
 MEAN= list of variables to be meaned
 P1= list of variables to get percentile 1
 P5= 5th percentile variables
 P10= 10th percentile variables

VMXGSUM - SYNTAX
–
–
–
–
–
–
–
P25 P50 P75 P90 P95 P99 - percentile
values
STD - Standard Deviation
VAR - variance
CV - coefficient of variance
STDERR - Standard error
KURTOSIS - Kurtosis
T - T value
VMXGSUM - Syntax

NORM1-NORM99 - normalization of
data. Maintaining rates as rates and not
averages of averages. On the frontend, the rate has to be multiplied by the
duration and on the back end divided
again to recalculate the correct rate.
VMXGSUM - SYNTAX
–
NORM1-NORM99 - syntax
 rate1
 List
rate2 rate3…ratex/duration
the variables to be normalized followed by
a / then the variable to be used to do the
normalization.
VMXGSUM - SYNTAX

There are other parameters. See the
documentation in the member for usage
and the member ADOCSUM.
VMXGSUM - Example 1

Summarize the dataset TYPETMNT by
DEVICE and TMNTTIME calculating
average mount delay and the total
number of mounts per quarter hour.
%vmxgsum(
indata=pdb.typetmnt,
outdata=tapemnts,
sumby=device tmnttime,
interval=qtrhour,
datetime=tmnttime,
mean=tapmnttm,
freq=mounts
);
VMXGSUM - Example 2

Summarize the Goal Mode type 72
records for the TSO service class
calculating the average response time,
the number of transactions at one hour
intervals by period.
VMXGSUM - Example 2
%VMXGSUM(
INDATA=PDB.TYPE72GO,
OUTDATA=TSOSUM,
SUMBY=STARTIME PERIOD,
INCODE=
IF SRVCLASS=‘TSO’;,
SUM=RESPAVG NUMTRAN,
NORM1=RESPAVG/NUMTRAN,
INTERVAL=HOUR,
DATETIME=STARTIME
);
VMXGSUM Usage Notes
NORMx operands must be contiguous
starting at 1. That is, you cannot have
NORM1 and NORM3 without a
NORM2.
 TEMP01/TEMP02 DDs are recognized
for increasing work space but with V8
and compression it is not usually
needed and is no longer recommended.

VMXGSUM Usage Notes
The first data step is almost always
converted to a VIEW rather than a real
data step.
 KEEPALL=NO is resource intensive and
not really needed except in odd cases.
KEEPALL=YES is much preferred. The
keep lists on all output datasets are
optimized regardless of KEEPALL
setting.

Why VMXGSUM?
So why not just use PROC MEANS with
CLASS operands?
 VMXGSUM in tests is usually much
more efficient and in some cases will do
the summarization where using PROC
MEANS or PROC SUMMARY with
CLASS operands runs out of memory.

VMXGSUM - Hysterical Note

The ‘keeping’ logic in VMXGSUM was
intended by Barry to reduce the size of
the input data and therefore the amount
of data moved in the first data step.
After years of arguing, he was finally
convinced that it did not work that way
and KEEPALL=YES became preferred.
UTILBLDP - Ad-Hoc

Say you need to read the 1415 6156 64
and 30 records (ANALDSET?) in a
single pass for an ad-hoc report.
%UTILBLDP(BUILDPDB=NO,
USERADD=1415 6156 64 30,
OUTFILE=INSTREAM,
SORTOUT=NO
);
%INCLUDE INSTREAM;
ANALCNCR

Counts concurrent events. How many
of something were happening at the
same time.
ANALCNCR - History

Method used in original release of MXG:
–
–
–
–
DO TIME=BEGIN TO END BY 5;
OUTPUT;
END;
Then add up all the observations with a
given value of TIME. Created a HUGE
number of observations and was
cumbersome.
ANALCNCR - History

Method used with ANALCNCR:
–
–
–
TIME=BEGIN;COUNT=1;OUTPUT;
TIME=END;COUNT=-1;OUTPUT;
Now add up the counts by time and you
are done (basically.) Many many fewer
observations.
ANALCNCR - History

If there are three tape allocations:
–
–
–
Allocation 1 begins at 08:00 ends at 08:30
Allocation 2 begins at 08:15 ends at 08:25
Allocation 3 begins at 08:20 ends at 08:45
ANALCNCR - History

MAX of 3 concurrent allocations
–
–
–
–
–

Old method
–
–
–
–

15 minutes of 1
5 minutes of 2
5 minutes of 3
5 minutes of 2
15 minutes of 1
Allocation 1 - 1800/5=360 obs
Allocation 2 - 600/5=120 obs
Allocation 3 - 1500/5=300 obs
Total = 780 obs
New Method
–
–
Each allocation is 2 OBS
Total = 6
ANALCNCR - Example 1

How many jobs are running
concurrently in class A average and
max.
%ANALCNCR(INDATA=PDB.JOBS,
OUTSUMRY=RUNTIME,
SUMBY=JOBCLASS,
INCODE=IF TYPETASK=‘JOB’;,
INTERVAL=QTRHOUR,
STARTIME=JINITIME,
ENDTIME=JTRMTIME,
OTCODESM=
AVGRUN=CONCURNT/DURATM;
RENAME MAXCNCR=MAXRUN;
);
PROC PRINT;
ID JOBCLASS TIMESTMP;
VAR AVGRUN MAXRUN;
ANALCNCR - Example 2

Now suppose you want the INPUT
QUEUE time for the same job class.
%ANALCNCR(INDATA=PDB.JOBS,
OUTSUMRY=QUETIME,
SUMBY=JOBCLASS,
INCODE=IF TYPETASK=:’JOB’;,
INTERVAL=QTRHOUR,
STARTIME=READTIME,
ENDTIME=JINITIME,
OTCODESM=
AVGQUE=CONCURNT/DURATM;
RENAME MAXQUE=MAXRUN;
);
PROC PRINT;
ID JOBCLASS TIMESTMP;
VAR AVGQUE MAXQUE;
ANALCNCR - Example 3

Now put the two outputs together
DATA JOBSTAT;
MERGE RUNTIME QUETIME;
BY JOBCLASS TIMESTMP;
PROC PRINT;
ID JOBCLASS TIMESTMP;
VAR AVGQUE AVGRUN MAXQUE MAXRUN;
ANALDB2R
ANALDB2R is a reverse engineered
semi-clone of IBM’s DB2PM.
 Most DB2PM reports can be produced
from either a PDB or raw SMF data.
 Parameter driven and documented in
the member as well as in ADOCDB2R.

VMXGGETM

Get specific types and subtypes of SMF
data up to x number. Great for building
a test case for processing or extracting
samples of data to send to Merrill
Consultants for analysis in problem
solving.
VMXGGETM

Get the type 30 and type 230 records all
subtypes and write to SMFOUT the first
100 OBS of each.
%VMXGGETM(
ID=30 230,
SUBTYPE=ALL,
NRECORD=100,
SMFOUT=SMFOUT
);
VMXGGMT
Adjust the timestamps of SMF data (or
any other time stamp) to a specific
offset
 Useful if you have multiple LPARs in
differing time zones and you want a
uniform picture.

VMXGGMT

Three pieces
–
–
–
TIMETABL - A table of SYSTEM/SYSPLEX
ID with datetime ranges and offsets from GMT
TIMEBILD - builds a FORMAT based on the
values in TIMETABL and enables VMXGGMT
VMXGGMT - macro imbedded in all MXG
members that will adjust times based on the
values contained in TIMETABLE so that midnight
is always midnight.
VMXGGMT - Usage
Build your TIMETABLE
 In IMACINIT, insert:

–
%TIMEBILD(TIMEBILD=YES);
VMXGGMT imbedded in MXG will now
be active.
 Without the %TIMEBILD, the
VMXGGMT invocations are nulled

VMXGCOMP

Compare all of the members of two SAS
data libraries
–
–
–
useful in testing new releases to compare
results
identifies common datasets, new datasets,
dropped datasets
compares values in common datasets
VMXGCOMP

Syntax
%VMXGCOMP(
NEWDD=PDB,
OLDDD=OLDPDB,
NOBS=100
);
VMXGPRAL

Print the contents of all of the members
of a SAS data library, do a PROC
MEANS of the numeric variables, and
print X number of OBS.
%VMXGPRAL(
DDNAME=PDB,
NOBS=10
);
VMXGPRAL

Or print the contents of all opened
allocated SAS data libraries
%VMXGPRAL(DDNAME=_ALL_,NOCONT=);
VMXGPRAL

Or print the contents of the data libraries
in which you are interested
%VMXGPRAL(DDNAME=PDB SPIN,NOCONT=,NOSPLIT=NOSPLIT);
MXG Tools
There are lots more. Look for
SOURCLIB members that start with
ANAL, VMXG, VGET, UTIL.
 Documentation is contained within the
members and in some cases
(ANALDB2R for example) there may
also be an ADOC member.

Questions

There are no stupid questions except
those you don’t ask.
–
Prof Hartmann - PSY 101 Purdue