Memahami ukuran blok

11

Pertanyaan saya menargetkan Postgres, tetapi jawaban mungkin cukup bagus dari latar belakang basis data apa pun.

Apakah asumsi saya benar:

  • Disk memiliki ukuran blok tetap?
  • Pengontrol RAID dapat memiliki ukuran blok yang berbeda? Apakah satu blok RAID dipecah menjadi beberapa blok disk nyata?
  • Sistem file juga memiliki ukuran blok independen yang lagi-lagi dipecah menjadi ukuran blok RAID?
  • Postgres bekerja dengan blok 8k yang diperbaiki. Bagaimana pemetaan ke ukuran blok sistem file terjadi di sini? Apakah blok Postgres 8k digabungkan bersama oleh sistem file?

Saat menyiapkan sistem, apakah yang terbaik untuk memiliki semua blok pada 8k? Atau apakah pengaturannya tidak masalah? Saya juga bertanya-tanya apakah beberapa pengaturan ukuran blok yang "salah" dapat membahayakan integritas data jika terjadi kerusakan? Mungkin jika blok Postkg 8k harus dipecah menjadi beberapa blok disk?

Atau apakah tidak ada yang disatukan, dan karena itu saya kehilangan ruang disk dengan setiap ketidakcocokan antara ukuran blok yang ditentukan?

Franz Kafka
sumber

Jawaban:

16

Sektor Disk

Disk memiliki ukuran sektor tetap, biasanya 512 byte atau 4096 byte pada beberapa disk modern; disk ini juga akan memiliki mode di mana mereka meniru sektor 512 byte. Disk akan memiliki trek dengan jumlah sektor yang bervariasi; trek lebih dekat ke bagian luar disk memiliki lebih banyak sektor karena mereka memiliki lebih banyak ruang untuk kepadatan bit yang diberikan. Ini memungkinkan penggunaan ruang disk yang lebih efisien; biasanya sebuah trek akan memiliki sekitar 1.000 sektor 512 byte pada disk modern.

Beberapa struktur pemformatan juga dapat menyertakan informasi koreksi kesalahan dalam detik, yang memanifestasikan dirinya dalam disk yang diformat level rendah dengan sektor 520 atau 528 byte. Dalam hal ini sektor ini masih memiliki 512 byte data pengguna. Baik Windows maupun Linux tidak mendukung ini secara langsung, meskipun i5OS (IBM iSeries) dan berbagai pengontrol SAN melakukannya.

Biasanya sektor / kepala / trek diterjemahkan ke dalam alamat blok logis; karena masalah historis dengan kompatibilitas ke belakang, geometri (kepala x sektor x trek) dilihat oleh sistem operasi (terutama pada disk IDE dan SATA) biasanya tidak ada hubungannya dengan struktur fisiknya.

Ukuran garis RAID

Pengontrol RAID dapat memiliki ukuran stripe untuk array menggunakan striping (misalnya RAID-5 atau RAID-10). Jika array memiliki (untuk exmaple) 128k strip, setiap disk memiliki 128k data yang berdekatan, dan kemudian set data berikutnya adalah pada disk berikutnya. Biasanya Anda dapat memperoleh sekitar satu strip per putaran disk, sehingga ukuran strip dapat memengaruhi kinerja pada beban kerja tertentu.

Penyelarasan Partisi

Partisi disk mungkin atau mungkin tidak sejajar dengan garis RAID, dan dapat menyebabkan penurunan kinerja karena terbaca jika tidak selaras. Beberapa sistem (mis. Server Windows 2008) akan secara otomatis mengkonfigurasi partisi untuk menyelaraskan dengan ukuran garis volume disk. Beberapa (misalnya server Windows 2003) tidak akan, dan Anda harus menggunakan utilitas partisi yang mendukung penyelarasan stripe untuk memastikannya.

Ukuran Blok Sistem File

