Как я могу решить "WER046A СОРТИРОВКА СОРТИРОВКИ ПРЕВЫШАЕТСЯ" в 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)
/*
Вот код из SORTD из jcl:
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 ответа
Здесь я остановлюсь и предположу, что рассматриваемые здесь файлы такие же, как и в предыдущем вопросе, с такими же атрибутами файлов с помощью одного и того же OP: Как я могу уменьшить ЦП в операции SORT?
С 80000000 записей при LRECL 30050, ваш входной файл составляет примерно 2,2 ТБ.
Общепринятым практическим правилом для рабочего пространства сортировки является 1,3-кратный размер входного файла. Таким образом, вам нужно нацелить ~2,85 ТБ (т. Е. ~3,7 миллиона CYLS или ~55 миллионов дорожек) рабочего пространства сортировки.
С максимальным количеством SyncSort в 255 DD SORTWK вам нужно будет приобрести ~14 500 CYL для каждого из поддерживаемых 255 DD, чтобы удовлетворить ваши потребности в пространстве. Это немного экстремально, и, вероятно, будет представлять ряд проблем, но есть несколько вариантов, которые могут позволить вам достичь этого.
Отказ от ответственности - я лично не использовал SyncSort, но после просмотра документов эти концепции выглядят совместимыми с другими типами продуктов, с которыми у меня есть опыт работы.
Положитесь на DYNALLOC
Вы указали DYNALLOC=(SYSDA,255)
и это вообще рекомендуемый подход. Тем не менее, есть несколько проблем с вашей текущей настройкой:
Используя
SORTD
PROC, вы отнимаете у себя 5 DD, которые могли бы быть более целесообразно использованы. Жестко закодированные SORTWK DD в PROC сSPACE=(CYL,(1))
ограничьте общее рабочее пространство, которое вы можете получить, потому что теперь у DYNALLOC есть только 250 DD для работы. Как подсказывает @SaggingRufus, прямой вызов SYNCSORT позволит избежать выделения 1-CYL для PROC DD и позволит DYNALLOC работать со всеми 255 DD.SyncSort не проецирует необходимое рабочее пространство точно. Исходя из предоставленного вами результата, SyncSort первоначально получил 75 дорожек (1 CYL для каждого из 5 жестко закодированных DD в процессе SORTD… другими словами, 5 DD на 1 CYL * 15 Tracks-per-CYL = 75) явно, затем динамически приобрела дополнительно 3 750000 треков (1 000 CYL (или 15 000 треков) * 250 DD). Затем он приобрел дополнительные 26,7 миллиона дорожек (1,78 мм CYL) в 2230 вторичных экстентах, что указывает на среднее значение 799 CYL (или 11 983 дорожек) на вторичный экстент и в среднем 8,75 вторичных экстентов на объем / ДД. Все это приводит к выделению ~ 1,6 ТБ (~2 ММ Cyls) для рабочего пространства сортировки, что намного ниже предполагаемых требований к рабочему пространству для входного файла 2,2 ТБ. Даже если мы применяем атрибуты DYNALLOC к жестко закодированным SORTWK DD от PROC, это добавляет всего около 32 ГБ к общему рабочему пространству и все еще крайне неадекватно. Поэтому, как предлагает @phunsoft, добавление параметра SIZE=Ennnnnnnnn может быть необходимым для SyncSort для правильного проецирования рабочего пространства.
Дополнительное примечание. Тот факт, что вы получаете в среднем <10 дополнительных экстентов на один DD/ том, указывает на то, что вы исчерпываете доступное свободное пространство на томах в пуле рабочего пространства для вашей среды. Вы должны координировать свои действия с администраторами хранилища, чтобы обеспечить достаточно места на диске для вашего рабочего пространства.
Таким образом, обход PROC для предоставления доступа ко всем 255 DD и предоставления расчетного количества записей может позволить SyncSort более надежно рассчитать необходимое рабочее пространство, но этот объем данных в одной сортировке, вероятно, является выбросом, и вычислений по умолчанию может быть недостаточно, Кроме того, доступное свободное пространство в вашем рабочем пространстве может быть ограничивающим фактором.
Жесткий код SORTWK DD
Если вы жестко закодируете DD SORTWK в своем JCL, вы пропустите DD в PROC и устраните некоторую неопределенность в вычислениях DYNALLOC. Это именно тот подход, который я лично выбрал бы первым в этом сценарии… жестко закодировать каждый DD SORTWK с наилучшими возможными вариантами для получения ~14 500 CYLS на каждый DD. Так:
Жесткий код каждого из 255 DD (SORTWK01 - SORTWKFF) в работе
Включают
SPACE=(CYL,(4000,1000))
на каждый DD (даже если SyncSort предположительно сам рассчитает вторичные распределения)Включают
DSNTYPE=LARGE
для каждого DD, чтобы разрешить больше 4G на том (каждый SORTWK ограничен 1 томом) Совокупность этих DD должна обеспечивать достаточное рабочее пространство для ваших требований сортировки.
В каждом из приведенных выше вариантов предполагается, что в пуле рабочего пространства вашего магазина доступно достаточно свободного места / экстентов / общего пространства. Я бы порекомендовал координировать свои действия с вашей командой управления хранилищем, чтобы обеспечить доступность ресурсов.
Используйте MAXSORT
SyncSort обеспечивает MAXSORT
возможность размещения очень больших наборов данных. Он сортирует разделы входного файла в промежуточные файлы и повторно использует пространство SORTWK для последующих разделов, пока промежуточные файлы для каждого раздела не могут быть объединены в один выходной файл. Есть определенные требования для использования MAXSORT
, Как упоминалось ранее, у меня нет доступа к SyncSort, поэтому я не могу проверить эту возможность самостоятельно. Вам придется самостоятельно изучить документацию SyncSort для выяснения деталей этой возможности.
Поскольку входные данные сортировки считываются с ленты, сортировка не может надежно рассчитать необходимое рабочее пространство сортировки. Попробуйте добавить параметр SIZE =Ennnnnnn в оператор SORT. nnnnnnn - количество записей для чтения. E говорит, что это оценка.
Попробуйте вызвать 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)
/*