了解塊大小
我的問題針對 Postgres,但來自任何數據庫背景的答案可能就足夠了。
我的假設是否正確:
- 磁碟有固定的塊大小?
- RAID 控制器可以有不同的塊大小?一個 RAID 塊是否會拆分為多個真實磁碟塊?
- 文件系統也有一個獨立的塊大小,它又被分割成 RAID 塊大小?
- Postgres 使用固定的 8k 塊。到文件系統塊大小的映射如何在這裡發生?Postgres 8k 塊是否由文件系統批處理在一起?
設置系統時最好將所有塊都設置為 8k?還是設置不重要?我還想知道一些“錯誤”的塊大小設置是否會在崩潰時危及數據完整性?也許如果必須將 Postgres 8k 塊拆分為多個磁碟塊?
或者沒有任何東西被批處理在一起,因此我會因為定義的塊大小之間的每一次不匹配而失去磁碟空間?
磁碟扇區
磁碟具有固定的扇區大小,在某些現代磁碟上通常為 512 字節或 4096 字節;這些磁碟還將具有模擬 512 字節扇區的模式。磁碟將具有不同數量的扇區的磁軌;靠近磁碟外部的磁軌具有更多扇區,因為它們有更多空間容納給定的位密度。這樣可以更有效地使用磁碟空間;通常,一個磁軌在現代磁碟上會有 1,000 個 512 字節的扇區。
一些格式化結構還可以在 sectrs 中包含糾錯資訊,這體現在磁碟被低級格式化為 520 或 528 字節扇區。在這種情況下,該扇區仍有 512 字節的使用者數據。儘管 i5OS (IBM iSeries) 和各種 SAN 控制器支持,但 Windows 和 Linux 都不直接支持這一點。
通常扇區/磁頭/磁軌被翻譯成邏輯塊地址;由於向後兼容性的歷史問題,作業系統(特別是在 IDE 和 SATA 磁碟上)看到的幾何形狀(磁頭 x 扇區 x 磁軌)通常與其物理結構無關。
RAID 條帶大小
RAID 控制器可以為使用條帶化的陣列設置條帶大小(例如 RAID-5 或 RAID-10)。如果陣列有(例如)一個 128k 的條帶,則每個磁碟有 128k 的連續數據,然後下一組數據在下一個磁碟上。通常,您可以期望磁碟每轉一圈獲得大約一個條帶,因此條帶大小可能會影響某些工作負載的性能。
分區對齊
磁碟分區可能與 RAID 條帶完全對齊,也可能不完全對齊,如果未對齊,可能會因拆分讀取而導致性能下降。某些系統(例如 Windows 2008 伺服器)會自動配置分區以與磁碟捲條帶大小對齊。有些(例如 Windows 2003 伺服器)不會,您必須使用支持條帶對齊的分區實用程序來確保它們支持。
文件系統塊大小
文件系統將以一定大小的塊分配儲存塊。通常這是可配置的——例如 NTFS 將支持從 (IIRC) 4K 到 64K 的分配單元。分區和文件系統塊與 RAID 條帶未對齊可能會導致單個文件系統塊讀取產生多個磁碟訪問,如果文件系統塊與 RAID 條帶正確對齊,則只需要一次訪問。
數據庫塊大小
數據庫將以給定的塊大小在表或索引中分配空間。對於 SQL Server,這是 8K,而 8K 是許多系統的預設值。在某些系統(例如 Oracle)上,這是可配置的,而在 PostgreSQL 上,它是建構時選項。在大多數係統上,對錶的空間分配通常是在較大的塊中完成的,塊在這些塊中分配。
文件系統和數據分配塊的未對齊可能會為單個塊寫入生成多個 I/O,這可能會導致性能下降。
I/O 分塊
通常,DBMS 實際上會以多於一個塊的塊的形式執行其 I/O。例如,在 SQL Server 上,所有 I/O 都以 8 個塊的塊完成,總共 64k)。在 Oracle 上,這是可配置的。對 PostgreSQL 文件的隨意檢查並沒有揭示 PostgreSQL 是否這樣做的具體描述,所以我不確定它在這個平台上是如何工作的。
當 I/O 塊大於文件系統塊大小或與 RAID 條帶邊界未對齊時,從 DB 寫入磁碟可能會導致多個磁碟寫入,從而產生性能損失。
磁碟空間使用
不會浪費磁碟空間 - 數據庫 I/O 將使用磁碟上的一個或多個物理 I/O 操作來完成 - 但不正確地調整 I/O 會導致效率低下,從而降低數據庫速度。必須對齊的主要內容是:
- RAID 條帶和分區 - 分區應從 RAID 條帶邊界開始。
- 文件系統 I/O 分配和 RAID 條帶/分區邊界 - RAID 條帶邊界必須與文件系統分配單元對齊,並且應該是文件系統分配單元大小的倍數。
- 磁碟寫入大小和文件系統分配單元大小。數據庫 I/O 操作和文件系統 I/O 操作之間應該存在 1:1 的關係。
與其他情況相比,錯位不會產生更大的數據完整性問題。數據庫和文件系統有適當的機制來確保文件系統操作是原子的。通常,磁碟崩潰會導致數據失去,但不會導致數據完整性問題。