mainframe - 如何解决 SYNCSORT JCL 中的“WER046A SORT CAPACITY EXCEEDED”
问题描述
我正在尝试对数据集进行排序并写入一个新的数据集,每次我执行作业时,它都会异常终止(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 *
请给我一些提示来解决这个问题。谢谢你。
解决方案
我将在这里竭尽全力,并假设此处所讨论的文件与上一个问题相同,相同 OP 具有相同的文件属性: 如何在 SORT 操作中减少 CPU
LRECL 为 30050 的 80,000,000 条记录,您的输入文件大约为 2.2TB。
一个普遍接受的排序工作空间的经验法则是输入文件大小的 1.3 倍。因此,您需要定位约 2.85TB(即约 370 万 CYLS 或约 5500 万轨道)的排序工作空间。
使用 SyncSort 最多 255 个 SORTWK DD,您需要在每个受支持的 255 个 DD 中获取约 14,500 个 CYL,以满足您的空间需求。这有点极端,可能会带来许多挑战,但有一些选项可以让您实现这一目标。
免责声明 - 我自己没有亲自使用过 SyncSort,但在仔细阅读文档后,这些概念看起来与我使用过的其他排序产品一致。
依靠 DYNALLOC
您已指定DYNALLOC=(SYSDA,255)
,这通常是推荐的方法。但是,您当前的设置存在几个问题:
通过使用
SORTD
PROC,您正在抢夺 5 个本可以更恰当地利用的 DD。PROC 中硬编码的 SORTWK DDSPACE=(CYL,(1))
限制了您可以获得的总工作空间,因为 DYNALLOC 现在只有 250 个 DD 可供使用。正如@SaggingRufus 建议的那样,直接调用 SYNCSORT 将避免 PROC DD 的 1-CYL 分配,并允许 DYNALLOC 与所有 255 个 DD 一起工作。SyncSort 没有准确地投射必要的工作空间。根据您提供的输出,SyncSort 最初显式地获取了 75 个轨道(SORTD 过程中 5 个硬编码 DD 中的每个 1 个 CYL……换句话说,5 个 DD,1 个 CYL * 15 个 Tracks-per-CYL = 75),然后是动态的获得了额外的 3,750,000 曲目(1,000 CYL(或 15,000 曲目)* 250 DD)。然后,它在 2,230 个辅助扩展区中额外获得了 2670 万个磁道 (1.78MM CYL),这表明每个辅助扩展区平均有 799 个 CYL(或 11,983 个磁道),每个卷/DD 平均有 8.75 个辅助扩展区。所有这些都导致为排序工作空间分配了总共 ~1.6TB (~2MM Cyls),这是一种方式低于 2.2TB 输入文件的估计工作空间要求。即使我们将 DYNALLOC 属性应用到来自 PROC 的硬编码 SORTWK DD,也只会增加大约 32GB 的总工作空间,而且仍然严重不足。因此,正如@phunsoft 建议的那样,可能需要添加 SIZE=Ennnnnnnnn 参数,以使 SyncSort 适当地投影工作空间。
附加说明 - 每个 DD/卷平均获得 <10 个辅助扩展区这一事实表明,您正在耗尽环境中工作空间池中卷上的可用空间。您应该与您的存储管理员协调,以确保有足够的磁盘空间可用于您的工作空间。
因此,绕过 PROC 以提供对所有 255 个 DD 的访问并提供估计的记录数可以让 SyncSort 更可靠地计算必要的工作空间,但单个排序中的数据量可能是异常值,默认计算可能不够. 此外,工作空间池中的可用空间可能是一个限制因素。
硬编码 SORTWK DD
如果您在 JCL 中对 SORTWK DD 进行硬编码,则可以绕过 PROC 中的 DD,并消除 DYNALLOC 计算的一些不确定性。这实际上是我个人在这种情况下首先采用的方法……使用最佳选项对每个 SORTWK DD 进行硬编码,以在每个 DD 上获得约 14,500 个 CYLS。所以:
在作业中对 255 个 DD (SORTWK01 - SORTWKFF) 中的每一个进行硬编码
包括
SPACE=(CYL,(4000,1000))
在每个 DD 上(即使 SyncSort 应该自己计算辅助分配)包括
DSNTYPE=LARGE
在每个 DD 上以允许每个卷大于 4G(每个 SORTWK 限制为 1 个卷) 这些 DD 的聚合应为您的排序要求提供足够的工作空间。
上述每个选项都假定您的商店的工作空间池中有足够的 vols/extents/overall-space 可用。我建议与您的存储管理团队协调以确保资源的可用性
使用 MAXSORT
SyncSort 提供了MAXSORT
容纳超大数据集的能力。它将输入文件的部分分类为中间文件,并为后续部分重新使用 SORTWK 空间,直到每个部分的中间文件可以组合成单个输出文件。使用有特殊要求MAXSORT
。如前所述,我无权访问 SyncSort,因此我无法自己测试此功能。您必须自己研究 SyncSort 文档以了解此功能的详细信息。
推荐阅读
- python - python中or运算符的使用
- javascript - 单击 iframe vanilla js 中的按钮
- reactjs - 如何从子组件获取状态数据到父组件?
- performance - rdpmc: surprising behavior
- html - 在表格文本框元素周围环绕文本
- php - 错误:试图获取非对象的属性
- sql-server - 如何根据 SQL Server 中另一列的值添加一个新列来标记列的重复?
- flutter - 来自动态列表的颤振流
- android - Classes using methods of other dependencies is not working in my custom library, any suggestions?
- python - How can I get all the index of all the NaNs of a list?