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