【问题标题】:How can I solve "WER046A SORT CAPACITY EXCEEDED" in SYNCSORT JCL如何解决 SYNCSORT JCL 中的“WER046A SORT CAPACITY EXCEEDED”
【发布时间】:2018-08-14 11:10:24
【问题描述】:

我正在尝试对数据集进行排序并写入一个新的数据集,每次我执行作业时,它都会异常终止 (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 *     

请给我一些提示来解决这个问题。 谢谢你。

【问题讨论】:

  • 我会在今天早上晚些时候看看。我最初的想法是您需要将 BUFNO 调低...如前所述,您的系统配置会影响此参数。
  • 好的,谢谢,即使没有 BUFNO,它也会显示相同的消息。超出排序容量。
  • 你能告诉我们SORTD的内容吗
  • 抱歉,我正在研究并用完我的 5 分钟来编辑评论。在这里完成上述评论......基本上与@SaggingRufus 相同的请求。您将在作业输出中看到以 XX 开头的行,这仅表示此 JCL 是从 PROC 扩展而来的。
  • 您是否尝试过更大的区域大小(或 REGION=0)?您的 SORTD proc 有一个 CYLS 参数 - 您可以尝试使用比默认值 1 高得多的值来调用它:使用 CYLS=1000 左右。尝试让 SORT 也分配更大的工作文件......你在动态分配的文件上获得 1000 个 cyls - 可能有一个选项可以提高这个。正如 phunsoft 建议的那样,通过估计的记录数是个好主意。切换到 VB 记录也是一个好主意 - 甚至可能跨越 (VBS)。并且 BUFNO 可能会被忽略以支持内部计算的值,因此在这种特定情况下它可能无济于事。

标签: mainframe jcl syncsort


【解决方案1】:

我将在这里竭尽全力,并假设此处所讨论的文件与上一个问题相同,相同的 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 过程中 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 个磁道),每个卷/DD 平均有 8.75 个辅助扩展区。所有这些都导致为排序工作空间分配了总共 ~1.6TB(~2MM Cyls),这低于 2.2TB 输入文件的估计工作空间需求。即使我们将 DYNALLOC 属性应用到来自 PROC 的硬编码 SORTWK DD,也只会增加大约 32GB 的总工作空间,而且仍然严重不足。因此,正如@phunsoft 所建议的那样,可能需要添加 SIZE=Ennnnnnnn 参数,以便 SyncSort 正确地投影工作空间。

  • 附加说明 - 每个 DD/卷平均获得

因此,绕过 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 的集合应该为您的排序要求提供足够的工作空间。

上述每个选项都假定您的商店的工作空间池中有足够的 vols/extents/overall-space 可用。我建议与您的存储管理团队协调以确保资源的可用性

使用 MAXSORT

SyncSort 提供MAXSORT 功能来容纳超大数据集。它将输入文件的部分分类为中间文件,并为后续部分重新使用 SORTWK 空间,直到每个部分的中间文件可以组合成单个输出文件。使用MAXSORT 有特殊要求。如前所述,我无法访问 SyncSort,因此我无法自己测试此功能。您必须自己研究 SyncSort 文档以了解此功能的详细信息。

【讨论】:

  • 感谢您的调查和详细的解释。会按照建议去做,现在就让你去做。 :)
  • @NITISHSINGH 。它能为您提供帮助吗 ?您的问题的正确答案?
【解决方案2】:

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

【讨论】:

  • SORTIN 不一定是从磁带中读取的……SORTOUT 是根据原始帖子写入磁带的。
  • @Hogstrom:你是对的。这里没有说,但我默默地理解这是 OP 于 7 月 28 日开始的“如何减少排序操作中的 CPU”的延续。应该提到这一点;对不起,我没有。
【解决方案3】:

尝试直接调用 SYNCSORT 而不是调用此过程。这个 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)                                 
/*

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-17
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    相关资源
    最近更新 更多