如何解决SYNCSORT JCL中“超出WER046A的SORT容量”的问题

时间:2018-08-14 11:10:24

标签: mainframe jcl 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 *     

请向我建议一些提示,以解决此问题。 谢谢。

3 个答案:

答案 0 :(得分:2)

我将在此处进行分析,并假设此处讨论的文件与先前的问题相同,并且具有相同的文件属性,且由同一OP进行以下操作: How can I reduce CPU in SORT operation

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中带有SPACE=(CYL,(1))的硬编码SORTWK DD限制了您可以获取的总工作空间,因为DYNALLOC现在只有250个DD可以使用。正如@SaggingRufus建议的那样,直接调用SYNCSORT可以避免PROC DD的1-CYL分配,并允许DYNALLOC与所有255个DD一起使用。

  • SyncSort没有正确投影必要的工作空间。根据您提供的输出,SyncSort最初明确地获取了75条磁道(SORTD proc中5个硬编码DD中的每个CYL…换句话说,以1 CYL * 5个每CYL磁道= 75的DD),然后动态获取额外购买了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柱),这比2.2TB输入文件的估计工作空间需求要低。即使我们将DYNALLOC属性应用于来自PROC的硬编码SORTWK DD,这也仅增加了约32GB的总工作空间,但仍然严重不足。因此,正如@phunsoft所建议的那样,可能需要添加SIZE = Ennnnnnnn参数才能使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)进行硬编码

  • 在每个DD上包含SPACE=(CYL,(4000,1000))(即使SyncSort可能会自己计算辅助分配)

  • 在每个DD上包含DSNTYPE=LARGE,以允许每个卷大于4G(每个SORTWK限于1个卷) 这些DD的集合应为您的排序要求提供足够的工作空间。

以上每个选项均假设您的商店的工作空间池中有足够的体积/范围/总体空间。我建议与您的存储管理团队进行协调,以确保资源的可用性

使用MAXSORT

SyncSort提供了MAXSORT功能,可以容纳非常大的数据集。它将输入文件的各个部分分类为中间文件,并为后续部分重复使用SORTWK空间,直到可以将每个部分的中间文件组合为一个输出文件为止。使用MAXSORT有一些特殊要求。如前所述,我无权使用SyncSort,因此无法亲自测试此功能。您必须自己研究SyncSort文档才能获得此功能的详细信息。

答案 1 :(得分:0)

由于从磁带读取了排序输入,因此排序无法可靠地计算所需的排序工作空间。尝试将SIZE = Ennnnnnn 参数添加到SORT语句中。 nnnnnnn 是要读取的记录数。 E 告诉排序这是一个估计。

答案 2 :(得分:0)

尝试直接调用SYNCSORT,而不是调用此proc。该PROC仅设置了5个工作文件。通常最好让SYNCSORT根据需要分配工作文件,而不是告诉它可以使用多少个文​​件。

我认为是工作文件空间不足。试试这个:

//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)                                 
/*