Цю сторінку перекладено машинним перекладом. Читайте англійський оригінал. English

Бібліотека IBSurgeon

Розподіл простору у Firebird 2.1 та вище

Vlad Khorsun, 20-JOS-2010

З самого початку Firebird не мав правил щодо того, як виділяти дисковий простір для файлу(ів) бази даних. Він просто записує нові виділені сторінки у невизначеному порядку (через залежності між сторінками для забезпечення стратегії «обережного запису»).

Цей підхід дуже простий, але має деякі недоліки:

• через невизначений порядок записів може виникнути ситуація, коли кеш сторінок містить багато брудних сторінок у момент, коли нову виділену сторінку потрібно записати, але це неможливо через брак дискового простору. У таких випадках часто всі інші брудні сторінки втрачаються, оскільки адміністратори вважають за краще завершити роботу бази даних, перш ніж звільнити трохи місця на диску. Це призводить до серйозних пошкоджень.

• виділення дискового простору відносно невеликими фрагментами може призвести до значної фрагментації файлів на рівні файлової системи та знизити продуктивність великих сканувань (наприклад, під час резервного копіювання).

Використовуючи новий ODS 11.1, Firebird змінює свій алгоритм виділення дискового простору, щоб уникнути пошкоджень в умовах браку дискового простору та дати файловій системі шанс уникнути фрагментації. Ці зміни описані нижче.

a) Кожна нововиділена сторінка записується на диск негайно перед поверненням до рушія. Якщо сторінку неможливо записати, виділення не відбувається, біт PIP не очищається, і виникає відповідна помилка введення/виведення. Ця помилка не може призвести до пошкоджень, оскільки ми маємо гарантію, що всі брудні сторінки в кеші мають виділений дисковий простір і можуть бути безпечно записані.

Ця зміна додає один додатковий запис кожної нововиділеної сторінки порівняно зі старою поведінкою. Тому очікується зниження продуктивності під час зростання файлу бази даних. Щоб зменшити це зниження, Firebird групує записи нововиділених сторінок до 128 КБ за раз і відстежує кількість «ініціалізованих» сторінок у заголовку PIP.

Примітка: нововиділена сторінка буде записана на диск двічі лише якщо ця сторінка виділяється вперше. Тобто, якщо сторінка була виділена, звільнена та виділена знову, вона не буде записана двічі при другому виділенні.

b) Щоб уникнути фрагментації файлів, Firebird використовує відповідний API файлової системи для попереднього виділення дискового простору відносно великими фрагментами. Наразі такий API існує лише в Windows, але нещодавно він був доданий до Linux API і може бути реалізований у таких популярних файлових системах, як ext2, тощо, у майбутньому. Тому ця функція наразі реалізована лише у збірках Firebird для Windows і може бути реалізована у збірках для Linux у майбутньому.

Для кращого контролю попереднього виділення дискового простору було введено новий параметр у Firebird.conf: DatabaseGrowthIncrement. Це верхня межа розміру фрагмента попереднього виділення в байтах. Значення за замовчуванням - 128 МБ. Коли рушію потрібно більше дискового простору, він виділяє 1/16 вже виділеного простору, але не менше 128 КБ і не більше значення DatabaseGrowthIncrement. Якщо DatabaseGrowthIncrement встановлено в нуль, попереднє виділення вимикається. Простір для тіньових файлів бази даних не попередньо виділяється.

Також попереднє виділення вимикається, якщо для бази даних встановлено опцію «No reserve».

Примітка: попереднє виділення також дозволяє уникнути пошкоджень в умовах браку дискового простору - у такому випадку є велика ймовірність, що база даних має достатньо попередньо виділеного простору для роботи, поки адміністратор не звільнить трохи дискового простору.

Автор: Vlad Khorsun,