Как я могу уменьшить процессор в операции SORT
Я использую DFSORT для копирования набора данных ленты во временный файл и обрабатываю около 80000000 записей. Это займет 3 часа, чтобы просто скопировать наборы данных. Есть ли другой способ уменьшить время процессора. Предложения будут очень полезны. Благодарю вас.
//STEP40 EXEC SORTD
//SORTIN DD DSN=FILEONE(0),
// DISP=SHR
//SORTOUT DD DSN=&&TEMP,
// DISP=(NEW,PASS,DELETE),
// DCB=(RECFM=FB,LRECL=30050,BLKSIZE=0),
// UNIT=TAPE
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=(14,6,PD,A,8,6,PD,A,45,2,ZD,A)
OUTREC IFTHEN=(WHEN=(70,18,CH,EQ,C' encoding="IBM037"'),
OVERLAY=(70:C' encoding="UTF-8"'))
OPTION DYNALLOC=(SYSDA,255)
/*
3 ответа
Несколько замечаний по улучшению производительности ввода-вывода, которая должна улучшить общее время, затраченное вами.
- В своем выражении SORTIN и SORTOUT DD добавьте следующее в свой DCB.
Из руководства IBM по MVS JCL на стр. 143.
//SORTIN DD DSN=FILEONE(0),
// DISP=SHR<b>,DCB=BUFNO=192</b>
//SORTOUT DD DSN=&&TEMP,
// DISP=(NEW,PASS,DELETE),
// DCB=(RECFM=FB,LRECL=30050,BLKSIZE=0,BUFNO=192),
// UNIT=TAPE
Я выбрал 192 как относительно дешевый с точки зрения памяти в наши дни. Отрегулируйте для вашей среды. Это, по сути, говорит системе, сколько блоков читать с каждым вводом / выводом, что сокращает время, связанное с операциями ввода / вывода. Вы можете играть с этим номером, чтобы получить оптимальный результат. По умолчанию 5.
BUFNO = буферы
Определяет количество буферов, которые будут назначены DCB. Максимум обычно составляет 255, но может быть меньше из-за размера региона. Примечание. Не кодируйте субпараметр BUFNO с помощью субпараметров DCB BUFIN, BUFOUT или параметра DD QNAME.
- Вы могли бы рассмотреть размер блока. Размер блока на выходе кажется странным. Убедитесь, что он оптимизирован для устройства, которое вы собираетесь. Для устройств TAPE это должно быть как можно больше. Для устройств 3480 или 3490 это может быть равно 65535. Вы не указываете LRECL, но указываете, что это 30050, тогда вы можете указать BLKZIE 60100, что будет двумя записями на блок. Лучшая эффективность ввода / вывода.
Вот больше информации о выборе BLKSIZE для лент.
3490 Emulation (VTS) 262144 (256 KB)
3590 262144 (256 KB) (note: on some older models the limit is
229376 (224 KB) 262144 (256 KB)
- Последний быстрый совет, если вы на самом деле используете TAPE, это укажите несколько устройств TAPE. Это позволит записывать одну ленту при монтировании следующей. Я включил здесь также пример BUFNO:
//SORTOUT DD DSN=&&TEMP,
// DISP=(NEW,PASS,DELETE),
// DCB=(RECFM=FB,LRECL=30050,BLKSIZE=0,BUFNO=192),
// UNIT=(TAPE,2)
Конечно, эти оптимизации зависят от вашей физической среды и настроек DFSMS.
Я люблю диагностировать такие проблемы...
80 мегабайт записей по 30 КБ составляют около 2,5 ТБ, и, поскольку вы читаете и записываете эти данные, то обрабатываете минимум 5 ТБ (не включая ввод-вывод для рабочих файлов). Если я делаю свою математику правильно, это в среднем 500 МБ / с в течение трех часов.
Первое, что нужно сделать, это понять, действительно ли DFSORT активно работает в течение 3 часов, или есть источники времени ожидания. Например, если ваши ленты представляют собой многотомные наборы данных, может быть время ожидания для монтирования ленты. Ищите это в сообщениях журнала заданий - может быть, 20 минут из ваших 3 часов просто ждут правильной установки лент.
У вас также может возникнуть проблема с загрузкой процессора, увеличивающая время ожидания. В зависимости от того, как настроена ваша система, ваша работа может занимать лишь небольшую долю процессорного времени и ждать в остальное время. Вы можете определить, посмотрев на потребленное время ЦП (оно также есть в сообщениях журнала заданий) и сравнив его с затраченным временем... например, если ваша работа получает 1000 ЦП (3 секунды), вы в среднем 9% загрузки процессора за это время. Может случиться так, что отправка вашей работы в другой класс работы имеет значение - спросите у местного системного программиста.
Конечно, 9% процессорного времени может не быть проблемой - ваша работа, вероятно, сильно связана с вводом / выводом, поэтому большая часть времени ожидания связана с ожиданием завершения ввода / вывода, а не с ожиданием увеличения времени процессора. Что вы действительно хотите знать, так это то, ожидает ли ваше время ожидания доступа к процессору, ожидания ввода-вывода или какой-либо другой причины. Опять же, ваш системный программист должен помочь вам ответить на этот вопрос, если он знает, как читать отчеты RMF.
Следующее, что нужно сделать, это немного лучше понять ваш ввод-вывод с целью сокращения общего количества физических операций ввода-вывода, которые необходимо выполнить, и / или ускорения каждого ввода-вывода.
Подумайте об этом так: каждый физический ввод-вывод займет минимум 2-3 миллисекунды. В худшем случае, если каждая из этих 160M записей, которые вы читаете / пишете, займет 3 мс, истекшее время будет 160 000 000 X .003 = 480 000 секунд или пять с половиной дней!
Как упоминает другой респондент, размер блока и буферизация - ваши друзья. Так как большая часть операции ввода-вывода сводится к запуску ввода-вывода и ожиданию ответа, "большой ввод-вывод" занимает не так много времени, как "маленький ввод-вывод". Как правило, вы хотите выполнить как можно меньше и как можно больше физических операций ввода-вывода, чтобы сократить истекшее время.
В зависимости от типа ленточного устройства, которое вы используете, вы можете получить до 256Кбайт размеров блоков на вашей ленте - это 7 записей на ввод / вывод. Ваш BLKSIZE=0 может уже получить это, в зависимости от того, как настроена ваша система. Тем не менее, обратите внимание, что это зависит от устройства, и обратите внимание, если ваш сайт использует один из виртуальных ленточных продуктов, которые отображают "настоящие" ленточные накопители на диск... здесь, размеры блоков свыше определенного предела (32 КБ), как правило, работают медленнее.
К сожалению, буферизация является более сложной, чем предполагалось в предыдущем ответе... оказывается, BUFNO для относительно простых приложений, использующих метод доступа IBM QSAM - и это не то, что делает DFSORT. В самом деле, DFSORT достаточно умён в том, как он выполняет свои операции ввода-вывода, и динамически создает буферы на основе доступной памяти. Тем не менее, вы можете попробовать запустить свою работу в более крупном регионе (например, REGION=0 в вашем JCL), и вы можете найти параметры DFSORT, такие как MAINSIZE=MAX help - см. Эту ссылку для получения дополнительной информации.
Что касается вашего дискового ввода / вывода (который включает в себя эти наборы данных SORTWK), здесь также есть много опций. Ваш 30K LRECL в достаточной степени ограничивает то, что вы можете сделать для блокировки, но есть все виды упражнений по настройке диска, которые вы можете пройти, от использования наборов данных VIO до PAV (томов параллельного доступа). Дело в том, что многое из этого также зависит от конфигурации, и поэтому правильный ответ будет зависеть от того, что у вашего сайта и как он все настроен.
Но, возможно, самое главное, что вы не хотите делать это методом проб и ошибок, пока не наткнетесь на правильный ответ. Если вы хотите узнать, ознакомиться с RMF или любыми инструментами управления производительностью вашего сайта (или найти системного программиста, который готов работать с вами) и покопаться. Спросите себя, что является узким местом - почему эта работа не выполняется быстрее? Затем найдите узкое место, исправьте его и переходите к следующему. Это огромные навыки, которые вы должны иметь, и как только вы узнаете основы, вы перестанете чувствовать себя черным искусством, а скорее как систематическим процессом, которому вы сможете следовать с чем угодно.
Так как ты пишешь
... для завершения требуется 3 часа...
Я думаю, что вы действительно хотите, чтобы сократить прошедшее время, а не процессорное время. Истекшее время зависит от многих факторов, таких как конфигурация машины, скорость машины, общая нагрузка на систему, приоритет вашей работы и т. Д. Без дополнительной информации об окружающей среде трудно дать совет.
Тем не менее, я вижу, что вы записываете результаты сортировки во временный набор данных. Я делаю вывод, что есть еще один шаг для чтения этих данных. Почему вы записываете эти данные на ленту? Диск наверняка будет быстрее и сократит затраченное время.
Питер