- Oracle Exadata性能優化
- 石云華 陳浩 饒冰
- 3145字
- 2020-05-21 18:00:33
1.7 診斷智能掃描性能問題
當Exadata的智能掃描出現性能問題時,最主要的表現就是與智能掃描相關的等待事件的平均延時變長。例如cell table smart scan和cell index smart scan等待事件,正常情況下這類等待事件的平均延時應該在2ms以下,當智能掃描出現性能問題時,這類等待事件的平均延時可能在十幾毫秒甚至幾十毫秒。
如何評判一個數據庫系統的智能掃描是否出現了性能問題,最簡單的方法是查看AWR性能報告或AWR數據庫全局性能報告,如圖1.12所示。

圖1.12 查看AWR性能報告或AWR數據庫全局性能報告
1.7.1 智能掃描性能問題常見原因
當一個數據庫系統的智能掃描出現了性能問題,通常可能是由以下原因導致的。
1.存儲索引使用情況不理想
后面會有單獨的章節來詳細介紹存儲索引特性,這里只簡單提及存儲索引的主要作用是減少IO掃描量。如果存儲索引的效率比較高,則可以大大減少IO掃描量;而相同的SQL語句,如果存儲索引的效率不高,則需要掃描更多的IO。即使進行智能掃描,存儲節點的IO掃描仍然是不可避免的。因此,存儲索引的效率高,則智能掃描的效率高;反之,存儲索引的效率低,則智能掃描的效率自然也會低。
2.存儲節點設置了Quarantine(隔離區),導致沒有過濾功能
Quarantine可以阻止某些SQL語句執行智能掃描操作,這減少了存儲軟件崩潰的可能性,提高了存儲的高可用性。下面通過示例演示針對某條SQL語句設置Quarantine時,對智能掃描的影響,見代碼清單1.26。
代碼清單1.26 Quarantine阻止智能掃描操作



代碼清單1.26執行了一條SQL語句,并獲取到該SQL語句的SQL_ID為9htmw8y2q7rx5。在第一次執行時,該SQL語句進行了智能掃描。然后單獨對該SQL_ID設置了Quarantine,再次執行該SQL語句,發現Smart IO not used due to SQL Step or DB Quarantine和Storage index disabled due to predicate disk past等指標值都增加了。這說明該SQL語句在第二次執行時沒有使用智能IO,原因就是對該SQL語句設置了Quarantine。
同樣,可以看出v$mystat視圖中cell physical IO interconnect bytes和cell physical IO bytes eligible for predicate offload指標值相同。這說明該SQL語句適合進行智能掃描,但最終還是沒有發生智能掃描,也即沒有節省任何的IO,因為該SQL語句設置了Quarantine,導致該SQL語句所涉及的所有數據塊都無法通過智能掃描的方式傳輸給數據庫服務器,而只能以Passthru模式將所有數據塊傳輸給數據庫服務器,在存儲節點無法進行數據過濾操作。
3.由于時區升級而導致沒有過濾功能
當數據庫的時區處于升級模式或者不一致模式時,從計算節點向存儲節點發出的IO將不會使用智能掃描,而是使用傳統的IO傳輸方式,這將導致存儲節點將所有的數據塊發送到數據庫所在的計算節點,而不是將合適的數據記錄傳輸到計算節點。
可以在計算節點執行命令來檢查數據庫的時區升級狀態是否設置為正常值,見代碼清單1.27。
代碼清單1.27 檢查數據庫的時區升級狀態是否正常

Oracle數據庫的時區不應該長期處于升級狀態。如果存在這種情況,可參考MOS文檔Exadata:RDS Performance Degrades when Database is in Timezone Upgrade Mode(Doc ID 1583297.1)來處理時區問題,具體命令如下。

當數據庫的sys.database_properties表中DST_UPGRADE_STATE屬性值為NONE時,表示時區問題已經修復。
除了執行代碼清單1.27中的腳本來檢查數據庫是否出現時區問題,還可以通過檢查數據字典的方式來確認數據庫目前是否存在時區問題,見代碼清單1.28。
代碼清單1.28 通過數據字典檢查數據庫的時區升級狀態是否正常

通過v$sysstat性能視圖中的cell num smart IO sessions using passthru mode due to timezone可以評估整個數據庫由于時區問題而導致SQL語句無法進行智能掃描的次數,該參數值應該為0。同樣,也可以使用v$mystat性能視圖來查看當前會話是否存在由于時區問題而導致SQL語句無法進行智能掃描。
4.由于存儲節點的CPU能力達到極限
數據庫節點如果大量地使用智能掃描,把負載轉移到存儲節點一端,則可能導致存儲節點的CPU負載過高。當存儲節點發現CPU的占用率過高時,就會對一部分原本使用智能掃描的SQL語句不使用智能掃描,而直接將相應的數據塊返回給計算節點,來緩解存儲節點的CPU壓力。等到存儲節點的CPU負載降下來,則相應的SQL語句會再次使用智能掃描,這個特性稱為“反向卸載”。
這個“反向卸載”的閾值是通過存儲節點的隱含參數_cell_mpp_threshold來控制的,默認值為90,也即當存儲節點的CPU占用率超過90%時,存儲節點就不會使用智能掃描進行過濾,而是直接將相應的數據塊返回給計算節點。查看存儲節點的隱含參數_cell_mpp_threshold當前設置的值,具體命令如下。

由于一些Bug的存在,在某些情況下,可能需要手動關閉這一特性。這個特性由數據庫層面的隱含參數_kcfis_cell_passthru_fromcpu_enabled進行控制,默認值為true,代表開啟“反向卸載”;如果設置為false,則表示關閉“反向卸載”。如果打算在會話級別關閉“反向卸載”特性,代碼如下。

