如何测试SAS DATA Step中的IO吞吐量?

时间:2012-11-07 06:04:07

标签: performance optimization sas performance-testing

我想测试系统选项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会话中运行所有代码,我没有准确测量。我的问题是:我应该在单独的会话中测试每个代码运行时间吗?我是否需要选择更大的数据集?

3 个答案:

答案 0 :(得分:4)

如果数据集非常大,BUFSIZE通常只会在增加时提高性能,而且非常大,我的意思是除了有很多行外,还有一行中有很多数据。它的作用是确定每次传递读取的数据量;如果你有80字节的行,那么4096的bufsize甚至会读取大量的观察结果。另一方面,如果你有2056字节的行,那么4096页只包含一个观察点;所以你必须为每次观察读一个新页面,这很慢。

BUFNO没有任何价值,除非您使用的是SGIO,我记得通常不建议这样做。

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

一般来说,我会建议您更多地查看代码而不是系统选项以优化运行。只要您使用大量内存空间(尽可能在您的计算机上使用,至少几GB),您可能不会因为系统选项而花费太多。如果你可以取消一些数据传递,你将获得更多。

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

答案 1 :(得分:1)

谈到任何严肃的数据处理活动,我认为这总是发生在一些磁盘阵列上 - 这可能是很多东西,但至少它意味着有一些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

答案 2 :(得分:0)

我不相信SAS会报告磁盘I / O使用情况。假设您在Windows中运行,则必须使用诸如性能监视器(Start-> Run-> Type in'perfmon')之类的程序,或者对于简单的视觉效果,您可以使用Process Explorer(这就像任务管理器,但更详细地显示磁盘/网络IO等。)

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

  1. 使用压缩
  2. (正如Joe建议的那样)最小化程序解析数据的次数(如果需要多个步骤,请考虑使用临时步骤的视图)
  3. 确保您的变量不长于他们需要的变量。删除任何不必要的变量。