In-Depth

Block Sizes: What You Don’t Know Will Hurt You

Poor blocking of sequential files can have a significant, yet often hidden, negative impact on batch workloads. Oftentimes a file performs dismally even if the JCL has been coded correctly. This article will examine what causes files to be poorly blocked. It will also show how to quickly and easily identify poorly blocked files and offer suggestions on how to fix them.

In today’s computer center tasks, such as balancing workloads, monitoring response time and fixing immediate storage problems take up much of the time of the performance analyst and storage manager. Often, little attention is paid to the lowly batch world, especially if jobs are completing successfully and no one is complaining. This was the situation in our shop, at least until increasing volume caused the batch window to begin impacting our online availability. An efficiency effort was initiated in an attempt to gain back some batch clock time.

Taking a "top down" approach, we began by examining those jobs that had experienced the largest increase in run time. A few jobs in question seemed to be performing an inordinate amount of EXCPs to sequential disk files. Oftentimes, the file in question was deleted in a subsequent step, so looking at the file on DASD was not possible. The JCL was coded correctly (BLKSIZE=0), but it was suspected that this was being ignored by the program. To quantify how many files were not being correctly blocked several days worth of SMF data was examined to look for inefficient DASD block sizes. SMF data was chosen because it is the most complete source for this information (using VTOC-based information, such as DMS/OS or ISPF 3.4, is incomplete because the VTOC shows only those datasets that exist at the time of the analysis and misses "transient" files). Below is a part of a SAS/MXG program to identify incorrectly blocked files:

SET PDB.TYPE1415 ;

OPTBLK=27998 ;

IF DISP=’NEW’ ;

IF DEVICE=’3390’ ;

IF SUBSTR(DSNAME,1,1)=’P’ ; ß Only production files

IF BLKSIZE+LRECL LT OPTBLK OR

BLKSIZE GT OPTBLK ;

PROC SORT; BY DESCENDING OLDEXCPS;

ETC.…

To our surprise, the MXG analysis showed that there were a significant number of data sets that needed attention. Results were sorted by descending EXCPs, so that by working from the top down we could effect the largest change for the least effort. Now, at this point you may be thinking that this situation wouldn’t occur in your shop. My advice is to dump a few days’ SMF and see for yourself. Below is the output from an analysis run.

JOB

FREQ

DSNAME

DDNAME

RECFM

LRECL

BLKSIZE

NEWBLK

OLD-EXCP

NEW-EXCP

PAIU109C

3

PBCBSMN.AIU9725.PRD.AIUZPF10.TEMPPROD

TEMPPROD

FB

204

204

27948

1205829

8802

PCRB1841

9

PBCBSMN.CRB9842.STR.CRBREDL

CRBREDL

FB

43

43

27993

968436

1494

PMCS1417

2

PBCBSMN.MCS9749.MCS1417.EXTRACT.GXXX

SELECTED

VB

6392

6396

25568

590380

196794

PAIU108A

3

PBCBSMN.AIU9725.PRD.BLSHLDO.NODUPS

ONSF320O

FB

320

320

27840

480189

5520

PSTR152R

4

PBCBSMN.STR9822.PRODB.ITSXREF.SCCFICN

OUTFILE

FB

34

34

27982

415492

508

PAIU108G

3

PBCBSMN.AIU9725.PRD.AIUPZ002.UB92EDTA

OUB92O

FB

192

192

27840

302100

2085

S005411G

3

PBCBSMN.MCS9749.A05411.SELECTED

SELECTED

VB

6392

6396

25568

255567

85191

PCIS187D

3

BCBSM.CIS.CIS38001.TEMP

CIS3800

FB

400

6000

27600

241002

60252

PAIU108A

3

PBCBSMN.AIU9725.PRD.BLSHLDN.NODUPS

ONSF320N

FB

320

320

27840

232731

2676

PPAR192M

1

PBCBSMN.PAR9773.DELETE.PROV

PAY

FB

80

80

27920

204442

586

PSTRD23E

2

BCBSMV.STR.PRODB.GCLOG.BK.GXXXXV00

BKUPFILE

FB

1718

1718

27488

196292

12270

PMCS1433

2

PBCBSMN.MCS9749.MCS.MNMBR.REJECT.GXXX

REJECTO

FB

350

350

27650

180908

2290

PBCS156A

12

PBCBSMN.BCS9939.BCSSCCT

TEMPFIL1

FB

7

7

27993

165204

48

PAIU108R

2

PBCBSMN.AIU9725.PRD.AIUPZ024.OUTPAPER

OUTPAPER

FB

133

133

27930

163412

780

PAIU108R

2

PBCBSMN.AIU9725.PRD.AIUPZ023.VOUTFILE

VOUTFILE

FB

155

155

27900

141588

788

PPAR192M

1

PBCBSMN.PAR9773.PRVFILE.BCBSA.NEW

