IO問題往往是導致數據庫性能問題的重要原因。
數據庫的作用就是實現對數據的管理和查詢。任何一個數據庫系統,必然存在對數據的大量讀或者寫或者兩中操作都大量存在。
希望幫助大家在理解Oracle的讀寫操作機制的基礎上,靈活解決遇到的各種常見的IO問題。
— Oracle中IO的產生 —
由于內存的讀寫效率比磁盤的讀寫效率高萬倍,因此,為了降低IO wait,oracle會將數據cache在內存(Buffer Cache)中,對數據的讀寫盡量在內存中完成(直接路徑讀寫)。
當Buffer Cache中的數據緩存塊被修改過了,它就被標記為“臟”數據。根據LRU(Least Recently Used)算法,如果一個數據塊*近很少被使用,它就稱為“冷”數據塊。
進程DBWn(系統中可以存在多個DBW進程,n為序號)負責將“冷”的“臟”數據寫入數據文件中去(錯誤,是根據檢查點隊列)。
DBWn進程會在以下兩種情況下將“臟”數據寫入磁盤中去:
1.當服務進程掃描一定數量(閥值)的Buffer Cache后還沒有找到干凈、可重用的緩存塊后,它會通知DBWn進程將“臟”數據寫入文件中去,以釋放出空閑緩存;
2.當發生檢查點(Checkpoint)時。直接路徑讀,是直接把數據讀出來,并不想共享數據(對于批量數據讀寫)。
— IO系統的設計和配置 —
要控制好數據庫的整體IO性能,在規劃數據庫架構時就需要做好IO系統的設計和配置。例如,將對IO要求不同的文件放置在不同的存儲設備上;規劃數據文件的分布、均衡IO負擔等。
IO性能是直接和操作系統的硬件性能相關的。如果能利用操作系統的一些高級IO特性,或者采用更高速的磁盤設備,能大大提高IO性能。
我們知道,內存的讀寫效率比磁盤高近萬倍,因此Oracle在內存中開辟了一片區域,稱為Buffer Cache,使數據的讀寫盡量在Buffer Cache中完成。
同樣,在文件系統中,操作系統為了提高讀寫效率,也會為文件系統開辟一塊Buffer Cache用于讀寫數據的緩存。這樣,Oracle的數據會被緩存2次。
— 負載均衡及條帶化 —
當多個進程同時訪問一個磁盤時,會出現磁盤沖突。大多數磁盤系統都對訪問次數(每秒的IO操作)和數據傳輸率(每秒傳輸的數據量)有限制。
當達到這些限制時,后面要訪問磁盤的進程就需要等待,這時就是所謂的磁盤沖突。
避免磁盤沖突是優化IO性能的一個目標,這就需要將一個熱點磁盤上的IO訪問負載分擔到其他可用磁盤上,也就是IO負載均衡。在一些成熟的磁盤負載均衡技術出現之前,DBA需要了解/預測各系統的IO負載量,通過手工配置每個數據到不同存放位置以分擔IO負載來達到負載均衡的目的。
條帶化技術就是將數據分成很多小部分并把他們分別存儲到不同磁盤上的不同文件中去。這就能使多個進程同時訪問數據的多個不同部分而不會造成磁盤沖突。很多操作系統、磁盤設備供應商、各種第三方軟件都能做到條帶化。通過條帶化,DBA可以很輕松的做到IO負載均衡而無需去手工配置。
— RAID —
RAID的全稱是獨立磁盤冗余陣列(Redundant Array of Independent Disks)。它通過將多個相對比較便宜的磁盤組合起來,并相互連接,同時都連到一個或多個計算機上,以組成一個磁盤組,使其性能和容量達到或超過一個價格更昂貴的大型磁盤。RAID分為6級。
— SAN —
SAN(Storage Area Network,存儲區域網)是一個高速的子網,這個子網中的設備可以從你的主網卸載流量。通常SAN由RAID陣列連接光纖通道(Fibre Channel)組成,SAN和服務器和客戶機的數據通信通過SCSI命令而非TCP/IP,數據處理是“塊級”(block level)。
SAN通過特定的互連方式連接的若干臺存儲服務器組成一個單獨的數據網絡,提供企業級的數據存儲服務。 SAN是一種特殊的高速網絡,連接網絡服務器和諸如大磁盤陣列或備份磁帶庫的存儲設備,SAN置于LAN之下,而不涉及LAN。
利用SAN,不僅可以提供大容量的存儲數據,而且地域上可以分散,并緩解了大量數據傳輸對于局域網的影響。SAN的結構允許任何服務器連接到任何存儲陣列,不管數據置放在哪里,服務器都可直接存取所需的數據。
— NAS —
NAS是Network Attached Storage(網絡附加存儲)的簡稱。在NAS存儲結構中,存儲系統不再通過I/O總線附屬于某個服務器或客戶機,而直接通過網絡接口與網絡直接相連,由用戶通過網絡訪問。
它是連接到一個計算機網絡的文件層的數據存儲,它可以為不同網絡客戶端提供數據存儲服務。NAS的硬件與傳統的專用文件服務器相似。它們的不同點在于軟件端。
NAS中的操作系統和其他軟件只提供數據存儲、數據訪問功能,以及對這些功能的管理。與傳統以服務器為中心的存儲系統相比,數據不再通過服務器內存轉發,直接在客戶機和存儲設備間傳送,服務器僅起控制管理的作用。
— IO配置 —
在借助各種成熟的存儲技術的基礎上,合理配置系統的IO分布及系統IO配置能大量減少系統在生產運行中出現IO性能及相關問題的幾率。
當然,這些配置是我們在布置數據庫系統時初始建議,對于復雜的系統來說,很多配置(如一些存儲相關的參數)是需要根據系統的運行狀況進行調優的。
在數據庫系統中,如果某個文件或者某塊磁盤上存在遠遠高于其他文件或磁盤的大量IO訪問,我們就稱這個文件或磁盤為熱點文件/磁盤。
我們在做IO規劃時的一個重要目標就是要消除系統中熱點文件/磁盤的存在,使整個系統的IO負載相對平衡。
— 條帶化的設置 —
由于現在的存儲技術成熟、成本降低,大多數系統都用條帶化來實現系統的IO負載分擔。
如果操作系統有LVM(Logical Volume Manager邏輯卷管理器)軟件或者硬件條帶設備,我們就可以利用這些工具來分布IO負載。
當使用LVM或者硬件條帶時,決定因素是條帶深度(stripe depth)和條帶寬度(stripe width):
條帶深度指的是條帶的大小,也叫條帶單元;條帶寬度指的是條帶深度的產量或者一個條帶集中的驅動數。
需要根據系統的IO要求來合理的選擇這些數據。對于Oracle數據庫系統來數,比較合理的條帶深度是從256K到1M。下面分析影響條帶深度和條帶寬度的影響因素。
為了提高IO效率,我們要盡量使一次邏輯IO請求由一塊磁盤的一次物理IO請求。因而影響條帶的一個重要因素就是一次邏輯IO請求的大小。
此外,系統中IO的并發度不同我們對條帶的配置要求也不同。
例如,在高并發度且IO請求的大小都比較小的情況下,我們希望一塊磁盤能同時響應多個IO操作;
而在那些存在大IO請求的低并發度系統中,我們可能就需要多塊磁盤同時響應一個IO請求。無論是一個磁盤還是多個磁盤響應IO請求,我們的一個原則是讓一次邏輯IO能被一次處理完成。