詳解如何通過資料庫評估存儲設備IO性能--Oracle11g IO校準功能

2019-10-14     波波說運維

概述

I/O子系統是ORACLE資料庫的一個重要組成部分,因為I/O操作是貫穿資料庫管理全過程,它操作的對象包括日誌、表、索引、數據字典、以及一些排序、undo操作等等,每個資料庫讀取或者寫入磁碟上的數據,都會產生磁碟IO,可以這麼說一個正常業務的資料庫系統,80%的性能消耗都與IO有關,相對於網絡、CPU、內存等其他硬體的迅猛發展,磁碟的讀寫速度的發展卻相對滯後,這也導致許多業務性能瓶頸集中在有限的磁碟IO上,一旦出現IO瓶頸導致的性能問題,表現為CPU有時候會花大部分的時間等待IO操作,我們把這種情況稱為IO密集性(I/O-bound)系統。


一、IO相關概念

在對存儲性能進行評估之前,我們先了解幾個關於IO的指標概念。

1、IOPS(I/OOperations Per Second):

是用來計算I/O流中每個節點中每秒傳輸的數量,表示每秒進行讀寫(I/O)操作的次數,多用於評估衡量存儲隨機訪問的性能。

IOPS通常對於小I/O,且傳輸I/O的數量比較大的情況下,是一個最主要的衡量指標。例如,典型的OLTP系統中,高的IOPS則意味相同時間內更多的資料庫事務可以被存儲系統處理。

2、IO響應時間(latency):

指內核對磁碟發出一個讀或者寫的IO命令,到內核接收到回應的時間。

3、吞吐量(Throughput):

計算每秒在I/O流中傳輸的數據總量。這個指標,在大多數的磁碟性能計算工具中都會顯示,最簡單的在Windows文件拷貝的時候,就會顯示MB/s,吞吐量衡量對於大I/O,特別是傳輸一定數據的時候最小化耗時非常有用,例如,備份數據的時候,在備份作業中,我們通常不會關心有多少I/O被存儲系統處理了,而是完成備份總數據的時間多少。

以上三個指標基本上能夠衡量存儲的IO性能,其中IOPS和吞吐量是越大越好,IO響應時間當然是越短越好。


二、IO校準

存儲整體性能主要由一系列關鍵組件層共同作用,包括HBA、Storage Switches、Storage Array和Physical Disks。這些對象共同合力,才能形成系統整體的IO能力有IO整體性能,通過Oracle的I/O校準功能,我們能夠評估存儲的整體性能,並判斷和確認I/O性能問題是否由資料庫或存儲系統造成的。不同於其他藉助外部I/O評估工具,Oracle的I/O校準功能的原理是資料庫隨機使用其數據文件訪問存儲,這樣產生的結果能更加真實的反映資料庫訪問存儲的實際性能,它可以幫助計算出當前存儲最大的IOPS和吞吐量,要使用這個特性必須滿足以下條件:

資料庫版本為11g
操作用戶必須要有sysdba權限
資料庫參數timed_statistics必須是true
必須允許IO異步,但用的是文件系統,可以通過設置FILESYSTEMIO_OPTIONS參數為setall

1、確保數據文件允許異步IO,可以通過下面的SQL語句確認:

COL NAME FORMAT A80
SELECT NAME,ASYNCH_IO FROM V$DATAFILE F,V$IOSTAT_FILE I WHERE F.FILE#=I.FILE_NO AND FILETYPE_NAME='Data File';
--啟動異步IO
show parameter disk_asynch_io
show parameter filesystemio_options
--當前使用的是文件系統,因此需要將filesystemio_options設置為asynch,才能開啟異步io:
ALTER SYSTEM SET FILESYSTEMIO_OPTIONS = ASYNCH SCOPE=SPFILE;
--重啟資料庫

2、I/O校準原理

I/O校準是通過調用Oracle內部dbms_resoure_manager.cakibrate_io包來獲取,其發出一系列I/O密集型的只讀工作量到資料庫文件,通過這些操作確定存儲的最大IOPS(每秒IO請求數)和存儲每秒能夠執行的吞吐量MBPS(兆位元組每秒I/O)。

I/O校準分為兩步:

