某大型銀行電子渠道報表系統SSIS ETL優化報告
1. 問題分析
1.1 問題場景
在生產環境下,從電子渠道的多個交易系統通過SSIS(SQL Server Integration Services)進行數據服務平臺的ETL數據抽取時出現性能問題。在初期使用過程中出現了數據抽取速度過慢和系統資源占用過高的問題,除數據庫基礎架構建設存在優化可能外,SSIS參數未做面向生產環境硬件的優化也是一個重要原因,導致無法正常發揮SSIS真正性能。
1.2 原因分析
SSIS采用VS2005集成的開發環境,對數據采集的過程可進行可視化的定制開發,對數據量小的維度表(字典表)可同時並行抽取多個,以加快抽取速度,而對於大的事實表(業務表)可采用串行化抽取,對於數據量較大的表,采用串行化方式提取。
在分析開發人員開發的SSIS 包時,主要發現幾個與性能有關的參數值設置問題:
1.事實上在大數據量操作時,將大事務拆解成小事務是實踐證明的最高效的處理方式,如把數據提交放在一個很大的事務中,就會出現事務保持和回滾需要更多的資源和時間,並造成物理內存不足,且更容易出錯。
2.線程做為操作系統爭用CPU資源的系統對象,本身會花費一定的CPU時間進行線程切換與同步,所以線程數不應比物理CPU數量多太多,考慮到操作系統本身和其他運行中的軟件對CPU的占用,甚至要略少於物理CPU。
3.SSIS提供不檢查check約束和觸發器的快速加載方式(Fast load),可提高數據寫入的速度,對於不需要嚴格審查的數據導入比較適用。
1.3 參數優化建議
以下的章節提供了一些較為常用的SSIS執行性能優化的參數和建議,以供調優參考。由於目前我們缺少大數據量的模擬環境,建議在生產環境中調整參數時,循序漸進,逐步調整。
2. 優化包參數
2.1 MaxConcurrentExecutables
MaxConcurrentExecutables是包的屬性,它定義有多少個任務能被同時運行
如果值為-1的話就意味著同時可以運行的任務數為當前處理器的個數加上2
當超線程被打開的時候,它是邏輯處理器的個數
3. 控制流參數
3.1 MaxConcurrent
這是ForEachLoop組件的一個屬性,意味著有多少個循環實例能並行運行
4. 數據流參數
4.1 EngineThreads 屬性
這是數據流任務中的屬性,它定義有多少個工作線程在引擎調度時可以被使用。缺省值為5,可設置範圍為2-60之間,建議根據物理CUP個數調高到總CUP個數左右。如雙核8C的服務器,可設置為15-17個左右,具體應依實際對比測試性能而定。
註:多核處理器應當算作多個處理器。
4.2 DefaultBufferMaxRows屬性
SSIS數據流引擎可以通過計算一行數據的估計大小來調整其緩沖區大小的任務。 引擎將估計的單行大小與DefaultBufferMaxRows 值相乘以獲得緩沖區大小的初步工作值。可計算出單行數據大小,乘以每次提交數據的行數,得到適當的緩沖大小
1、如果該結果大於 DefaultBufferSize 值,引擎將減少行數。
2、如果該結果小於內部計算的最小緩沖區大小,引擎將增加行數。
3、如果結果在最小緩沖區大小和 DefaultBufferSize 值之間,引擎將調整緩沖區大小,以盡可能接近估計行大小乘以DefaultBufferMaxRows 值得出的結果。
4、默認緩沖區大小為 10 MB,最大緩沖區大小為 100 MB。 默認最大行數為 10,000。
4.3 DefaultBufferSize屬性
此參數應與DefaultBufferMaxRows配合使用。
4.4 BufferTempStoragePath屬性
為緩沖區數據指定臨時存儲位置。默認情況下,這些屬性包含 TEMP 和 TMP 環境變量的值。您可能希望指定不同或更快的硬盤驅動器上的其他文件夾來存放臨時文件,或將它們分布在多個驅動器上。可以指定多個目錄,並用分號來分隔這些目錄名。
4.5 BLOBTempStoragePath屬性
為包含二進制大型對象 (BLOB) 數據的列指定臨時存儲位置。默認情況下,這些屬性包含 TEMP 和 TMP 環境變量的值。您可能希望指定不同或更快的硬盤驅動器上的其他文件夾來存放臨時文件,或將它們分布在多個驅動器上。可以指定多個目錄,並用分號來分隔這些目錄名。
4.6 數據流目標參數設置建議
在選用OLEDB做為數據目標時,可將數據訪問模式可設置為:表或視圖-快速加載,每批行數可設為1000、5000、10000、20000、50000做分別的性能對比測試。
另外,也建議使用SQL Server目標做性能對比測試,一般情況下SQL Server目標性會比OLE DB目標更好。
5. 模擬測試
5.1 測試環境
服務器配置:IBM XSERIES_3755 Dual-Core AMD Opteron(tm) Processor 8212
CPU 2G X 4 Dual-Core 內存8G 存儲 本地SCSI
Windows 2003 SP2 R2企業版
OLTP數據庫:Sybase 12.5
OLAP數據庫:SQL Server2005企業版SP2
網絡:100M
5.2 模擬測試對比
批行數設置為1000時的幾組測試數據對比:
DefaultBufferMaxRows |
DefaultBufferSize |
EngineThreads |
已用時間 |
數據量 |
數據大小 |
10000 |
20971520 |
5 |
2125.53秒 |
2558374條 |
923560 KB |
10000 |
10485760 |
5 |
1818.7 秒 |
2558374條 |
923560 KB |
1000 |
10485760 |
6 |
220.891秒 |
2558374條 |
923560 KB |
1000 |
10485760 |
7 |
220.438秒 |
2558374條 |
923560 KB |
1000 |
10485760 |
8 |
236.047秒 |
2558374條 |
923560 KB |
最佳性能的測試指標為220秒(3分40秒),數據筆數255,8374條,數據約900M
5.3 結論
測試對比結果表明,設置適合的緩沖大小,采用較小的事務提交,並使用適當的線程數可數十倍地提高SSIS包的ETL任務執行速度。
數據流的相關性能參數:BLOBTempStoragePath、BufferTempStoragePath、DefaultBufferMaxRows、DefaultBufferSize、EngineThreads。目前主要用到了DefaultBufferMaxRows、DefaultBufferSize、EngineThreads。
OLEDB目標中使用快速加載,參數主要設置了 每批行數和最大插入大小。
另外參數 控制流/執行 屬性中的 MaxConcurrentExecutables ,對SSIS的性能也有些影響,這個屬性是設置包中並發執行的可執行文件的數目。目前測試驗證SSIS項目中沒有針對這個屬性做專門的設置,因為包中的可執行文件都是順序執行的,可執行文件之間都約束限制。
系統性能的調優是一個需要實地化進行工作的過程,硬件環境、網絡環境、軟件環境(如是否64位系統,分配給SQL Server的內存等),很多理論上的技巧和開發環境性的優化措施,在生產環境下未必是最優的。如果一個系統確實對性能要求很高,性能調優的工作,應該包含在項目計劃當中,在盡量接近生產環境配置和數據量級的環境下有計劃地提早開始,而不是上線後再臨時倉促展開。希望對大家的調優認識和工作能有所幫助。
某大型銀行電子渠道報表系統SSIS ETL優化報告