通過數據庫評估存儲設備IO性能
---------Oracle11g IO校准功能介紹
前言
I/O子系統是ORACLE數據庫的一個重要組成部分,因為I/O操作是貫穿數據庫管理全過程,它操作的對象包括日志、表、索引、數據字典、以及一些排序、undo操作等等,每個數據庫讀取或者寫入磁盤上的數據,都會產生磁盤IO,可以這么說一個正常業務的數據庫系統,80%的性能消耗都與IO有關,相對於網絡、CPU、內存等其他硬件的迅猛發展,磁盤的讀寫速度的發展卻相對滯后,這也導致許多業務性能瓶頸集中在有限的磁盤IO上,一旦出現IO瓶頸導致的性能問題,表現為CPU有時候會花大部分的時間等待IO操作,我們把這種情況稱為IO密集性(I/O-bound)系統。
我們在處理ZLHIS業務系統性能問題的時候,大部分也是在處理IO性能問題,主要表現在三方面:
1、HIS系統是業務高密集系統,在業務高峰期會形成大量集中的並發操作,產生大量的I/O操作;
2、不規范的SQL語句導致的過度的磁盤訪問(如:全表掃描等);
3、由於硬件導致的存儲IO本身的性能問題;
上圖就是一個某客戶真實環境下I/O性能瓶頸的AWR性能報告,TOT5等待事件中,主要就是I/O類型的等待,在處理類似問題的時候,我們都先假定存儲的I/O性能是滿足我們的業務需求的,忽略存儲本身的性能問題,而着重解決1、2應用設計或者SQL代碼不規范導致的過度I/O讀取,但有時導致I/O性能的問題根本的原因恰恰就是存儲,遇到這種問題的時候,我們過去都是通過文件拷貝、復制讀寫都操作主觀的感受存儲的性能,或者找硬件商協助分析,前一種方式不便於我們從數據指標上給存儲性能予以定型,特別是在某些瞬時集中IO訪問出現瓶頸的存儲設備上給出充分的說服力,后一種方式如果遇到硬件商本身不配合,我們處理問題就非常的尷尬,這時候我們急需一種方式對夠自主的對存儲進行性能評估,給出評估性能指標以便對I/O性能進行量化,為問題的分析解決給出可靠的依據。
IO相關概念
在對存儲性能進行評估之前,我們有必要了解幾個關於IO的指標概念,只有對這幾個指標概念有了了解,我們才能客觀的評價一個存儲性能的好壞。
IOPS(I/OOperations Per Second):是用來計算I/O流中每個節點中每秒傳輸的數量,表示每秒進行讀寫(I/O)操作的次數,多用於評估衡量存儲隨機訪問的性能。IOPS通常對於小I/O,且傳輸I/O的數量比較大的情況下,是一個最主要的衡量指標。例如,典型的OLTP系統中,高的IOPS則意味相同時間內更多的數據庫事務可以被存儲系統處理。
IO響應時間(latency):指內核對磁盤發出一個讀或者寫的IO命令,到內核接收到回應的時間。
吞吐量(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
確保數據文件允許異步IO,可以通過下面的SQL語句確認:
COL NAME FORMAT A50
SELECT NAME,ASYNCH_IOFROM V$DATAFILE F,V$IOSTAT_FILE I
WHERE F.FILE#=I.FILE_NO
AND FILETYPE_NAME='Data File';
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也行,認為只是一塊磁盤。
下面是一個執行DBMS_RESOURCE_MANAGER.CALIBRATE_IO包的案例,語句非常簡單,如下:
SET SERVEROUTPUT ON
DECLARE
lat INTEGER;
iops INTEGER;
mbps INTEGER;
BEGIN
--DBMS_RESOURCE_MANAGER.CALIBRATE_IO (, <max_latency>, 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表查看校准結果,為了更好的理解I/O校准過程,我們拿台普通的台式機來進行下演示,看下是如何進行IO校准操作的。
通過v$io_calibration_status可以查看執行狀態,可以看到進程正在執行,如下
在操作系統的任務管理器的性能監控中可以看到,每個數據文件都產生大量的IO讀取,Oracle就是通過這種讀取操作來進行存儲性能的評估。
最后在DBA_RSRC_IO_CALIBRATE視圖中,可以查詢到本次IO校准的各個性能指標值如下,本次測試的存儲性能,每秒持續讀取數據塊請求的最大數量(max_iops)為60,每秒最大可讀取(max_mbps)為43mbps,單個進程每秒最大可讀取(max_pmbps)為39mbps,讀取數據塊請求出現有16次延遲
這里我們注意了同樣的IO校准執行2次,結果也會有所差異,不可能幾次執行結果100%相同,這是因為存儲性能涉及的因素非常多,比如當時存儲的繁忙狀態、溫度、IO請求等,這些都會對校准有細微的影響,但是總的范圍還是不會有太大的出入。
性能判斷
通過校准我們得到了一些指標,那么怎樣的存儲性能才是滿足業務需求的呢?嚴格意義上說,當然是IOPS越大,吞吐量越大越好,但是成本也會增加,因此實際情況下還是要根據用戶業務的實際情況判斷,合適就可以了。用戶的IO需求可以通過業務高峰期AWR報告進行查看,通過生成業務高峰期的AWR報告,查看報告中的other instance activity stats這部分內容獲取,以某用戶的AWR性能報告為例,重點關注這幾個指標[physical read total IOrequests],[ physical read total bytes],[ physical write total IO requests],[ physicalwrite total IO requests]每秒的值,因為我們IO校准也是以每秒為單位的統計。
我們可以計算出物理讀和寫每秒總的請求為70.74+80.62≈151次,物理讀和寫的每秒的大小為1.32+1.09≈2.41mbs=19.28mbps,有了這個參照,那我們存儲校准的最大IOPS就應該不能低於151,每秒的吞吐量也不能低於19.28mbps,如果IO校准接近或者小於這個值就證明存儲性能出現了嚴重的瓶頸,例如我們測試用的機器就無法滿足這個用戶的IO性能需求,需要提升性能以滿足業務的需要。