【问题标题】:How to test the IO throughput in SAS DATA Step?如何在 SAS DATA Step 中测试 IO 吞吐量?
【发布时间】:2012-11-07 06:04:07
【问题描述】:

我想测试一下系统选项bufnobufsize能否有效提升数据集。

这里是测试代码:

    options bufno=1  bufsize=16k;
    %atstart;
    data target.dds_dep_pagesize16k;
        set tune.dds_dep_pagesize16k(obs=2000000);
    run;
    %atend;

    options bufno=100  bufsize=32k;
    %atstart;
    data target.dds_dep_pagesize16k;
        set tune.dds_dep_pagesize16k(obs=2000000);
    run;
    %atend;
    ...
    ...

%atstart%atend用于计算它们之间程序的运行时间。

如果数据集的大小约为 800 Mb,那么 bufnobufsize 的变化对运行时间影响不大。

但是很多论文说bufnobufsize可以优化程序。也许是因为我在同一个 SAS 会话中运行所有代码,所以我没有准确测量。我的问题是:我应该在单独的会话中测试每个代码运行时间吗?是否需要选择更大的数据集?

【问题讨论】:

  • 是否需要使用更大的数据集完全取决于您将在生产环境中处理的数据集的大小。

标签: performance optimization sas performance-testing


【解决方案1】:

BUFSIZE 通常只会在数据集非常大的情况下提高性能,并且非常大的意思是在一行中除了有很多行之外还有很多数据。它的作用是确定每次通过时读取多少数据;毕竟,如果你有 80 字节的行,4096 的 bufsize 甚至会读取大量的观察结果。另一方面,如果您有 2056 字节的行,那么 4096 页面将只包含一个观察;所以你必须为每个观察阅读一个新页面,这很慢。

BUFNO 没有任何价值,除非你使用的是 SGIO,据我记得一般不推荐使用。

具体回答最后一个问题:无需为这些选项启动新的 SAS 会话。如果您有更大的数据集,BUFSIZE 可能会有一些额外的好处。

一般来说,我建议您更多地关注您的代码而不是系统选项来优化您的运行。只要您使用较大的内存空间(在您的机器上尽可能多,至少几 GB),您可能不会从处理系统选项中获得太多收益。如果您可以消除一些数据传递,您将获得更多。

SORTSIZE 是一个例外 - 将其设置为 MEMSIZE 的 1/3。如果你有 2GB MEMSIZE,那么 SORTSIZE 应该是 667M。这决定了您可以在内存中对多大的数据集进行排序,并且由于某种原因通常非常小。

【讨论】:

  • 感谢您的帮助。我是否有其他方法来提高IO吞吐量,并增强memsize的使用,因为通过windows任务管理器我发现SAS程序总是使用小于100M的内存大小。 MEMSIZE 应该等于总可用内存大小吗?现在我的电脑有 32G 内存。
  • MEMSIZE 应该小于 32G,因为您不想使用所有内存,否则 Windows 会崩溃。 SAS 在正常操作中不会使用大量内存;但这并不能阻止它在需要时使用更多(直到 MEMSIZE)。因此,如果它的大小为 100MB,但需要对 2GB 的数据集进行排序,而您的 MEMSIZE 为 24GB,SORTSIZE 为 8GB,那么它在对数据集进行排序时将扩展到 6GB。
  • 另外,BUFSIZE 仅影响写入,而不影响从现有数据集 tune.dds_dep_pagesize16k 读取,其 BUFSIZE 在其创建时已固定。对于整个测试,数据可能在文件系统缓存中,因此 I/O 的大小几乎没有影响。使用大于可用总 RAM 的数据集进行测试将显示不同的结果。
【解决方案2】:

谈到任何严重的数据处理活动,我认为这总是发生在某个磁盘阵列上——这可能是很多事情,但至少这意味着有多个磁盘采用某种 RAID 格式。 因此,要优化 SAS I/O 性能一直到磁盘,您必须考虑存储技术。

BUFSIZE 选项在这里非常有用,可以使应用程序 I/O 模式与存储特性保持一致。 最常见的情况是使用 RAID10 或 RAID5 格式,其中数据以特定大小的块分布在磁盘上 - 最好让 BUFSIZE 与此块大小或条带大小对齐(1:1 或倍数)。您应该向您的存储管理员咨询此大小 - 它需要 64kB 及其倍数。

对于像 RAID5 这样的奇偶校验 RAID 格式,数据分布在磁盘上并计算奇偶校验,因此最好始终将数据写入这样的块中,以便所有磁盘都得到更新并立即计算它们的奇偶校验(没有部分更新)。

因此,为简单起见,对于奇偶校验磁盘,您可以将 BUFSIZE 设置为条带大小乘以(阵列中的磁盘数减 1)。或者,您可以尝试将其与 BUFNO 结合以实现倍数。

关于 SAS I/O 的非常好的文档:Best Practices for Configuring your IO Subsystem for SAS 9 Applications

【讨论】:

    【解决方案3】:

    我认为 SAS 不会报告磁盘 I/O 使用情况。假设您在 Windows 中运行,您将不得不使用诸如性能监视器之类的程序(开始-> 运行-> 键入 'perfmon')或为了简单的视觉效果,您可以使用Process Explorer(类似于任务管理器,但显示磁盘/网络 IO 等更详细)。

    IMO 最小化 I/O 的最简单方法是(按努力奖励的顺序):

    1. 使用压缩
    2. (正如 Joe 建议的那样)最大限度地减少程序解析数据的次数(如果需要多个步骤,请考虑将视图用于中间步骤)
    3. 确保您的变量不超过所需的长度。删除所有不必要的变量。

    【讨论】:

    • 谢谢。我已经设置了压缩选项。然后我发现即使 obslen 相对于它的 BUFSIZE 很长,一页也可以包含更多观察结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 2018-06-26
    • 2019-01-30
    相关资源
    最近更新 更多