Comprensione delle dimensioni dei blocchi


11

La mia domanda è indirizzata a Postgres, ma le risposte potrebbero essere abbastanza buone da qualsiasi sfondo del database.

I miei presupposti sono corretti:

  • I dischi hanno una dimensione di blocco fissa?
  • Il controller RAID può avere una dimensione di blocco diversa? Un blocco RAID viene suddiviso su più blocchi di dischi reali?
  • Il filesystem ha anche una dimensione di blocco indipendente che viene nuovamente suddivisa sulla dimensione del blocco RAID?
  • Postgres funziona con blocchi 8k fissi. Come avviene la mappatura sulla dimensione del blocco del filesystem qui? I blocchi di Postgres 8k sono raggruppati insieme dal filesystem?

Quando si configura un sistema, è meglio avere tutti i blocchi a 8k? O le impostazioni non contano davvero? Mi chiedevo anche se alcune impostazioni di dimensioni del blocco "errate" potessero mettere in pericolo l'integrità dei dati in caso di crash? Forse se un blocco Postgres 8k deve essere suddiviso su più blocchi disco?

O nulla viene messo insieme in batch, e quindi perdo spazio su disco ad ogni discrepanza tra le dimensioni dei blocchi definite?

Risposte:


16

Settori del disco

Un disco ha una dimensione di settore fissa, normalmente 512 byte o 4096 byte su alcuni dischi moderni; questi dischi avranno anche una modalità in cui emulano settori a 512 byte. Il disco avrà tracce con un numero variabile di settori; le tracce più vicine all'esterno del disco hanno più settori in quanto hanno più spazio per una data densità di bit. Ciò consente un utilizzo più efficiente dello spazio su disco; in genere una traccia avrà qualcosa come 1.000 settori da 512 byte su un disco moderno.

Alcune strutture di formattazione possono anche includere informazioni sulla correzione degli errori nei secotrs, che si manifestano nei dischi formattati a basso livello con settori a 520 o 528 byte. In questo caso il settore ha ancora 512 byte di dati utente. Né Windows né Linux lo supportano direttamente, anche se i5OS (IBM iSeries) e vari controller SAN lo fanno.

Normalmente il settore / head / track viene tradotto in un indirizzo di blocco logico; a causa di problemi storici di compatibilità con le versioni precedenti, la geometria (teste x settori x tracce) vista dal sistema operativo (in particolare sui dischi IDE e SATA) normalmente ha poco a che fare con la sua struttura fisica.

Dimensione della striscia RAID

Un controller RAID può avere una dimensione di striping per un array usando lo striping (ad esempio RAID-5 o RAID-10). Se l'array ha (per esempio) una striscia da 128k, ogni disco ha 128k di dati contigui e quindi il prossimo set di dati si trova sul disco successivo. Normalmente ci si può aspettare di ottenere circa uno stripe per giro del disco, quindi la dimensione dello striping può influire sulle prestazioni su determinati carichi di lavoro.

Allineamento delle partizioni

Una partizione del disco può o meno allinearsi esattamente con una striscia RAID e può causare un peggioramento delle prestazioni a causa delle letture divise se non è allineata. Alcuni sistemi (ad esempio il server Windows 2008) configureranno automaticamente le partizioni per allinearle alle dimensioni della striscia del volume del disco. Alcuni (ad es. Server Windows 2003) non lo faranno e devi usare un'utilità di partizione che supporti l'allineamento delle strisce per assicurarti che lo facciano.

Dimensione blocco file system

Il file system assegnerà blocchi di archiviazione in blocchi di una determinata dimensione. Generalmente questo è configurabile, ad esempio NTFS supporterà unità di allocazione da (IIRC) da 4K a 64K. Il disallineamento di partizioni e blocchi del file system alle strisce RAID può causare la lettura di un singolo blocco del file system in modo da generare più accessi al disco in cui ne sarebbe necessario solo uno se i blocchi del file system fossero allineati correttamente con le strisce RAID.

Dimensione blocco database

Il database allocherà lo spazio in una tabella o indice in una determinata dimensione di blocco. Nel caso di SQL Server questo è 8K e 8K è l'impostazione predefinita su molti sistemi. Su alcuni sistemi come Oracle, questo è configurabile e su PostgreSQL è un'opzione di build-time. Sulla maggior parte dei sistemi, l'allocazione dello spazio alle tabelle viene normalmente eseguita in blocchi più grandi, con blocchi allocati all'interno di tali blocchi.

Il disallineamento del file system e dei blocchi di allocazione dei dati può generare più I / O per una singola scrittura del blocco, il che può determinare una penalità di prestazione.

I / O Chunking

Normalmente un DBMS eseguirà effettivamente il suo I / O in blocchi di più di un blocco. Ad esempio, su SQL Server, tutto l'I / O viene eseguito in blocchi di 8 blocchi, 64k in totale). Su Oracle questo è configurabile. L'ispezione casuale dei documenti PostgreSQL non rivela una descrizione specifica del fatto che PostgreSQL faccia questo, quindi non sono sicuro di come funzioni su questa piattaforma.

Quando il blocco I / O più grande della dimensione del blocco del file system o è disallineato con i limiti dello stripe RAID, una scrittura su disco dal DB può causare scritture su disco multiple, il che genera una penalità delle prestazioni.

Utilizzo dello spazio su disco

Non viene sprecato spazio su disco - il completamento dell'I / O del database utilizzerà una o più operazioni di I / O fisico sul disco per il completamento - ma l'I / O erroneamente ottimizzato può generare inefficienze che rallenteranno il database. Le cose principali che devono essere allineate sono:

  • Strisce e partizioni RAID: la partizione deve iniziare su un limite di strisce RAID.

  • Allocazione I / O del filesystem e limiti della partizione / striscia raid: un limite della striscia RAID deve allinearsi con un'unità di allocazione del filesystem e deve essere un multiplo della dimensione dell'unità di allocazione del filesystem.

  • Dimensione di scrittura del disco e dimensione dell'unità di allocazione del filesystem. Dovrebbe esserci una relazione 1: 1 tra le operazioni di I / O del database e le operazioni di I / O del filesystem.

Il disallineamento non crea un problema di integrità dei dati maggiore di quanto sarebbe altrimenti presente. Il database e il file system dispongono di meccanismi per garantire che le opzioni del file system siano atomiche. Generalmente un arresto del disco comporterà la perdita di dati ma non problemi di integrità dei dati.


Risposta molto bella. Mi sento male solo poterti dare un voto ...
Franz Kafka,

solo un'altra domanda: cosa intendi esattamente quando parli di allineamento? È un multiplo della dimensione del blocco più piccolo? Ad esempio 32k è allineato a 8k? O ci sono altri fattori coinvolti?
Franz Kafka,

@FranzKafka - No, significa quando qualcosa (in genere una partizione del disco) inizia in una posizione che non è un multiplo integrale di ciò con cui deve allinearsi. Ad esempio, se ho una dimensione di striping RAID da 128 KB e la partizione non si avvia su un multiplo di 128 KB dal 'blocco 0', allora posso avere letture logiche che si dividono tra due unità di allocazione fisica, che richiede due operazioni di lettura, causando un penalità di prestazione.
Preoccupato di
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.