如何在 SYNCSORT JCL 中解决 "WER046A SORT CAPACITY EXCEEDED"
How can I solve "WER046A SORT CAPACITY EXCEEDED" in SYNCSORT JCL
我正在尝试对数据集进行排序并写入新数据集,每次我执行作业时,它都会异常终止 (ABEND=U0016)。
消息形式 SYSOUT。
WER276B SYSDIAG= 24646562, 29667262, 29667262, 27500165
WER164B 307,288K BYTES OF VIRTUAL STORAGE AVAILABLE, MAX REQUESTED,
WER164B 0 BYTES RESERVE REQUESTED, 307,272K BYTES USED
WER036B G=5174,B=1,BIAS=99
WER162B 75 PREALLOCATED SORTWORK TRACKS, 3,750,000 DYNAMICALLY
ALLOCATED,
WER162B 26,721,480 ACQUIRED IN 2,230 SECONDARY EXTENTS, 0 RELEASED,
TOTAL 30,471,555 TRACKS USED
WER046A SORT CAPACITY EXCEEDED
WER493I ZIIP PROCESSOR USED
WER211B SYNCSMF CALLED BY SYNCSORT; RC=0000
WER449I SYNCSORT GLOBAL DSM SUBSYSTEM ACTIVE
WER066A APROX RCD CNT 30430982
这是我的代码:
//STEP50 EXEC SORTD
//SORTIN DD DSN=FILEXYZ(0),
// DISP=SHR,DCB=BUFNO=192
//SORTOUT DD DSN=FILE2XXY,
// DISP=(NEW,CATLG,DELETE),RETPD=365,VOL=(,,,99),
// DCB=(RECFM=FB,LRECL=30050,BLKSIZE=0,BUFNO=192),
// UNIT=(TAPE,2)
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=(19,5,PD,A,8,6,PD,A,50,2,ZD,A)
OUTREC IFTHEN=(WHEN=(70,18,CH,EQ,C' encoding="IBM037"'),
OVERLAY=(70:C' encoding="UTF-8"'))
OPTION DYNALLOC=(SYSDA,255)
/*
这是来自 jcl 的 SORTD 的代码:
4 //STEP40 EXEC SORTD
5 XXSORTD PROC CYLS=1,SYSFICH='*',
XX DMPCLAS='1,DEST=ABNORMAL'
XX*
XX* REMOVED SEP PARAMETER 89/07/20
XX*
6 XXSORTD EXEC PGM=SORT
7 //SYSOUT DD SYSOUT=*
X/SYSOUT DD SYSOUT=&SYSFICH
IEFC653I SUBSTITUTION JCL - SYSOUT=*
8 XXSORTWK01 DD DSN=&WORK1,SPACE=(CYL,(&CYLS)),UNIT=SORTWORK
IEFC653I SUBSTITUTION JCL - DSN=&WORK1,SPACE=(CYL,
(1)),UNIT=SORTWORK
9 XXSORTWK02 DD DSN=&WORK2,SPACE=(CYL,(&CYLS)),UNIT=SORTWORK
IEFC653I SUBSTITUTION JCL - DSN=&WORK2,SPACE=(CYL,
(1)),UNIT=SORTWORK
10 XXSORTWK03 DD DSN=&WORK3,SPACE=(CYL,(&CYLS)),UNIT=SORTWORK
IEFC653I SUBSTITUTION JCL - DSN=&WORK3,SPACE=(CYL,
(1)),UNIT=SORTWORK
11 XXSORTWK04 DD DSN=&WORK4,SPACE=(CYL,(&CYLS)),UNIT=SORTWORK
IEFC653I SUBSTITUTION JCL - DSN=&WORK4,SPACE=(CYL,
(1)),UNIT=SORTWORK
12 XXSORTWK05 DD DSN=&WORK5,SPACE=(CYL,(&CYLS)),UNIT=SORTWORK
IEFC653I SUBSTITUTION JCL - DSN=&WORK5,SPACE=(CYL,
(1)),UNIT=SORTWORK
13 XXSYSABEND DD SYSOUT=&DMPCLAS
IEFC653I SUBSTITUTION JCL - SYSOUT=1,DEST=ABNORMAL
14 XXSYSUDUMP DD SYSOUT=&DMPCLAS
IEFC653I SUBSTITUTION JCL - SYSOUT=1,DEST=ABNORMAL
15 //SORTIN DD DSN=FILEXYZ(0),
// DISP=SHR,DCB=BUFNO=192
16 //SORTOUT DD DSN=FILE2XXY,
// DISP=(NEW,PASS,DELETE),RETPD=365,VOL=(,,,99),
// DCB=(RECFM=FB,LRECL=30050,BLKSIZE=0,BUFNO=192),
// UNIT=TAPE
17 //SYSPRINT DD SYSOUT=*
18 //SYSIN DD *
请给我一些提示来解决这个问题。
谢谢你。
由于您的排序输入是从磁带读取的,排序无法可靠地计算所需的排序工作space。尝试将 SIZE=Ennnnnnn 参数添加到 SORT 语句。 nnnnnnn是要读取的记录数。 E 告诉排序这是一个估计值。
尝试直接调用 SYNCSORT 而不是调用此过程。此 PROC 仅设置了 5 个工作文件。通常最好让 SYNCSORT 根据需要分配尽可能多的工作文件,而不是告诉它可以使用多少。
我相信 space 中的 运行 是工作文件。试试这个:
//SORT10 EXEC PGM=SYNCSORT,
// PARM=('INCORE=OFF,DYNALLOC=(SYSDA,255)',EQUALS)
//SORTIN DD DSN=FILEXYZ(0),
// DISP=SHR,DCB=BUFNO=192
//SORTOUT DD DSN=FILE2XXY,
// DISP=(NEW,CATLG,DELETE),RETPD=365,VOL=(,,,99),
// DCB=(RECFM=FB,LRECL=30050,BLKSIZE=0,BUFNO=192),
// UNIT=(TAPE,2)
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SORTMSG DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=(19,5,PD,A,8,6,PD,A,50,2,ZD,A)
OUTREC IFTHEN=(WHEN=(70,18,CH,EQ,C' encoding="IBM037"'),
OVERLAY=(70:C' encoding="UTF-8"'))
OPTION DYNALLOC=(SYSDA,255)
/*
我会在这里走出去,假设这里有问题的文件与上一个问题相同,具有相同 OP 的相同文件属性:
LRECL 为 30050 时有 80,000,000 条记录,您的输入文件大约为 2.2TB。
普遍接受的排序工作经验法则 space 是输入文件大小的 1.3 倍。因此,您需要将约 2.85TB(即约 370 万个 CYLS 或约 5500 万个磁道)的分类工作作为目标 space。
使用 SyncSort 的最多 255 个 SORTWK DD,您需要在支持的 255 个 DD 中的每一个中获取约 14,500 个 CYL 以满足您的 space 要求。这有点极端,可能会带来一些挑战,但有一些选项可以让您实现这一目标。
免责声明 - 我本人没有亲自使用过 SyncSort,但在仔细阅读文档后,这些概念看起来与我确实使用过的其他排序产品一致。
依赖DYNALLOC
您已指定 DYNALLOC=(SYSDA,255)
,这是通常推荐的方法。但是,您当前的设置存在一些问题:
通过使用 SORTD
PROC,您正在剥夺 5 个本可以更恰当地利用的 DD。 PROC 中带有 SPACE=(CYL,(1))
的硬编码 SORTWK DD 限制了您可以获得的总工作 space,因为 DYNALLOC 现在只有 250 个 DD 可以使用。正如@SaggingRufus 所建议的那样,直接调用 SYNCSORT 将避免 PROC DD 的 1-CYL 分配并允许 DYNALLOC 与所有 255 个 DD 一起工作。
SyncSort 未准确预测必要的工作 space。根据您提供的输出,SyncSort 最初明确地获取了 75 个轨道(SORTD 过程中的 5 个硬编码 DD 中的每个 1 个 CYL……换句话说,1 个 CYL * 15 个 Tracks-per-CYL = 75 的 5 个 DD),然后动态地获得了额外的 3,750,000 个轨道(1,000 个 CYL(或 15,000 个轨道)* 250 个 DD)。然后,它在 2,230 个二级范围内获得了额外的 2670 万个轨道(1.78MM CYL),这表明每个二级范围平均有 799 个 CYL(或 11,983 个轨道),每个 volume/DD 平均有 8.75 个二级范围。所有这些导致总共分配了 ~1.6TB (~2MM Cyls) 用于排序工作 space,比估计工作 space 要求低 方式 对于 2.2TB 输入文件。即使我们将 DYNALLOC 属性应用到来自 PROC 的硬编码 SORTWK DD,这也只会增加大约 32GB 的总工作量 space,而且仍然远远不够。因此,正如@phunsoft 所建议的那样,添加 SIZE=Ennnnnnnn 参数可能是 SyncSort 适当投影工作 space 所必需的。
附加说明 - 每个 DD/volume 平均得到 <10 个二级扩展区这一事实表明您正在耗尽可用的免费 space 卷适合您环境的工作 space 池。您应该与您的存储管理员协调以确保有足够的磁盘 space 可用于您的工作 space.
因此,绕过 PROC 以提供对所有 255 个 DD 的访问并提供估计的记录数 可以 允许 SyncSort 更可靠地计算必要的工作 space,但是单一排序中的这一数据量可能是异常值,默认计算可能不够。此外,您的工作 space 池中可用的免费 space 可能是一个限制因素。
硬编码 SORTWK DD
如果您在 JCL 中对 SORTWK DD 进行硬编码,则会绕过 PROC 中的 DD,并消除 DYNALLOC 计算的一些不确定性。这实际上是我个人在这种情况下首先采用的方法……使用最佳可能选项对每个 SORTWK DD 进行硬编码,以便在每个 DD 上获得约 14,500 个 CYLS。所以:
在作业中对 255 个 DD (SORTWK01 - SORTWKFF) 中的每一个进行硬编码
在每个 DD 上包含 SPACE=(CYL,(4000,1000))
(即使 SyncSort 应该会自行计算二次分配)
在每个 DD 上包含 DSNTYPE=LARGE
以允许每个卷大于 4G(每个 SORTWK 限制为 1 个卷)
这些 DD 的总和应该可以为您的分类要求提供足够的工作 space。
以上每个选项都假设您的商店的工作 space 池中有足够的 vols/extents/overall-space 可用。我建议与您的存储管理团队协调以确保资源的可用性
使用 MAXSORT
SyncSort 提供 MAXSORT
能力来容纳超大数据集。它将输入文件的部分分类为中间文件,并为后续部分重新使用 SORTWK space,直到每个部分的中间文件可以组合成单个输出文件。使用 MAXSORT
有特殊要求。如前所述,我无权访问 SyncSort,因此我无法自行测试此功能。您必须自己研究 SyncSort 文档以了解此功能的详细信息。
我正在尝试对数据集进行排序并写入新数据集,每次我执行作业时,它都会异常终止 (ABEND=U0016)。
消息形式 SYSOUT。
WER276B SYSDIAG= 24646562, 29667262, 29667262, 27500165
WER164B 307,288K BYTES OF VIRTUAL STORAGE AVAILABLE, MAX REQUESTED,
WER164B 0 BYTES RESERVE REQUESTED, 307,272K BYTES USED
WER036B G=5174,B=1,BIAS=99
WER162B 75 PREALLOCATED SORTWORK TRACKS, 3,750,000 DYNAMICALLY
ALLOCATED,
WER162B 26,721,480 ACQUIRED IN 2,230 SECONDARY EXTENTS, 0 RELEASED,
TOTAL 30,471,555 TRACKS USED
WER046A SORT CAPACITY EXCEEDED
WER493I ZIIP PROCESSOR USED
WER211B SYNCSMF CALLED BY SYNCSORT; RC=0000
WER449I SYNCSORT GLOBAL DSM SUBSYSTEM ACTIVE
WER066A APROX RCD CNT 30430982
这是我的代码:
//STEP50 EXEC SORTD
//SORTIN DD DSN=FILEXYZ(0),
// DISP=SHR,DCB=BUFNO=192
//SORTOUT DD DSN=FILE2XXY,
// DISP=(NEW,CATLG,DELETE),RETPD=365,VOL=(,,,99),
// DCB=(RECFM=FB,LRECL=30050,BLKSIZE=0,BUFNO=192),
// UNIT=(TAPE,2)
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=(19,5,PD,A,8,6,PD,A,50,2,ZD,A)
OUTREC IFTHEN=(WHEN=(70,18,CH,EQ,C' encoding="IBM037"'),
OVERLAY=(70:C' encoding="UTF-8"'))
OPTION DYNALLOC=(SYSDA,255)
/*
这是来自 jcl 的 SORTD 的代码:
4 //STEP40 EXEC SORTD
5 XXSORTD PROC CYLS=1,SYSFICH='*',
XX DMPCLAS='1,DEST=ABNORMAL'
XX*
XX* REMOVED SEP PARAMETER 89/07/20
XX*
6 XXSORTD EXEC PGM=SORT
7 //SYSOUT DD SYSOUT=*
X/SYSOUT DD SYSOUT=&SYSFICH
IEFC653I SUBSTITUTION JCL - SYSOUT=*
8 XXSORTWK01 DD DSN=&WORK1,SPACE=(CYL,(&CYLS)),UNIT=SORTWORK
IEFC653I SUBSTITUTION JCL - DSN=&WORK1,SPACE=(CYL,
(1)),UNIT=SORTWORK
9 XXSORTWK02 DD DSN=&WORK2,SPACE=(CYL,(&CYLS)),UNIT=SORTWORK
IEFC653I SUBSTITUTION JCL - DSN=&WORK2,SPACE=(CYL,
(1)),UNIT=SORTWORK
10 XXSORTWK03 DD DSN=&WORK3,SPACE=(CYL,(&CYLS)),UNIT=SORTWORK
IEFC653I SUBSTITUTION JCL - DSN=&WORK3,SPACE=(CYL,
(1)),UNIT=SORTWORK
11 XXSORTWK04 DD DSN=&WORK4,SPACE=(CYL,(&CYLS)),UNIT=SORTWORK
IEFC653I SUBSTITUTION JCL - DSN=&WORK4,SPACE=(CYL,
(1)),UNIT=SORTWORK
12 XXSORTWK05 DD DSN=&WORK5,SPACE=(CYL,(&CYLS)),UNIT=SORTWORK
IEFC653I SUBSTITUTION JCL - DSN=&WORK5,SPACE=(CYL,
(1)),UNIT=SORTWORK
13 XXSYSABEND DD SYSOUT=&DMPCLAS
IEFC653I SUBSTITUTION JCL - SYSOUT=1,DEST=ABNORMAL
14 XXSYSUDUMP DD SYSOUT=&DMPCLAS
IEFC653I SUBSTITUTION JCL - SYSOUT=1,DEST=ABNORMAL
15 //SORTIN DD DSN=FILEXYZ(0),
// DISP=SHR,DCB=BUFNO=192
16 //SORTOUT DD DSN=FILE2XXY,
// DISP=(NEW,PASS,DELETE),RETPD=365,VOL=(,,,99),
// DCB=(RECFM=FB,LRECL=30050,BLKSIZE=0,BUFNO=192),
// UNIT=TAPE
17 //SYSPRINT DD SYSOUT=*
18 //SYSIN DD *
请给我一些提示来解决这个问题。 谢谢你。
由于您的排序输入是从磁带读取的,排序无法可靠地计算所需的排序工作space。尝试将 SIZE=Ennnnnnn 参数添加到 SORT 语句。 nnnnnnn是要读取的记录数。 E 告诉排序这是一个估计值。
尝试直接调用 SYNCSORT 而不是调用此过程。此 PROC 仅设置了 5 个工作文件。通常最好让 SYNCSORT 根据需要分配尽可能多的工作文件,而不是告诉它可以使用多少。
我相信 space 中的 运行 是工作文件。试试这个:
//SORT10 EXEC PGM=SYNCSORT,
// PARM=('INCORE=OFF,DYNALLOC=(SYSDA,255)',EQUALS)
//SORTIN DD DSN=FILEXYZ(0),
// DISP=SHR,DCB=BUFNO=192
//SORTOUT DD DSN=FILE2XXY,
// DISP=(NEW,CATLG,DELETE),RETPD=365,VOL=(,,,99),
// DCB=(RECFM=FB,LRECL=30050,BLKSIZE=0,BUFNO=192),
// UNIT=(TAPE,2)
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SORTMSG DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=(19,5,PD,A,8,6,PD,A,50,2,ZD,A)
OUTREC IFTHEN=(WHEN=(70,18,CH,EQ,C' encoding="IBM037"'),
OVERLAY=(70:C' encoding="UTF-8"'))
OPTION DYNALLOC=(SYSDA,255)
/*
我会在这里走出去,假设这里有问题的文件与上一个问题相同,具有相同 OP 的相同文件属性:
LRECL 为 30050 时有 80,000,000 条记录,您的输入文件大约为 2.2TB。
普遍接受的排序工作经验法则 space 是输入文件大小的 1.3 倍。因此,您需要将约 2.85TB(即约 370 万个 CYLS 或约 5500 万个磁道)的分类工作作为目标 space。
使用 SyncSort 的最多 255 个 SORTWK DD,您需要在支持的 255 个 DD 中的每一个中获取约 14,500 个 CYL 以满足您的 space 要求。这有点极端,可能会带来一些挑战,但有一些选项可以让您实现这一目标。
免责声明 - 我本人没有亲自使用过 SyncSort,但在仔细阅读文档后,这些概念看起来与我确实使用过的其他排序产品一致。
依赖DYNALLOC
您已指定 DYNALLOC=(SYSDA,255)
,这是通常推荐的方法。但是,您当前的设置存在一些问题:
通过使用
SORTD
PROC,您正在剥夺 5 个本可以更恰当地利用的 DD。 PROC 中带有SPACE=(CYL,(1))
的硬编码 SORTWK DD 限制了您可以获得的总工作 space,因为 DYNALLOC 现在只有 250 个 DD 可以使用。正如@SaggingRufus 所建议的那样,直接调用 SYNCSORT 将避免 PROC DD 的 1-CYL 分配并允许 DYNALLOC 与所有 255 个 DD 一起工作。SyncSort 未准确预测必要的工作 space。根据您提供的输出,SyncSort 最初明确地获取了 75 个轨道(SORTD 过程中的 5 个硬编码 DD 中的每个 1 个 CYL……换句话说,1 个 CYL * 15 个 Tracks-per-CYL = 75 的 5 个 DD),然后动态地获得了额外的 3,750,000 个轨道(1,000 个 CYL(或 15,000 个轨道)* 250 个 DD)。然后,它在 2,230 个二级范围内获得了额外的 2670 万个轨道(1.78MM CYL),这表明每个二级范围平均有 799 个 CYL(或 11,983 个轨道),每个 volume/DD 平均有 8.75 个二级范围。所有这些导致总共分配了 ~1.6TB (~2MM Cyls) 用于排序工作 space,比估计工作 space 要求低 方式 对于 2.2TB 输入文件。即使我们将 DYNALLOC 属性应用到来自 PROC 的硬编码 SORTWK DD,这也只会增加大约 32GB 的总工作量 space,而且仍然远远不够。因此,正如@phunsoft 所建议的那样,添加 SIZE=Ennnnnnnn 参数可能是 SyncSort 适当投影工作 space 所必需的。
附加说明 - 每个 DD/volume 平均得到 <10 个二级扩展区这一事实表明您正在耗尽可用的免费 space 卷适合您环境的工作 space 池。您应该与您的存储管理员协调以确保有足够的磁盘 space 可用于您的工作 space.
因此,绕过 PROC 以提供对所有 255 个 DD 的访问并提供估计的记录数 可以 允许 SyncSort 更可靠地计算必要的工作 space,但是单一排序中的这一数据量可能是异常值,默认计算可能不够。此外,您的工作 space 池中可用的免费 space 可能是一个限制因素。
硬编码 SORTWK DD
如果您在 JCL 中对 SORTWK DD 进行硬编码,则会绕过 PROC 中的 DD,并消除 DYNALLOC 计算的一些不确定性。这实际上是我个人在这种情况下首先采用的方法……使用最佳可能选项对每个 SORTWK DD 进行硬编码,以便在每个 DD 上获得约 14,500 个 CYLS。所以:
在作业中对 255 个 DD (SORTWK01 - SORTWKFF) 中的每一个进行硬编码
在每个 DD 上包含
SPACE=(CYL,(4000,1000))
(即使 SyncSort 应该会自行计算二次分配)在每个 DD 上包含
DSNTYPE=LARGE
以允许每个卷大于 4G(每个 SORTWK 限制为 1 个卷) 这些 DD 的总和应该可以为您的分类要求提供足够的工作 space。
以上每个选项都假设您的商店的工作 space 池中有足够的 vols/extents/overall-space 可用。我建议与您的存储管理团队协调以确保资源的可用性
使用 MAXSORT
SyncSort 提供 MAXSORT
能力来容纳超大数据集。它将输入文件的部分分类为中间文件,并为后续部分重新使用 SORTWK space,直到每个部分的中间文件可以组合成单个输出文件。使用 MAXSORT
有特殊要求。如前所述,我无权访问 SyncSort,因此我无法自行测试此功能。您必须自己研究 SyncSort 文档以了解此功能的详细信息。