Firebird 2.1 ve üzeri sürümlerde alan tahsisi
Vlad Khorsun, 20-EKİM-2010
Firebird, başlangıcından bu yana, veritabanı dosyası/dosyaları için disk alanı tahsis etme kurallarına sahip değildi. Yeni tahsis edilen sayfaları, «dikkatli yazma» stratejisine hizmet eden sayfalar arasındaki bağımlılıklar nedeniyle belirlenmemiş bir sırada yazar.
Bu yaklaşım çok basittir ancak bazı dezavantajları vardır:
• Yazma sırasının belirlenmemiş olması nedeniyle, yeni tahsis edilen bir sayfanın yazılması gerektiğinde ancak disk alanı tükendiği için yazılamadığı durumlarda sayfa önbelleğinde çok sayıda kirli sayfa bulunabilir. Bu gibi durumlarda, yöneticiler disk alanı açmadan önce veritabanını kapatmayı tercih ettikleri için genellikle diğer tüm kirli sayfalar kaybolur. Bu, ciddi bozulmalara yol açar.
• Disk alanını nispeten küçük parçalar halinde tahsis etmek, dosya sistemi düzeyinde önemli dosya parçalanmasına yol açabilir ve büyük taramaların (örneğin yedekleme sırasında) performansını düşürebilir.
Firebird, yeni ODS 11.1’i kullanarak, disk alanı tükenmesi koşullarında bozulmaları önlemek ve dosya sistemine parçalanmayı önleme şansı vermek için disk alanı tahsis algoritmasını değiştirir. Bu değişiklikler aşağıda açıklanmıştır.
a) Yeni tahsis edilen her sayfa, motora geri dönmeden önce hemen diske yazılır. Sayfa yazılamazsa tahsis gerçekleşmez, PIP biti temizlenmez ve uygun G/Ç hatası oluşturulur. Bu hata bozulmalara yol açamaz çünkü önbellekteki tüm kirli sayfaların disk alanı tahsis edilmiş olduğu ve güvenle yazılabileceği garantisine sahibiz.
Bu değişiklik, eski davranışa kıyasla yeni tahsis edilen her sayfa için ek bir yazma işlemi yapar. Bu nedenle, veritabanı dosyası büyümesi sırasında performans kaybı beklenir. Bu kaybı azaltmak için Firebird, yeni tahsis edilen sayfaların yazımlarını seferde 128KB’ye kadar gruplar ve PIP başlığında «başlatılan» sayfaların sayısını izler.
Not: Yeni tahsis edilen bir sayfa, yalnızca bu sayfa ilk kez tahsis ediliyorsa diske iki kez yazılır. Yani, sayfa tahsis edilip serbest bırakıldıysa ve tekrar tahsis edildiyse, ikinci tahsiste iki kez yazılmaz.
b) Dosya parçalanmasını önlemek için Firebird, disk alanını nispeten büyük parçalar halinde önceden tahsis etmek üzere uygun dosya sistemi API’sini kullandı. Şu anda böyle bir API yalnızca Windows’ta mevcuttur, ancak yakın zamanda Linux API’sine eklenmiştir ve gelecekte ext2 gibi popüler dosya sistemlerinde de uygulanabilir. Bu nedenle, bu özellik şu anda yalnızca Firebird’in Windows sürümlerinde uygulanmaktadır ve gelecekte Linux sürümlerinde de uygulanabilir.
Disk alanı ön tahsisi üzerinde daha iyi kontrol için Firebird.conf’a yeni bir ayar eklenmiştir: DatabaseGrowthIncrement. Bu, ön tahsis parçası boyutunun bayt cinsinden üst sınırıdır. Varsayılan değer 128MB’dir. Motor daha fazla disk alanına ihtiyaç duyduğunda, zaten tahsis edilmiş alanın 1/16’sını tahsis eder, ancak 128KB’den az ve DatabaseGrowthIncrement değerinden fazla olmaz. DatabaseGrowthIncrement sıfır olarak ayarlanırsa ön tahsis devre dışı bırakılır. Veritabanı gölge dosyaları için alan önceden tahsis edilmez.
Ayrıca, veritabanı için «No reserve» seçeneği ayarlanmışsa ön tahsis devre dışı bırakılır.
Not: Ön tahsis ayrıca disk alanı tükenmesi durumunda bozulmaları önlemeye yardımcı olur - bu durumda, yönetici disk alanı açana kadar veritabanının çalışması için yeterli önceden tahsis edilmiş alana sahip olma ihtimali yüksektir.
Yazar: Vlad Khorsun,