5.由于存儲節點的IO處理能力達到極限
有一個觀點需要再次強調,那就是智能掃描僅僅是減少了IO的傳輸量,它仍然需要進行大量的IO掃描(除非存儲索引特性生效)。如果Exadata上的業務系統IO訪問繁忙,則進行大量的智能掃描同樣有可能導致存儲節點的IO處理能力達到極限。
判斷存儲節點的IO處理能力是否達到極限,可以查看存儲節點的OSWather或ExaWatcher收集的資源使用信息,或直接調用iostat命令查看存儲節點的磁盤使用情況(無法在計算節點上調用iostat命令查看存儲節點的磁盤使用情況)。
6.由于存儲節點的Flash閃存使用不理想
在老版本的存儲軟件中,智能掃描操作訪問的數據塊不會緩存到存儲節點的FlashCache中(除非對表對象設置了keep屬性),這就可能導致Flash閃存資源沒有得到有效的利用,而底層的機械硬盤訪問非常頻繁,從而導致智能掃描的性能出現問題。
1.7.2 智能掃描性能問題診斷工具
如果智能掃描出現性能問題,可以通過AWR性能報告、數據庫性能視圖(v$sysstat或v$cell_state)和OSWather等工具來診斷原因。
1.AWR性能報告
AWR性能報告是Oracle數據庫性能分析工具,從報告中的一些性能指標可以看出智能掃描出現性能問題的原因。
下面簡要說明一些性能指標,如表1.6所示。
表1.6 智能掃描涉及的模塊及說明

2.v$sysstat性能視圖
v$sysstat性能視圖提供了系統相關的統計信息,可以幫助診斷沒有進行智能掃描或沒有利用上存儲索引的原因,具體見代碼清單1.29。
代碼清單1.29 v$sysstat性能視圖提供智能掃描相關的統計信息

下面對v$sysstat性能視圖中提供的一些性能指標進行簡要說明,如表1.7所示。
表1.7 v$sysstat性能視圖性能指標說明

3.v$cell_state性能視圖
v$cell_state性能視圖提供了整個集群中所有存儲節點的統計信息,可以幫助診斷沒有進行智能掃描或沒有利用上存儲索引的原因,具體見代碼清單1.30。
代碼清單1.30 v$cell_state性能視圖提供整個集群中所有存儲節點的統計信息

從v$cell_state視圖中可以看到9個方面的統計信息,具體解釋如下。
■ RCVPORT:包含有關網絡接收流量的詳細信息。
■ SENDPORT:包含有關網絡發送流量的詳細信息。
■ PREDIO:包含有關Exadata如何處理Smart Scan的信息。
■ NPHYSDISKS:列出每個存儲節點中物理磁盤的詳細信息。
■ CELL:列出每個存儲節點相關的性能信息,類似于cellsrvstat。
■ THREAD:列出有關CELLSRV服務工作線程的信息。
■ PHASESTAT:列出有關Smart Scan中各階段的信息。
■ CAPABILITY:列出存儲軟件的各種功能。
■ LOCK:分解存儲節點中每種對象類型的mutex等待。
下面對v$cell_state性能視圖中提供的一些性能指標進行簡要說明,如表1.8所示。
表1.8 v$cell_state性能視圖性能指標說明

v$cell_state視圖中的STATISTICS_VALUE字段是CLOB數據類型,但該字段中存儲的內容其實是按照XML格式存儲的,當需要訪問STATISTICS_VALUE字段的內容時,可以對該字段進行XML轉換,代碼如下。

以上輸出只展示了一小部分結果集,在后面的示例中,將以這一小部分結果集來進一步展示如何格式化XML文本的內容輸出。
如果需要訪問STATISTICS_VALUE字段中/cell_stats/stats屬性為network_directory的元素,且將XML格式化成數據庫的表記錄格式輸出,代碼如下。

通過對比可以看出,需要的內容已經完全格式化成數據庫的表記錄格式輸出,便于查看。
如果需要訪問STATISTICS_VALUE字段中/cell_stats/stats屬性為network_directory的元素的下一層——stat中send_ports_hwm的元素的詳細信息,代碼如下。

4.cellsrvstat工具
存儲軟件從11.2.2.3版本開始,在Exadata的存儲節點上自帶了一個名為cellsrvstat的工具。利用該工具提供的運行時刻性能統計數據,可以了解整個存儲節點的運行情況。cellsrvstat工具的語法如下。

下面對cellsrvstat工具中常用的各項參數進行說明,如表1.9所示。
表1.9 cellsrvstat工具常用參數進行說明

如果指定table選項,則只會顯示增量信息,而不會顯示累積信息,見代碼清單1.31。
代碼清單1.31 cellsrvstat工具展示性能指標

相同的命令,如果指定了table選項,只顯示實時的增量信息;如果不指定table選項,則還會顯示該指標的累積信息。
- AngularJS入門與進階
- Git高手之路
- Spring實戰(第5版)
- Modular Programming in Java 9
- 從0到1:Python數據分析
- 數據結構習題解析與實驗指導
- Mastering Android Development with Kotlin
- AppInventor實踐教程:Android智能應用開發前傳
- Java系統化項目開發教程
- 新一代SDN:VMware NSX 網絡原理與實踐
- 自學Python:編程基礎、科學計算及數據分析(第2版)
- JavaWeb從入門到精通(視頻實戰版)
- JavaScript Unit Testing
- ASP.NET Core 2 High Performance(Second Edition)
- Cinder:Begin Creative Coding