如何在 SORT 操作中减少 CPU
How can I reduce CPU in SORT operation
我正在使用 DFSORT 将磁带数据集复制到临时文件,并处理大约 80000000 条记录。仅复制数据集就需要 3 个小时。
有没有其他方法可以减少 CPU 时间。
建议将非常有帮助。
谢谢你。
//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)
/*
既然你写了
... it takes 3 hours to complete...
我想您真正想要的是减少 运行时间 ,而不是 CPU 时间。运行时间取决于很多因素,例如机器配置、机器速度、系统总负载、您的工作的优先级等。没有更多关于环境的信息,很难给出建议。
但是,我看到您正在将排序输出写入临时数据集。我的结论是,还有一个步骤可以读取该数据。为什么要将这些数据写入磁带?磁盘肯定会更快并减少经过的时间。
彼得
一些关于改进 I/O 性能的评论,这应该会改善您的总体运行时间。
- 在您的 SORTIN 和 SORTOUT DD 语句中将以下内容添加到您的 DCB。
来自 IBM MVS JCL Manual 第 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是因为这几天内存相对便宜。根据您的环境进行调整。这实质上告诉系统每个 I/O 要读取多少块,从而减少与 I/O 操作相关的时间。您可以玩这个数字以获得最佳结果。默认值为 5。
BUFNO=buffers
Specifies the number of buffers to be assigned
to the DCB. The maximum normally is 255, but can be less because of
the size of the region. Note: Do not code the BUFNO subparameter with
DCB subparameters BUFIN, BUFOUT, or DD parameter QNAME.
- 您可以考虑块大小的。输出的块大小看起来很奇怪。确保它针对您要使用的设备进行了优化。对于 TAPE 设备,这应该尽可能大。对于 3480 或 3490 设备,它可以大到 65535。您不指定 LRECL 但指示它的 30050 然后您可以指定 60100 的 BLKZIE,这将是每个块两条记录。更好的 I/O 效率。
这里是关于 BLKSIZE selection 磁带的更多信息。
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 设置。
我喜欢诊断这类问题...
每条 30K 的 8000 万条记录大约为 2.5TB,并且由于您正在读取和写入这些数据,因此您正在处理至少 5TB(不包括 I/O 工作文件)。如果我没算错的话,三个小时内的平均速度为 500MB/秒。
首先要做的是了解 DFSORT 是否真的 运行ning 了 3 个小时,或者是否有等待时间的来源。例如,如果您的磁带是多卷数据集,则磁带安装可能需要等待时间。在作业日志消息中寻找这一点 - 可能是您 3 小时中的 20 分钟只是在等待安装正确的磁带。
您可能还会遇到 CPU 使用问题,这会增加等待时间。根据您的系统设置方式,您的作业可能只占用一小部分 CPU 时间,其余时间都在等待。您可以通过查看消耗的 CPU 时间(它也在作业日志消息中)并将其与经过的时间进行比较来判断...例如,如果您的作业获得 1000 CPU 秒(TCB + SRB ) 超过 3 小时,您在此期间的平均使用率为 9% CPU。将您的工作提交到另一份工作 class 可能会有所不同 - 请咨询您当地的系统程序员。
当然,9% CPU 的时间可能不是问题 - 您的工作很可能 I/O 受限,所以大部分等待时间都是在等待 I/O完成,而不是等待更多 CPU 时间。您真正想知道的是您的等待时间是等待 CPU 访问、等待 I/O 还是其他一些原因。同样,如果您的本地系统程序员知道如何阅读 RMF 报告,他应该能够帮助您回答这个问题。
接下来要做的是更好地了解您的 I/O,目标是减少需要执行的物理 I/O 操作的总数 and/or 使每个 I/O 运行 快一点。
这样想:每个物理 I/O 至少需要 2-3 毫秒。在最坏的情况下,如果您 reading/writing 的 16000 万条记录中的每条记录都需要 3 毫秒,则经过的时间将为 160,000,000 X .003 = 480,000 秒,即五天半!
正如另一位回复者所提到的,块大小和缓冲是你的朋友。由于 I/O 操作的大部分时间都归结为触发 I/O 并等待响应,因此 "big I/O" 不会比 [=36= 花费更多时间].通常,您希望进行尽可能少但尽可能多的物理 I/O 操作,以缩短运行时间。
根据您使用的磁带设备类型,您应该能够在磁带上获得最多 256K 的块大小 - 即每个 I/O 7 条记录。你的 BLKSIZE=0 可能已经让你得到这个,这取决于你的系统是如何配置的。请注意,尽管这取决于设备,但请注意您的站点是否恰好使用将 "real" 磁带驱动器映射到磁盘的虚拟磁带产品之一......在这里,超过一定限制(32K)的块大小倾向于 运行 较慢。
不幸的是,缓冲比之前建议的答案更复杂...原来 BUFNO 适用于使用 IBM 的 QSAM 访问方法的相对简单的应用程序 - 而这不是 DFSORT 所做的。事实上,DFSORT 非常聪明I/O,它会根据可用内存动态创建缓冲区。尽管如此,您还是可以尝试 运行 在更大的区域(例如,JCL 中的 REGION=0)中设置您的作业,并且您可能会发现 DFSORT 选项,如 MAINSIZE=MAX 帮助 - 请参阅 this link 了解更多信息。
至于您的磁盘 I/O(包括那些 SORTWK 数据集),这里也有很多选项。您的 30K LRECL 在很大程度上限制了您可以为阻塞做的事情,但是您可以进行各种磁盘调优练习,从使用 VIO 数据集到 PAV(并行访问卷)。重点是,其中很多也是特定于配置的,因此正确的答案将取决于您的网站有什么以及它是如何配置的。
但也许最重要的是,在您偶然发现正确答案之前,您不想纯粹地反复试验。如果你想学习,熟悉 RMF 或你的站点拥有的任何性能管理工具(或者找一个愿意和你一起工作的系统程序员)并深入研究。问问你自己,瓶颈是什么 - 为什么这份工作不是 运行宁更快?然后找到瓶颈,修复它并继续下一个。这些都是非常棒的技能,一旦你了解了基础知识,它就不再像一种魔法,而更像是一个系统的过程,你可以遵循任何事情。
我正在使用 DFSORT 将磁带数据集复制到临时文件,并处理大约 80000000 条记录。仅复制数据集就需要 3 个小时。 有没有其他方法可以减少 CPU 时间。 建议将非常有帮助。 谢谢你。
//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)
/*
既然你写了
... it takes 3 hours to complete...
我想您真正想要的是减少 运行时间 ,而不是 CPU 时间。运行时间取决于很多因素,例如机器配置、机器速度、系统总负载、您的工作的优先级等。没有更多关于环境的信息,很难给出建议。
但是,我看到您正在将排序输出写入临时数据集。我的结论是,还有一个步骤可以读取该数据。为什么要将这些数据写入磁带?磁盘肯定会更快并减少经过的时间。
彼得
一些关于改进 I/O 性能的评论,这应该会改善您的总体运行时间。
- 在您的 SORTIN 和 SORTOUT DD 语句中将以下内容添加到您的 DCB。
来自 IBM MVS JCL Manual 第 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是因为这几天内存相对便宜。根据您的环境进行调整。这实质上告诉系统每个 I/O 要读取多少块,从而减少与 I/O 操作相关的时间。您可以玩这个数字以获得最佳结果。默认值为 5。
BUFNO=buffers
Specifies the number of buffers to be assigned to the DCB. The maximum normally is 255, but can be less because of the size of the region. Note: Do not code the BUFNO subparameter with DCB subparameters BUFIN, BUFOUT, or DD parameter QNAME.
- 您可以考虑块大小的。输出的块大小看起来很奇怪。确保它针对您要使用的设备进行了优化。对于 TAPE 设备,这应该尽可能大。对于 3480 或 3490 设备,它可以大到 65535。您不指定 LRECL 但指示它的 30050 然后您可以指定 60100 的 BLKZIE,这将是每个块两条记录。更好的 I/O 效率。
这里是关于 BLKSIZE selection 磁带的更多信息。
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 设置。
我喜欢诊断这类问题...
每条 30K 的 8000 万条记录大约为 2.5TB,并且由于您正在读取和写入这些数据,因此您正在处理至少 5TB(不包括 I/O 工作文件)。如果我没算错的话,三个小时内的平均速度为 500MB/秒。
首先要做的是了解 DFSORT 是否真的 运行ning 了 3 个小时,或者是否有等待时间的来源。例如,如果您的磁带是多卷数据集,则磁带安装可能需要等待时间。在作业日志消息中寻找这一点 - 可能是您 3 小时中的 20 分钟只是在等待安装正确的磁带。
您可能还会遇到 CPU 使用问题,这会增加等待时间。根据您的系统设置方式,您的作业可能只占用一小部分 CPU 时间,其余时间都在等待。您可以通过查看消耗的 CPU 时间(它也在作业日志消息中)并将其与经过的时间进行比较来判断...例如,如果您的作业获得 1000 CPU 秒(TCB + SRB ) 超过 3 小时,您在此期间的平均使用率为 9% CPU。将您的工作提交到另一份工作 class 可能会有所不同 - 请咨询您当地的系统程序员。
当然,9% CPU 的时间可能不是问题 - 您的工作很可能 I/O 受限,所以大部分等待时间都是在等待 I/O完成,而不是等待更多 CPU 时间。您真正想知道的是您的等待时间是等待 CPU 访问、等待 I/O 还是其他一些原因。同样,如果您的本地系统程序员知道如何阅读 RMF 报告,他应该能够帮助您回答这个问题。
接下来要做的是更好地了解您的 I/O,目标是减少需要执行的物理 I/O 操作的总数 and/or 使每个 I/O 运行 快一点。
这样想:每个物理 I/O 至少需要 2-3 毫秒。在最坏的情况下,如果您 reading/writing 的 16000 万条记录中的每条记录都需要 3 毫秒,则经过的时间将为 160,000,000 X .003 = 480,000 秒,即五天半!
正如另一位回复者所提到的,块大小和缓冲是你的朋友。由于 I/O 操作的大部分时间都归结为触发 I/O 并等待响应,因此 "big I/O" 不会比 [=36= 花费更多时间].通常,您希望进行尽可能少但尽可能多的物理 I/O 操作,以缩短运行时间。
根据您使用的磁带设备类型,您应该能够在磁带上获得最多 256K 的块大小 - 即每个 I/O 7 条记录。你的 BLKSIZE=0 可能已经让你得到这个,这取决于你的系统是如何配置的。请注意,尽管这取决于设备,但请注意您的站点是否恰好使用将 "real" 磁带驱动器映射到磁盘的虚拟磁带产品之一......在这里,超过一定限制(32K)的块大小倾向于 运行 较慢。
不幸的是,缓冲比之前建议的答案更复杂...原来 BUFNO 适用于使用 IBM 的 QSAM 访问方法的相对简单的应用程序 - 而这不是 DFSORT 所做的。事实上,DFSORT 非常聪明I/O,它会根据可用内存动态创建缓冲区。尽管如此,您还是可以尝试 运行 在更大的区域(例如,JCL 中的 REGION=0)中设置您的作业,并且您可能会发现 DFSORT 选项,如 MAINSIZE=MAX 帮助 - 请参阅 this link 了解更多信息。
至于您的磁盘 I/O(包括那些 SORTWK 数据集),这里也有很多选项。您的 30K LRECL 在很大程度上限制了您可以为阻塞做的事情,但是您可以进行各种磁盘调优练习,从使用 VIO 数据集到 PAV(并行访问卷)。重点是,其中很多也是特定于配置的,因此正确的答案将取决于您的网站有什么以及它是如何配置的。
但也许最重要的是,在您偶然发现正确答案之前,您不想纯粹地反复试验。如果你想学习,熟悉 RMF 或你的站点拥有的任何性能管理工具(或者找一个愿意和你一起工作的系统程序员)并深入研究。问问你自己,瓶颈是什么 - 为什么这份工作不是 运行宁更快?然后找到瓶颈,修复它并继续下一个。这些都是非常棒的技能,一旦你了解了基础知识,它就不再像一种魔法,而更像是一个系统的过程,你可以遵循任何事情。