如何在 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 文档以了解此功能的详细信息。