Tato stránka byla strojově přeložena. Přečtěte si anglický originál. English

Knihovna IBSurgeon

Alokace prostoru ve Firebird 2.1 a vyšších

Vlad Khorsun, 20-OCT-2010

Od samého začátku neměl Firebird žádná pravidla pro to, jak alokovat místo na disku pro databázové soubory. Jednoduše zapisuje nově alokované stránky v neurčeném pořadí (kvůli závislostem mezi stránkami, aby byla zachována strategie „opatrného zápisu“).

Tento přístup je velmi jednoduchý, ale má některé nevýhody:

• kvůli neurčenému pořadí zápisů může nastat situace, kdy stránková cache obsahuje mnoho špinavých stránek v okamžiku, kdy musí být zapsána nově alokovaná stránka, ale nelze to kvůli nedostatku místa na disku. V takových případech jsou často všechny ostatní špinavé stránky ztraceny, protože administrátoři raději vypnou databázi, než aby uvolnili místo na disku. To vede k vážnému poškození.

• alokace místa na disku v relativně malých blocích může vést k výrazné fragmentaci souborů na úrovni souborového systému a snižovat výkon při velkých skenech (například během zálohování).

S novým ODS 11.1 Firebird mění svůj algoritmus alokace místa na disku, aby se vyhnul poškození při nedostatku místa na disku a aby dal souborovému systému šanci vyhnout se fragmentaci. Tyto změny jsou popsány níže.

a) Každá nově alokovaná stránka je okamžitě zapsána na disk, než se vrátí zpět enginu. Pokud stránku nelze zapsat, alokace se neprovede, bit PIP se nevymaže a je vyvolána příslušná I/O chyba. Tato chyba nemůže vést k poškození, protože máme záruku, že všechny špinavé stránky v cache mají alokované místo na disku a mohou být bezpečně zapsány.

Tato změna znamená jeden dodatečný zápis každé nově alokované stránky ve srovnání se starým chováním. Proto se očekává snížení výkonu během růstu databázového souboru. Aby se toto snížení zmírnilo, Firebird seskupuje zápisy nově alokovaných stránek až do velikosti 128KB najednou a sleduje počet „inicializovaných“ stránek v hlavičce PIP.

Poznámka: nově alokovaná stránka bude zapsána na disk dvakrát pouze tehdy, pokud je tato stránka alokována poprvé. To znamená, že pokud byla stránka alokována, uvolněna a znovu alokována, nebude při druhé alokaci zapsána dvakrát.

b) Aby se zabránilo fragmentaci souborů, Firebird používá příslušné API souborového systému k předalokaci místa na disku v relativně velkých blocích. V současnosti takové API existuje pouze ve Windows, ale nedávno bylo přidáno do Linuxového API a v budoucnu může být implementováno v takových populárních souborových systémech jako ext2 atd. Tato funkce je tedy v současnosti implementována pouze ve Windows verzích Firebirdu a v budoucnu může být implementována v Linuxových verzích.

Pro lepší kontrolu předalokace místa na disku bylo do Firebird.conf přidáno nové nastavení: DatabaseGrowthIncrement. Toto je horní hranice velikosti předalokovaného bloku v bajtech. Výchozí hodnota je 128MB. Když engine potřebuje více místa na disku, alokuje 1/16 již alokovaného místa, ale ne méně než 128KB a ne více než hodnota DatabaseGrowthIncrement. Pokud je DatabaseGrowthIncrement nastaven na nulu, předalokace je zakázána. Místo pro stínové soubory databáze není předalokováno.

Také je předalokace zakázána, pokud je pro databázi nastavena možnost „No reserve“.

Poznámka: předalokace také umožňuje vyhnout se poškození při nedostatku místa na disku - v takovém případě je velká šance, že databáze má dostatek předalokovaného místa pro provoz, dokud administrátor neuvolní nějaké místo na disku.

Autor: Vlad Khorsun,