问题描述
我正在尝试使用以下公式计算数据集所需的空间,但是当我将它与系统中的现有数据集进行交叉检查时,我在某处出错。请帮帮我
第一个数据集:
记录格式。 . . : VB
记录长度。 . . :445
块大小。 . . . : 32760
记录数....: 51560
Using below formula to calculate
optimal block length (OBL) = 32760/record length = 32760/449 = 73
As there are two blocks on the track,hence (TOBL) = 2 * OBL = 73*2 = 146
Find number of physical records (PR) = Number of records/TOBL = 51560/146 = 354
Number of tracks = PR/2 = 354/2 = 177
But I can below in the dataset information
Current Allocation
Allocated tracks . : 100
Allocated extents . : 1
Current utilization
Used tracks . . . . : 100
Used extents . . . : 1
第二个数据集:
记录格式。 . . : VB
记录长度。 . . :445
块大小。 . . . :27998
记录数....:127,252
Using below formula to calculate
optimal block length (OBL) = 27998/record length = 27998/449 = 63
As there are two blocks on the track,hence (TOBL) = 2 * OBL = 63*2 = 126
Find number of physical records (PR) = Number of records/TOBL = 127252/126 = 1010
Number of tracks = PR/2 = 1010/2 = 505
Number of Cylinders = 505/15 = 34
But I can below in the dataset information
Current Allocation
Allocated cylinders : 69
Allocated extents . : 1
Current utilization
Used cylinders . . : 69
Used extents . . . : 1
解决方法
对您的方法的一些观察。
首先,由于您处理的是可变长度的记录,因此了解“平均”记录长度会很有帮助,因为这有助于制定更准确的存储预测。您的方法假设所有记录都处于最大值的最坏情况,这对于计划来说是好的,但实际上,如果记录长度的平均值低于最大值,您可能会看到实际分配会更低。
您采用的方法是合理的,但考虑到您可以将块、记录、DASD 几何结构中的空间要求通知 z/OS,或者让 DFSMS 代表您执行计算。请参阅此 article 以获取有关选项的其他信息。
回到你的计算:
您的最佳块长度 (OBL) 实际上是每块记录 (RPB) 的数量。块大小除以最大记录长度得出可以存储在块中的全长记录数。如果您的平均记录长度较短,那么您可以在每个块中存储更多记录。
每个轨道有两个块的假设对于您的情况可能是正确的,但这取决于将用于基础分配的实际设备类型。这是支持的 DASD 设备及其几何结构的一些几何结构的 link。
您对每个轨道两个块的假设取决于设备对于 3390 是不正确的,因为您需要 64k 在轨道上的两个块,但是您可以看到 3390 的最大输出为 56k,因此每个轨道只能获得一个块在设备上。
此外,看起来您确实通过添加 4 个字节将 RDW 因素考虑在内,但是如果有人不熟悉 z/OS 上的 V 记录,那么查看问题的人可能会感到困惑。在您的计算中,这将是 61每个块的记录数为 27998(这是“最佳块长度”,因此两个块可以舒适地放在轨道上)。
我将使用以下值:
-
最大记录长度 = 记录长度 + 4 用于 RDW
-
TotalRecords = 最大长度时的总记录数(最坏情况)
-
块大小 = 建模块大小
-
RecordsPerBlock = 一个块中可以容纳的记录数(最坏情况)
-
BlocksNeeded = 包含估计记录所需的块数(最坏情况)
-
BlocksPerTrack = 来自 IBM 设备几何信息
-
TracksNeeded = TotalRecords / RecordsPerBlock / BlocksPerTrack 圆柱数 = 每个圆柱体的设备轨道数(大多数设备为 15 个)
Example 1:
Total Records = 51,560
BlockSize = 32,760
BlocksPerTrack = 1 (from device table)
RecordsPerBlock: 32,760 / 449 = 72.96 (72)
Total Blocks = 51,560 / 72 = 716.11 (717)
Total Tracks = 717 * 1 = 717
Cylinders = 717 / 15 = 47.8 (48)
Example 2:
Total Records = 127,252
BlockSize = 27,998
BlocksPerTrack = 2 (from device table)
RecordsPerBlock: 27,998 / 449 = 62.35 (62)
Total Blocks = 127,252 / 62 = 2052.45 (2,053)
Total Tracks = 2,053 / 2 = 1,026.5 (1,027)
Cylinders = 1027 / 15 = 68.5 (69)
现在,至于实际分配。这取决于您如何分配空间,记录的大小。假设它在 JCL 中,您可以使用 RLSE
的 SPACE=
子参数在创建和关闭时释放空间。这应该会释放未使用的资源。
鉴于记录是V
可变的,估计是最坏的情况,您需要更多地了解平均记录长度,以了解实际使用空间方面的实际分配。
最后的想法是,您的存储管理员可以通过 ACS
例程覆盖您正在执行的所有工作。我相信今天大多数人会指定一个 BLKSIZE=0
并让 DFSMS 来完成所有艰苦的工作,因为该组件有更多关于文件将去哪里、底层设备是什么以及最有效的分配方式的信息.磁盘几何和分配的日子更像是一场篝火晚会,除非您的环境没有被管理来为您做这些事情。
与其尝试计算磁道或柱面,不如计算 MB 或 KB。 z/OS (DFSMS) 会为您计算需要多少磁道或柱面。
在 JCL 中,一旦你掌握了它,它就不是直截了当的,也不是太复杂。
有一个DD语句参数叫AVGREC=
,就是触发器。让我为上面的第一个案例举一个例子:
//anydd DD DISP=(NEW,CATLG),// DSN=your.new.data.set.name,// REFCM=VB,LRECL=445,// SPACE=(445,(51560,1000)),AVGREC=U
//* | | | |
//* V V V V
//* (1) (2) (3) (4)
参数AVGREC=U
(4) 告诉系统三件事:
- 首先,
SPACE=
(1) 中的第一个子参数应解释为平均记录长度。 (注意该值完全独立于LRECL=
中指定的值。) - 其次,它告诉系统,第二个 (2) 和第三个 (3)
SPACE=
子参数是数据集的平均长度 (1) 记录数应该能够存储。 - 第三,它告诉系统数字 (2) 和 (3) 在记录 (
AVGREC=U
) 中。备选方案是千 (AVGREC=M
) 和数百万 (AVGREC=M
)。
因此,此 DD 语句将分配足够的空间来保存估计的记录数。您不必关心磁道容量、块容量、设备几何形状等。
给定您期望的记录数和(平均)记录长度,您可以轻松计算出您需要的千字节或兆字节数。不幸的是,您不能在 JCL 中直接指定 KB 或 MB,但有一种使用 AVGREC=
的方法,如下所示。
您的第一个数据集将获得 51560 条(最大)长度为 445 的记录,即 22'944'200 字节,或 ~22'945 KB,或 ~23 MB。以 KB 为单位的分配的 JCL 如下所示:
//anydd DD DISP=(NEW,// SPACE=(1,(22945,10000)),AVGREC=K
//* | | | |
//* V V V V
//* (1) (2) (3) (4)
您希望系统为 22945 (2) 千 (4) 条长度为 1 字节 (1) 的记录分配主空间,即 22945 KB,并为 10'000 (3) 千 (4) 条记录分配辅助空间长度 1 字节 (1),即 10'000 KB。
现在指定 MB 的相同分配:
//anydd DD DISP=(NEW,(23,10)),AVGREC=M
//* | | | |
//* V V V V
//* (1) (2)(3) (4)
您希望系统为 23 (2) 百万 (4) 条长度为 1 字节 (1) 的记录分配主空间,即 23 MB,并为 10 (3) 百万 (4) 条长度为 1 的记录分配辅助空间字节 (1),即 10 MB。
除了后者,我很少使用其他任何东西。
在 ISPF 中,它更容易:数据集分配 (3.2) 允许以 KB 和 MB 作为空间单位(在所有旧的单位中)。