이 페이지는 기계 번역되었습니다. 영어 원본을 읽어보세요. English

IBSurgeon 라이브러리

Firebird 2.1 이상에서의 공간 할당

Vlad Khorsun, 2010년 10월 20일

Firebird는 처음부터 데이터베이스 파일에 디스크 공간을 할당하는 방법에 대한 규칙이 없었습니다. 단지 “신중한 쓰기(careful write)” 전략을 제공하기 위해 페이지 간의 종속성 때문에 새로 할당된 페이지를 정해진 순서 없이 작성했습니다.

이 접근 방식은 매우 간단하지만 몇 가지 단점이 있습니다:

• 쓰기 순서가 정해져 있지 않기 때문에, 새로 할당된 페이지를 써야 할 때 페이지 캐시에 많은 더티 페이지가 포함되어 있지만 디스크 공간 부족으로 쓸 수 없는 상황이 발생할 수 있습니다. 이러한 경우 관리자가 디스크 공간을 확보하기 전에 데이터베이스를 종료하는 것을 선호하기 때문에 종종 모든 더티 페이지가 손실됩니다. 이는 심각한 손상을 초래합니다.

• 상대적으로 작은 청크로 디스크 공간을 할당하면 파일 시스템 수준에서 상당한 파일 조각화가 발생할 수 있으며 대규모 스캔(예: 백업 중)의 성능이 저하될 수 있습니다.

새로운 ODS 11.1을 사용하여 Firebird는 디스크 공간 부족 상황에서의 손상을 방지하고 파일 시스템이 조각화를 피할 수 있는 기회를 제공하기 위해 디스크 공간 할당 알고리즘을 변경합니다. 이러한 변경 사항은 아래에 설명되어 있습니다.

a) 새로 할당된 모든 페이지는 엔진에 반환되기 전에 즉시 디스크에 기록됩니다. 페이지를 쓸 수 없으면 할당이 발생하지 않고 PIP 비트가 지워지지 않으며 적절한 IO 오류가 발생합니다. 이 오류는 캐시의 모든 더티 페이지에 디스크 공간이 할당되어 안전하게 쓸 수 있다는 보장이 있으므로 손상으로 이어질 수 없습니다.

이 변경으로 인해 이전 동작과 비교하여 새로 할당된 모든 페이지에 대해 한 번의 추가 쓰기가 발생합니다. 따라서 데이터베이스 파일이 성장하는 동안 성능 저하가 예상됩니다. 이 저하를 줄이기 위해 Firebird는 새로 할당된 페이지의 쓰기를 한 번에 최대 128KB까지 그룹화하고 PIP 헤더에서 “초기화된” 페이지 수를 추적합니다.

참고: 새로 할당된 페이지는 이 페이지가 처음 할당된 경우에만 디스크에 두 번 기록됩니다. 즉, 페이지가 할당, 해제 및 다시 할당된 경우 두 번째 할당에서는 두 번 기록되지 않습니다.

b) 파일 조각화를 방지하기 위해 Firebird는 적절한 파일 시스템의 API를 사용하여 상대적으로 큰 청크로 디스크 공간을 사전 할당했습니다. 현재 이러한 API는 Windows에만 존재하지만 최근 Linux API에 추가되었으며 향후 ext2 등과 같은 인기 있는 파일 시스템에서 구현될 수 있습니다. 따라서 이 기능은 현재 Firebird의 Windows 빌드에서만 구현되며 향후 Linux 빌드에서 구현될 수 있습니다.

디스크 공간 사전 할당을 더 잘 제어하기 위해 Firebird.conf에 새로운 설정이 도입되었습니다: DatabaseGrowthIncrement. 이는 사전 할당 청크 크기의 상한(바이트)입니다. 기본값은 128MB입니다. 엔진이 더 많은 디스크 공간이 필요할 때 이미 할당된 공간의 1/16을 할당하지만 128KB 이상, DatabaseGrowthIncrement 값 이하로 할당합니다. DatabaseGrowthIncrement가 0으로 설정되면 사전 할당이 비활성화됩니다. 데이터베이스 섀도우 파일의 공간은 사전 할당되지 않습니다.

또한 데이터베이스에 “No reserve” 옵션이 설정된 경우 사전 할당이 비활성화됩니다.

참고: 사전 할당은 디스크 공간 부족 상황에서의 손상을 방지할 수도 있습니다 - 이러한 경우 관리자가 디스크 공간을 확보할 때까지 데이터베이스가 운영할 수 있는 충분한 사전 할당 공간이 있을 가능성이 높습니다.

저자: Vlad Khorsun,