第一步dbms_resource_manager.calibrate_io包按照數據文件塊大小隨機讀取的所有數據文件,通過持續的讀取操作能夠獲取存儲的最大IOPS(max_iops),同時輸出校準期間的平均延遲(actual_latency),也可以通過輸入參數max_latency指定目標延遲(指定的最大可容忍資料庫塊大小的IO請求延遲的毫秒數)。

第二步是通過dbms_resource_manager.calibrate_io包按照1M大小持續讀取所有數據文件,這一步主要是為了獲取最大吞吐量這個重要的指標。

如果用戶能夠提供的num_physical_disks輸入參數可以使得I/O校準運行更準確,這個參數它指定在資料庫中存儲系統的物理磁碟的近似數,如果不清楚就輸1也行,認為只是一塊磁碟。

3、校準案例

執行DBMS_RESOURCE_MANAGER.CALIBRATE_IO包:

SET SERVEROUTPUT ON
DECLARE
lat INTEGER;
iops INTEGER;
mbps INTEGER;
BEGIN
--DBMS_RESOURCE_MANAGER.CALIBRATE_IO (, , iops,mbps, lat);
DBMS_RESOURCE_MANAGER.CALIBRATE_IO (2, 10,iops, mbps, lat);
DBMS_OUTPUT.PUT_LINE ('max_iops = ' || iops);
DBMS_OUTPUT.PUT_LINE ('latency = ' || lat);
dbms_output.put_line('max_mbps = ' || mbps);
end;
/

校準的操作很簡單,但是在運行時需要注意以下幾點事項:

同一時間只能運行一個IO校準過程,千萬不要並行運行,如果同時運行,I/O校準將不能正常執行;
因過程執行對IO消耗非常大,請確保實例在空閒狀態下執行;
如果是RAC環境,要確保所有節點實例都是啟動狀態;
過程包中的num_physical_disks輸入參數是可選的。磁碟數不用太準確,輸入個近似值這樣可以使得校準更快、更準確。

最後在I/O校準過程中,你可以在v$io_calibration_status視圖查看校準狀態。在I/O校準成功後,可以在dba_rsrc_io_calibrate表查看校準結果.

通過v$io_calibration_status可以查看執行狀態,可以看到進程正在執行,如下

select * from v$io_calibration_status

在DBA_RSRC_IO_CALIBRATE視圖中,可以查詢到本次IO校準的各個性能指標值如下,本次測試的存儲性能,每秒持續讀取數據塊請求的最大數量(max_iops)為516,每秒最大可讀取(max_mbps)為135mbps,單個進程每秒最大可讀取(max_pmbps)為84mbps,讀取數據塊請求出現有5次延遲(latency)

select * from DBA_RSRC_IO_CALIBRATE;

注意:同樣的IO校準執行2次,結果也可能有差異,不可能幾次執行結果100%相同,這是因為存儲性能涉及的因素非常多,比如當時存儲的繁忙狀態、溫度、IO請求等,這些都會對校準有細微的影響,但是總的範圍還是不會有太大的出入。


三、性能判斷

通過校準我們得到了一些指標,那麼怎樣的存儲性能才是滿足業務需求的呢?嚴格意義上說,當然是IOPS越大,吞吐量越大越好,但是成本也會增加,因此實際情況下還是要根據用戶業務的實際情況判斷,合適就可以了。用戶的IO需求可以通過業務高峰期AWR報告進行查看,通過生成業務高峰期的AWR報告,查看報告中的other instance activity stats這部分內容獲取,以某用戶的AWR性能報告為例,重點關注這幾個指標[physical read total IO requests],[ physical read total bytes],[ physical write total IO requests],[ physicalwrite total IO requests]每秒的值,因為IO校準也是以每秒為單位的統計。

我們可以計算出物理讀和寫每秒總的請求為320.34+135.65≈456次,物理讀和寫的每秒的大小為64,892,462.30/1024/1024+11,867,839.59/1024/1024≈73.2mbs=585.6mbps,有了這個參照,那我們存儲校準的最大IOPS就應該不能低於456,每秒的吞吐量也不能低於585.6mbps,如果IO校準接近或者小於這個值就證明存儲性能出現了嚴重的瓶頸,例如我們測試用的機器就無法滿足這個用戶的IO性能需求,需要考慮提升性能以滿足業務的需要。


覺得有用的朋友多幫忙轉發哦!後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注下~

文章來源: https://twgreatdaily.com/zh-cn/A47QzW0BMH2_cNUgBv-_.html