NEWPROV

FB

800

800

27200

109618

3225

PBKP175A

12

PBCBSMN.SEC9815.SYS1.RACF.BKUP.GXXX0

SYSUT2

F

4096

4096

24576

108000

18000

PAPL186D

2

BCBSM.APL.APLALL

APLALL

FB

391

6256

27761

102722

25682

PSTRE40D

4

PBCBSMN.STR9822.PRODB.UPINPAYD.GXXX

UPINPAYD

FB

100

100

27900

88928

320

Figure 1: Output of SAS program that identified poorly blocked files.

Note the block sizes on the report. A block size of seven? What was going on?! It turns out there are two primary causes for BLKSIZE inefficiency: incorrectly coded JCL and programs with no record blocking. Today, with system determined block sizing, it is less common to find unusual or find poor blocking resulting from incorrectly coded JCL than it was in the past. It was puzzling that files that had the worst block sizes have the JCL coded correctly (BLKSIZE=0). It turns out that the problem with these files is the creating program lacks a file blocking statement, always as a result of an oversight by the creating programmer. Omission of the BLOCK CONTAINS 0 RECORDS statement causes a file to be created with no record blocking (i.e. RECFM=F!), a very inefficient sequential processing method. As stated in the VS COBOL II Application Programming Guide:

In a COBOL program, you can establish the size of a physical record with the BLOCK CONTAINS clause. If you do not use this clause, the compiler assumes that the records are not blocked. Blocking QSAM files on disk can enhance processing speed and minimize storage requirements.

This is quite an understatement!

The fix for this problem is very simple and straightforward. For COBOL programs, you simply add a BLOCK CONTAINS 0 RECORDS statement to the File Descriptor section for the errant DD and recompile the program. For EZTRIEVE programs, add a FB(lrecl,blksize) DISK statement in the FILE statement or, better yet, change the system option "BLOCK0" to ‘A’ (use system determined block size).

The results of performing this simple change were amazing. As a sample case I benchmarked the tuning of the following file, created by an EZTRIEVE program.

File name: PBCBSMN.STR9822.PRODB.ITSXREF.SCCFICN

Creating Job Name: PSTR152R Run Frequency: Daily

SUMMARY

 

SPACE (cyls)

EXCPS

(number of I/Os)

CPU TIME (minutes)

CLOCK TIME (minutes)

Unblocked (LRECL=34)

741

920,000

1.2

30.7

Blocked at half-track (standard)

37

10,632

.14

3.5

Savings

(95% reduction)

(99% reduction)

(88% reduction)

(95% reduction)

Figure 2: Performance Improvement caused by correctly blocking Eztrieve file.

Another example: Job PCRB1841 was identified as needing a BLOCK CONTAINS 0 RECORDS statement to be added for file PBCBSMN.CRB9842.STR.CRBDETL. The programmers made the program change and the dramatic results are shown below. It is important to note that the performance improvements were in spite of a 13% increase in volume.

File name: PBCBSMN.CRB9842.STR.CRBREDL

Creating Job Name: PCRB1841 Run Frequency: Monthly

SUMMARY

 

SPACE (cyls)

EXCPS

(number of I/Os)

# Records

CLOCK TIME (minutes)

Unblocked (LRECL=43

2588

4,142,000

1107944

149.2

Blocked at half-track (standard)

183

1,061,000

1250200

73.3

Savings

(93% reduction)

(74% reduction)

(13% increase)

(51% reduction)

Figure 3: Performance Improvement caused by correctly blocking COBOL file.

Changes which require a program recompile may require the involvement of the application development or support areas. Operators or operations analysts could easily fix incorrectly coded JCL. In our shop we enlisted the assistance of a second shift operations analyst who worked on the problem datasets as time allowed. In two month’s time we reran the report again and were pleased to find far fewer problems. We still are fixing errant block sizes (tape too) as part of our general tuning responsibilities. We recently began using allocation software to force optimum blocking of all test files; this eliminated the problems caused by incorrectly coded JCL.

To proactively address the problem of programs missing a blocking statement we sent out "Tech Tidbit" communication that went out to the programming staff. The response was favorable; most programmers did not know the effect of omitting a blocking statement. Below is the procedure that was used by the analysts to fix datasets that appeared on the block size tuning report.

Before you assume that your shop does not have a hidden problem with poor performance caused by inefficient file block sizes, run a quick analysis. If your analysis shows you have some poorly blocked file start up a block size tuning effort. The result of a BLKSIZE tuning endeavor could be huge savings of CPU and DASD resources in your shop, also significant reductions in batch run times, all for very little effort. Remember, there’s no I/O like no I/O!

About the Author: Wayne Schumack is a Principal Architect for Blue Cross Blue Shield of Minnesota. He has over twenty years experience in data processing. He can be reached via E-mail at Wayne_A_Schumack@bluecrossmn.com.

Must Read Articles