劉皓
(中國石化銷售有限公司 天津石油分公司,天津 300100)
淺析SAP系統的性能優化
劉皓
(中國石化銷售有限公司 天津石油分公司,天津 300100)
企業資源計劃軟件SAP系統雖然可大幅提高工作效率,但隨著系統長期運行,數據量增加,SAP系統性能將呈下降態勢。通過優化語句的編寫,可減少I/O操作、內存占用和CPU的負載應用;根據客戶當前應用的服務器數量,對SAP系統進程參數、數據庫參數進行調整,實現工作進程數量的優化。提出了加強日常監控,排除隱患的措施以及改善硬件網絡環境等合理化建議。
企業資源計劃 優化 數據庫 參數
企業資源計劃(ERP)宗旨是將企業的物料、設備、資金、人力、信息等資源通過信息系統進行科學合理的組織、管理和控制,以求收益、效率最佳化。企業管理解決方案(SAP)作為世界領先的ERP軟件在各行業得到廣泛應用,實現了物流、資金流、信息流的“三流合一”,同時隨著多個系統與SAP系統的集成,又大幅提高了數據采集速度和準確度,為經營決策贏得了時間,提高了效率。但隨著系統的長期運行,數據量的不斷增加以及系統設備運行帶來的老化問題,使該系統性能呈下降態勢。系統反應慢將影響銷售開單、生產運營和報表出具等正常的業務開展,如果情況進一步惡化,系統會出現超時、延時嚴重甚至停止服務的問題。
增加或者更換高配置設備往往是解決該系統性能問題行之有效的方法,但是該方法不但成本高,而且造成系統資源的大量浪費。因此,提高系統資源使用率成為了經濟高效的系統優化方案。
筆者從事多年SAP系統開發及系統管理工作,摸索和積累了一些提高系統資源使用率的經驗和方法。從實際工作出發,從以下4個方面對系統進行優化。
1.1 程序優化
在SAP系統上線后的一段時間內,由于系統數據量較小,ABAP程序的運行效率問題容易被忽視。但隨著數據量的不斷增大,如果取數方法不得當,將嚴重影響程序的運行效率。優化ABAP程序主要是優化數據取數的方法,可以減少I/O操作、內存占用和CPU的負載。以下推薦幾種做法:
1) 可以使用視圖來代替基本表的查詢以提高查詢效率。如果一定要使用基本表查詢,要盡可能多地使用表的索引作為“Where”分句的條件選項,盡可能讓程序只讀取一定范圍內的記錄。比如,在條件選擇界面,限定時間、公司代碼、工廠、成本中心等條件,減少被選擇的數據量;并且還可以使用二分法查詢,提高查詢內表數據速度,但注意要在使用之前應對內表進行排序。
2) 通過以下示例說明語句優化。
a) 使用“select... for all entries”的語句,不使用“loop... select single... endloop”的語句。前一種方式為數據—內表,后一種方式為數據—工作區—內表,很明顯前一種方式減少了一個過程,效率得到提高。
b) 盡量使用“loop... where... endloop.”語句,不使用“loop... if... endif. endloop.”語句,可有效減少循環數據的數量,降低程序運行時間。
c) 盡量使用“select a b c into table itab”這樣的語句。這個操作會將所有符合條件的數據一次性地讀進內表,這比在“select a b c into itab... endselect”的循環中添加數據到內表要快很多,同時比使用“select *into corresponding fields of table itab”這種字段自動匹配的查詢方法節省更多的時間和內存空間。
3) 在1條“select”語句中盡量減少多個數據表關聯取數。雖然1條“select”語句中多個數據表關聯取數看起來簡潔,但是會造成系統索引使用上的混亂,使應用效果適得其反;特別是對選擇條件多,但是這些條件數據都不完整的情況下,效率低的問題尤為明顯。從實際工作中的效果看,“inner join”的數據表關聯最好不要超過3個。對于一定要應用多表關聯的情況,可以將數據量不是過于龐大的數據表根據選擇條件放入內表中,使用“for all entries”的方式進行關聯,雖然會消耗一部分系統內存,但在一定程度上會提高系統索引的使用率。
4) 可以使用批量修改方式修改內表數據,盡量不使用逐行修改方式。同時1個內表的數據要寫入另1個內表時,也應使用批量增加方式,盡量不使用逐行增加方式。
5) 可以使用“sort”對數據排序而不使用“order by”。“order by”命令是在數據庫服務器上執行的,而“sort”語句是在應用服務器上執行的。同時可以使用一些聚合函數、“group by... having”,來進行計算和分組統計,也可以改善查詢的效率。在程序中應盡量使用諸如“SUM(SQL語句)”或者“COLLECT(ABAP語句)”,此舉可以有效地降低CPU的負載。
1.2 數據庫的索引優化
一般而言,若服務器配置較高,存儲速度較快,一般較小的表不必創建索引,另外對一些非業務應用或查詢很少的業務大表也不必創建索引。并不是創建越多的索引系統速度越快,反而創建較多索引會給數據庫的性能造成負面的影響,一般建議每個數據表的索引數量不超過7個。創建索引時應該注意以下幾個方面的內容:
1) 索引的字段應在程序的SQL語句的“Where”子句中出現,且盡可能多地出現在不同程序中,以便該索引能被多個程序復用。
2) 字段要有較多的區別值,即該字段在表中存在多種不同的值,不宜超過10種。而且字段要有較好的數據分布,即表記錄中該字段在不同值的分布比較均勻,不應在某值下密集分布,分布比例最好不超過30%。
3) 將具備較好的區別值和數據分布情況的字段放在組合索引的前列,做到索引字段順序按區別值和數據分布質量的優劣順序從前向后排列。
4) 通過控制索引字段數量以控制索引的二元高度。
需要注意的是,創建索引時會導致系統鎖表,即不能在創建索引的同時進行和表相關的業務操作,因而應該選擇業務不繁忙的時候進行索引創建,并對大的索引創建應充分預估所需時間;同時新建的索引如果沒有計算優化器統計信息,系統將不會使用該索引。因此,應在創建索引時使用“Compute statistics”選項進行索引的優化器統計信息計算,或在索引創建完成后另外計算索引的優化器統計信息。
2.1 SAP系統內存參數調整
關注SAP系統的內存使用情況,對于Nametab(NTAB),Program,Export/Import,Tables等內存緩沖區的Swaps值,如果存在每天增長量超過1萬次的情況應該關注,Swaps值特別異常時可根據情況修改相關參數后重啟SAP以改善Swaps值。建議每次調整值為原值的10%,逐步跟進調整。
SAP擴展內存是SAP內存管理系統的核心,em/initial_size_MB和em/max_size_MB決定了擴展內存的初始值大小和最大值;em/blocksize_KB決定了擴展內存的單位,開辟的擴展內存最大是8 192個該單位。64位操作系統建議1個單位為4 096 KB,表示最大能使用的擴展內存為32 GB,超過配額將使用Swaps開銷;em/address_space_MB為每個用戶進程的上下文所能使用的最大擴展內存,默認的缺省值為4 GB;em/global_area_MB除AIX和Windows系統外應該為255;ztta/rol_extension表示每個用戶使用的擴展內存,建議最大配額為2 GB。
這里特別指出,由于用戶使用SAP內存時,首先由進程開辟Roll area,通過共享內存的Roll Buffer進行Roll in和Roll out,當Roll Buffer超出配額時,將會請求操作系統的Roll file來開銷;故Roll memory初始分配不能分配過大,建議分配僅1Byte,如果配額不夠,由ztta/roll_area決定Roll area的大小。
2.2 SAP系統進程參數調整
SAP系統進程的類型有: 對話進程、后臺進程、打印進程、更新進程、隊列進程。
1) 可根據客戶當前的應用服務器的數量,進行工作進程數量的調優。
2) 在滿足現有業務需求的條件下,在服務器硬件資源沒有更新、升級的情況下,工作進程的總數要控制在最小值,此舉將節約現有的硬件資源。
3) 根據業務運行的具體情況動態分配進程數量。例如在白天由于線上操作較多,可將對話進程數量加大;而在晚間后臺作業增多,可以減少對話進程數量增加后臺作業數量。
2.3 加強日常監控排除隱患
1) 每天做好對話、打印、更新進程及后臺作業的監控工作,對處于錯誤狀態的對話、打印進程要及時重啟進程,對出錯的更新條目要與業務人員聯系,不能完善處理的要即時刪除,并及時處理“更新未激活”故障。
2) 每天做好ABAP DUMP和系統錯誤日志的檢查工作,系統出錯時會產生短轉儲,可通過系統的提示進入SAP的網站查看相應的Notes。在DUMP中可以精確定位錯誤,有助于解決問題。另外要對系統日志進行分析,對影響系統正常使用和功能實現的問題應找出原因并及時處理。
3) 每周進行SAP層面的系統性能監控,每月記錄系統性能統計信息,并且利用Solution manager管理平臺每周發布的Early watch報告對系統運行狀況進行針對性地分析和調整。
4) 關注系統負載均衡,如某臺應用服務器負載遠大于另1臺,原因可能是用戶直接指定了高負載服務器登錄致使資源緊張。使用組登錄方式,同時使用事務代碼SMLG設置應用服務器的可登錄數量,使系統資源均得到充分應用。另外,對于分屬不同應用模塊的用戶,可以設置某個應用服務器只能登錄某個特定模塊的用戶,而其他模塊的用戶不允許登錄到該服務器上的模式。因為不同的SAP應用模塊對系統資源有不同的需求,這樣做可根據需要動態地調節系統資源。
Oracle數據庫具有處理速度快、安全級別高、數據存儲量大等特點,在大部分企業中作為SAP系統的底層數據庫使用。以下將主要針對主流的Oracle數據庫的優化進行分析。
3.1 數據庫參數調整
內存參數的設置,直接關系到數據庫(DB)的性能;其他參數也會影響DB的正常運行。
內存參數主要調整共享池、緩沖區高速緩沖區、系統全局區(SGA)和程序全局區(PGA)。緩沖區高速緩存DB_CACHE_SIZE可設置為可用內存的40%~50%;db_block_buffers可設置為可用內存的40%~50%;共享池SHARED_POOL_SIZE可設置為可用內存的10%;PGA的PGA_AGGREGATE_TARGET可設置為可用內存的15%。
上述參數設置應根據系統運行的具體情況進行相應的調整。如數據緩沖區命中率低,可根據系統資源情況增加數據緩沖。如筆者曾遇到系統原數據庫命中率89%,db_block_buffers參數為5×104,經過嘗試將該參數調整為8×104,數據庫命中率上升為95%,系統效率得到提升。
另外還應注意OPEN_CURSORS,OPTIMIZER_MODE等幾個參數的設置。
3.2 調整Redo Log文件大小
發現數據日志切換頻率過高,則應調整在線Redo log文件大小,減少文件切換次數;增加回滾段組數,降低出現“快照過舊”現象的概率。Oracle推薦每20 min生成1個Redo log文件。筆者曾遇到系統出現ORA-1555的報錯日志,經過分析Redo log文件大小為20 MB,每小時生成23個文件,反應到應用上就是系統反應慢,運行效率低。筆者調整了Redo log文件大小,有效地降低了系統響應時間。
3.3 表和索引存儲質量的維護
1) 每周應至少執行1次SAP的自動數據庫表的統計信息更新,每3個月全部自動分析1次。
2) 確保表空間利用率在90%以下,對超過300 GB的表空間要確保表空間有超過20 GB的空閑空間。
3) 原則上數據庫每個表都要有索引;如發現丟失的和質量低于65%的索引應及時重建;對1 a以上未使用的索引應做刪除處理;對碎片嚴重的索引要在線重建,保障訪問量排行前20位數據表的索引存儲質量在65%以上。這些表的統計信息至少半年要更新1次。
4) 對部分訪問相當頻繁,數據插入量很大的表,如允許刪除,應及時重組該表以改善性能。
5) 調整DBA計劃日歷作業。建議每天執行對數據庫的統計信息檢查作業、更新作業和檢查數據庫作業,每周執行檢查擴展空間作業和清除日志作業。
3.4 優化性能差的程序SQL語句
通過對等待事件的監控,如執行事務代碼ST03或ST04,同時也可通過Early watch報告,可以很輕松地找到性能差的SQL語句和耗時的SQL語句。針對這些SQL語句進行優化,并創建有效率的索引,具體方法見對程序和數據庫索引優化部分的相關介紹。
3.5 數據庫硬盤的規劃設計
對數據庫硬盤的規劃設計進行優化,使得工作負載在硬盤上盡可能地平均分配,以避免當從硬盤中寫入和讀取的時候產生等待的情況。
3.6 做好鎖和隊列的監控
檢查是否有很長時間的鎖定沒有釋放,如有這種鎖條目應聯系相應用戶了解情況,但在做處理時需要謹慎,只有確認為非正常退出造成的,才能進行手工刪除。
1) 客戶端/服務器架構中不同層之間的網絡傳輸速度和數據吞吐量非常重要,它們會影響整個系統的性能表現,如果網絡存在瓶頸,將導致客戶操作緩慢。
2) 由于SAP架構要求絕大多數的數據交換都在應用層和數據庫層進行,通過優化明顯耗時、占資源的SQL語句可以減少這種交換。
3) 由于網絡連接可以通過局域網或者廣域網實現,因而在表示層和應用層之前的數據傳輸要盡可能少,同時盡可能減少與其他系統之間的接口,優化接口程序,進一步減少數據傳輸量。
SAP系統長時間地運行,設備的CPU、內存、硬盤等硬件設備不間斷地工作,硬件老化情況將不可避免地發生。同時隨著數據量的增加以及業務種類的不斷增加,硬件資源不足導致瓶頸出現,造成系統性能降低。所以必須時刻關注硬件設備運行狀況,了解系統負載的極限值,并針對需求添加硬件配件,另外還要及時對超期服役的設備進行更換,這樣不但可以有效降低硬件瓶頸,同時還可以規避設備老化帶來的故障隱患,保障系統安全運行。
[1] 托馬斯·施奈德.SAP性能優化指南[M].勾侃,譯.北京: 東方出版社,2006.
[2] 希格里德·哈格曼,藍·威爾.SAP R/3系統管理[M].黃兆森,譯.北京: 東方出版社,2006.
[3] 黃佳.SAP業務數據傳輸指南——圖靈SAP技術叢書[M].北京: 人民郵電出版社,2006.
[4] 黃驍儉,周越亭,尹捷.中小企業信息化與SAP系統實現/SAP管理實踐叢書[M].北京: 機械工業出版社,2004.
[5] 金圣俊.SAP ABAP開發從入門到精通[M].張鐘淑,譯.北京: 機械工業出版社,2013.
[6] 唐嘉,彭功濤,方玉鳳.SAP實用程序開發進階[M].北京: 北京希望電子出版社,2012.
[7] 黃佳.SAP程序設計[M].北京: 人民郵電出版社,2005.
[8] 王宏.實戰SAP程序開發——從實例學SAP ABAP編程[M].北京: 電子工業出版社,2006.
[9] 黃佳.SAP高級應用開發[M].北京: 人民郵電出版社,2008.
劉皓(1983—),男,天津人,2006年畢業于天津科技大學信息與計算科學專業,獲學士學位,現就職于中國石化銷售有限公司天津石油分公司,主要從事操作系統、數據庫、SAP系統及虛擬化平臺管理,任工程師。
TP273
B
1007-7324(2017)03-0080-04
稿件收到日期: 2017-01-14,修改稿收到日期: 2017-04-08。