Sistem file akan mengalokasikan blok penyimpanan dalam potongan dengan ukuran tertentu. Secara umum ini dapat dikonfigurasi - misalnya NTFS akan mendukung unit alokasi dari (IIRC) 4K ke 64K. Ketidaksejajaran partisi dan blok sistem file ke garis-garis RAID dapat menyebabkan pembacaan blok sistem file tunggal untuk menghasilkan beberapa akses disk di mana hanya satu yang diperlukan jika blok sistem file disejajarkan dengan benar dengan garis-garis RAID.

Ukuran Blok Database

Basis data akan mengalokasikan ruang dalam tabel atau indeks dalam beberapa ukuran blok yang diberikan. Dalam kasus SQL Server ini adalah 8K, dan 8K adalah default pada banyak sistem. Pada beberapa sistem seperti Oracle, ini dapat dikonfigurasi, dan pada PostgreSQL ini adalah opsi build-time. Pada sebagian besar sistem, alokasi ruang untuk tabel biasanya dilakukan dalam chunk yang lebih besar, dengan blok yang dialokasikan di dalam chunk tersebut.

Ketidaksejajaran blok sistem file dan alokasi data dapat menghasilkan banyak I / O untuk penulisan blok tunggal, yang dapat mendorong penalti kinerja.

I / O Chunking

Biasanya DBMS benar-benar akan melakukan I / O dalam potongan lebih dari satu blok. Misalnya, pada SQL Server, semua I / O dilakukan dalam potongan 8 blok, total 64k). Pada Oracle ini dapat dikonfigurasi. Inspeksi kasual dari dokumen PostgreSQL tidak mengungkapkan deskripsi spesifik apakah PostgreSQL melakukan ini, jadi saya tidak yakin bagaimana cara kerjanya pada platform ini.

Ketika potongan I / O lebih besar dari ukuran blok sistem file atau tidak selaras dengan batas RAID stripe, penulisan disk dari DB dapat menyebabkan banyak penulisan disk, yang menghasilkan penalti kinerja.

Penggunaan ruang disk

Tidak ada ruang disk yang terbuang - database I / O akan menggunakan satu atau lebih operasi I / O fisik pada disk untuk menyelesaikan - tetapi I / O yang disetel secara salah dapat menghasilkan inefisiensi yang akan memperlambat basis data. Hal-hal utama yang harus selaras adalah:

  • Garis-garis dan partisi RAID - partisi harus dimulai pada batas garis RAID.

  • Alokasi Filesystem I / O dan batas raid / partisi raid - batas RAID stripe harus sejajar dengan unit alokasi sistem file, dan harus merupakan kelipatan dari ukuran unit alokasi sistem file.

  • Ukuran penulisan disk dan ukuran unit alokasi sistem file. Seharusnya ada hubungan 1: 1 antara operasi I / O basis data dan operasi sistem I / O sistem file.

Misalignment tidak menciptakan masalah integritas data yang lebih besar daripada yang seharusnya ada. Basis data dan sistem file memiliki mekanisme untuk memastikan operasi sistem file bersifat atomik. Umumnya disk crash akan mengakibatkan hilangnya data tetapi tidak masalah integritas data.

ConcernedOfTunbridgeWells
sumber
Jawaban yang sangat bagus Saya merasa tidak enak hanya bisa memberi Anda satu suara ...
Franz Kafka
hanya satu pertanyaan lagi: Apa sebenarnya maksud Anda ketika berbicara tentang menyelaraskan? Apakah itu kelipatan dari ukuran blok yang lebih kecil? Misalnya 32k sejajar dengan 8k? Atau adakah faktor lain yang terlibat?
Franz Kafka
@FranzKafka - Tidak, itu berarti ketika sesuatu (biasanya partisi disk) dimulai pada lokasi yang bukan kelipatan integral dari apa yang harus disejajarkan. Sebagai contoh, jika saya memiliki ukuran 128K RAID stripe dan partisi tidak dimulai pada kelipatan 128K dari 'blok 0' maka saya dapat memiliki pembacaan logis yang terbagi menjadi dua unit alokasi fisik, yang memerlukan dua operasi pembacaan, yang menyebabkan penalti kinerja.
ConcernedOfTunbridgeWells