mainframe - 如何在 SORT 操作中减少 CPU
问题描述
我正在使用 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)
/*
解决方案
我喜欢诊断这类问题...
每条 30K 的 80M 记录约为 2.5TB,由于您正在读取和写入此数据,因此您正在处理至少 5TB(不包括工作文件的 I/O)。如果我的数学计算正确,则平均 500MB/秒超过三个小时。
首先要做的是了解 DFSORT 是否真的主动运行了 3 个小时,或者是否有等待时间的来源。例如,如果您的磁带是多卷数据集,则可能需要等待磁带装载时间。在作业日志消息中查找这一点 - 可能是您 3 小时中的 20 分钟只是在等待安装正确的磁带。
您可能还会遇到增加等待时间的 CPU 使用问题。根据您的系统设置方式,您的工作可能只获得一小部分 CPU 时间并等待其余时间。您可以通过查看消耗的 CPU 时间(它也在作业日志消息中)并将其与经过的时间进行比较...例如,如果您的作业在 3 小时内获得 1000 CPU 秒 (TCB + SRB),那么您就是在这段时间内平均 9% 的 CPU 使用率。在不同的工作类别中提交您的工作可能会有所不同 - 询问您当地的系统程序员。
当然,9% 的 CPU 时间可能不是问题 - 您的工作可能会受到严重的 I/O 限制,因此很多等待时间是等待 I/O 完成,而不是等待更多的 CPU 时间。您真正想知道的是您的等待时间是等待 CPU 访问、等待 I/O 还是其他原因。同样,如果您的本地系统程序员知道如何阅读 RMF 报告,他应该能够帮助您回答这个问题。
接下来要做的是更好地了解您的 I/O,目标是减少需要执行的物理 I/O 操作的总数和/或使每个 I/O 运行得更快一些。
可以这样想:每个物理 I/O 至少需要 2-3 毫秒。在最坏的情况下,如果您正在读取/写入的 160M 记录中的每一条都需要 3 毫秒,那么经过的时间将是 160,000,000 X .003 = 480,000 秒,或五天半!
正如另一位响应者提到的,blocksize 和 buffering 是你的朋友。由于 I/O 操作的大部分时间归结为触发 I/O 并等待响应,因此“大 I/O”不会比“小 I/O”花费更多时间。通常,您希望执行尽可能少和尽可能大的物理 I/O 操作以缩短运行时间。
根据您使用的磁带设备的类型,您应该能够在磁带上获得高达 256K 的块大小——即每个 I/O 有 7 条记录。您的 BLKSIZE=0 可能已经得到了这个,这取决于您的系统是如何配置的。请注意,这取决于设备,并注意您的站点是否碰巧使用了将“真实”磁带驱动器映射到磁盘的虚拟磁带产品之一……在这里,超过一定限制 (32K) 的块大小往往会运行得更慢。
不幸的是,缓冲比之前建议的答案更复杂......原来 BUFNO 适用于使用 IBM 的 QSAM 访问方法的相对简单的应用程序 - 这不是 DFSORT 所做的。事实上,DFSORT 非常聪明地处理它的 I/O,它会根据可用内存动态创建缓冲区。不过,您可能会尝试在更大的区域中运行您的作业(例如,您的 JCL 中的 REGION=0),并且您可能会找到 DFSORT 选项,例如 MAINSIZE=MAX 帮助 - 请参阅此链接以获取更多信息。
至于您的磁盘 I/O(包括那些 SORTWK 数据集),这里也有很多选项。您的 30K LRECL 在很大程度上限制了您可以为阻塞做的事情,但是您可以进行各种磁盘调整练习,从使用 VIO 数据集到 PAV(并行访问卷)。重点是,其中很多也是特定于配置的,因此正确的答案将取决于您的站点拥有什么以及它是如何配置的。
但也许最重要的是,在你偶然发现正确答案之前,你不想纯粹地反复试验。如果您想学习,请熟悉 RMF 或您的站点拥有的任何性能管理工具(或找到愿意与您合作的系统程序员)并深入研究。问问自己,瓶颈是什么——为什么这项工作没有运行得更快? 然后找到瓶颈,修复它并继续下一个。这些都是非常重要的技能,一旦你了解了基础知识,它就不再像一门黑色艺术,而更像是一个你可以遵循任何事情的系统过程。
推荐阅读
- python - 即使父文件夹在 sys.path 中,Python 也找不到本地模块
- java - 在 JavaFX 中的 Action Handelers 方法中删除了 LinkedList
- html - 如何从博彩网站中提取 div_class 表
- python - Heroku 在 plotly dash 部署中抛出错误
- c - 如何获取字符串中单词的相关回文长度?
- tensorflow - 本例中的反向传播在哪里执行
- javascript - 随机图片点击不重复
- javascript - 使用 Date 对象获取季度的周数
- javascript - 如何在 django 中创建文件上传进度条?
- xcode - Xcode:无法解锁文件“UserInterfaceState.xcuserstate”