2012-11-07 55 views
3

我想測試系統選項bufnobufsize是否可以提高數據集的有效性。如何測試SAS DATA步驟中的IO吞吐量?

下面是測試代碼:

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會話中的所有代碼,所以我沒有準確測量。我的問題是:我應該在單獨的會話中測試每個代碼運行時間,並且是否需要選擇更大的數據集?

+0

需要使用更大的數據集,完全取決於數據集的大小,你會在生產環境中進行處理。 – JustinJDavies

回答

4

如果數據集非常大,BUFSIZE通常只會在性能提高的情況下提高性能,而如果數據集非常大,則意味着只有一行中有很多數據。它所做的是確定每次傳遞讀取多少數據;如果你有80字節的行,那麼一個4096的bufsize甚至會讀取大量的觀察值。另一方面,如果你有2056字節的行,那麼一個4096頁面將只包含一個觀察值;所以你必須爲每個觀察讀一個新的頁面,這很慢。

除非您使用的是SGIO,否則BUFNO是毫無價值的,我記得這通常不被推薦。

在最後問題的具體答案:沒有必要爲這些選項啓動新的SAS會話。如果你有一個更大的數據集,BUFSIZE可能會有一些額外的好處。

一般來說,我會建議您更多地查看代碼而不是系統選項來優化運行。只要你使用大容量的內存空間(儘可能在你的機器上,至少有幾GB),你可能不會因爲系統選項而得到太多的收穫。如果您可以取消一些數據傳遞,您將獲得更多。

一個例外是SORTSIZE - 將其設置爲您的MEMSIZE的1/3。如果你有2GB的MEMSIZE,那麼SORTSIZE應該是667M。這決定了您可以在內存中排序多大的數據集,並且由於某些原因通常非常小。

+0

感謝您的幫助。我有其他方法來提高IO吞吐量,並增強memsize的使用,因爲通過windows任務管理器,我發現SAS程序總是使用小於100M的內存大小。 MEMSIZE應該等於總可用內存大小嗎?現在我的電腦有32G內存。 – alen

+0

由於您不想使用所有內存或Windows會崩潰,因此MEMSIZE應該小於32G。 SAS在正常操作中不會佔用大量內存;但這並不能阻止它在需要時使用更多(高達MEMSIZE)。因此,如果它以100MB的速度懸掛,但需要對2GB數據集進行排序,並且您的MEMSIZE爲24GB,並且SORTSIZE爲8GB,則在對數據集進行排序時它將擴展到6GB。 – Joe

+0

另外,BUFSIZE僅影響寫入,而不是從現有數據集tune.dds_dep_pagesize16k讀取,其BUFSIZE在創建時已修復。對於整個測試,數據可能位於文件系統緩存中,所以I/O的大小影響不大。測試數據集大於可用RAM總數將顯示不同的結果。 – Nickolay

0

我不相信SAS會報告磁盤I/O使用情況。假設你在Windows下運行,你將不得不使用諸如性能監視器(開始 - >運行 - >輸入'perfmon')的程序,或者使用Process Explorer(這與任務管理器相似,但顯示磁盤/網絡IO等更詳細)。

IMO,以儘量減少I/O是(在努力,懸賞令)的最簡單的方法:

  1. 使用壓縮
  2. (喬建議)儘量減少次數程序解析通過數據(如果需要多個步驟,請考慮使用視圖進行臨時步驟)
  3. 確保您的變量不超過它們需要的長度。刪除任何不必要的變量
+0

謝謝。我已經設置了壓縮選項。然後我發現一個頁面可以包含更多的觀察值,即使obslen相對於它的BUFSIZE非常長。 – alen

1

談到任何嚴重的數據處理活動,我認爲這始終把一些磁盤陣列的地方 - 這可能是很多事情,但至少它意味着有一些RAID格式的多個磁盤。 因此,爲了將SAS I/O性能一直優化到磁盤,您必須考慮存儲技術。

這裏BUFSIZE選項對於將應用程序I/O模式與存儲特性對齊很有用。 最常見的情況是使用RAID10或RAID5格式,其中數據以特定大小的塊分佈在磁盤上 - 最好使BUFSIZE與該塊大小(條帶大小)一致(1:1或倍數) - 或條帶大小。你應該諮詢你的存儲管理員關於這個大小 - 它會像64kB和它的倍數。

使用奇偶校驗RAID格式(如RAID5)時,數據分散在磁盤上,並且計算奇偶校驗,所以它總是以這樣的數據塊寫入數據,以便所有磁盤都可以獲得更新並且一次性計算奇偶校驗更新)。

所以爲了簡單起見,對於奇偶校驗磁盤,您可以將BUFSIZE設置爲條帶大小乘以(磁盤數量減1)。或者,您可以嘗試將其與BUFNO結合以實現倍數。

關於SAS I/O非常好的文件:Best Practices for Configuring your IO Subsystem for SAS 9 Applications