Innovating today, leading tomorrow

OpenSQL_Technical Guide
[OpenSQL] Background Writer

[OpenSQL] Background Writer

Background Writer

Background Writer란?

Background Writer 프로세스는 Dirty Shared Buffer의 쓰기를 실행하는 서버 프로세스이다.

Clean Buffer가 충분하지 않다고 보여지면, Background Writer는 Dirty Buffer를 디스크에 작성하고, Clean Buffer로 만들어준다(flush). 이 작업을 통해 서버 프로세스는 쿼리 수행시 Clean Buffer를 쉽게 찾을 수 있게 하고, 어쩔 수 없이 Dirty Buffer를 사용해야할 상황을 줄여준다.

단점으로 Disk I/O가 일어나는 작업이므로, 시스템 자체의 I/O는 증가할 수 있다. 체크포인트 작업은 주기적으로 한번만 일어나는데에 비해서, 백그라운드 작업은 훨씬 짧은 주기를 가지고 반복되기 때문이다.
– PostgreSQL 공식 문서 –

Dirty Shared Buffer는 DB에서 Commit은 되었으나, 실제 Disk에 작성이 되지 않은 상태입니다.따라서, 변경된 자료를 저장하고 있는 메모리 공간이라고 볼 수 있습니다.변경된 내용을 Disk에 파일로 작성하는 작업은, 주로 Checkpoint 작업에 이루어집니다.변경된 자료의 양이 많거나 지속적으로 변경사항이 생길 경우, Checkpoint 작업이 오래 걸리거나, 잦은 빈도로 수행될 수 있습니다.Background Writer는 Checkpoint 작업 주기 사이에서 비동기적으로 수행되어, Checkpoint 작업시의 I/O 부하를 줄이거나, 작업 빈도를 줄여줍니다.정리하자면, 평상시의 Disk I/O는 약간 증가하지만 다량의 작업이 수행될 경우의 Disk I/O를 줄여주는 역할을 하는 프로세스라고 할 수 있습니다.

옵션 설정

postgresql.conf에서 변경할 수 있습니다.

<aside> bgwriter_delay (integer)

백그라운드 라이터에 작업에 대한 딜레이를 지정하는 옵션입니다.백그라운드 라이터는 Dirty Buffer에 대한 쓰기 작업을 실행한 다음 bgwriter_delay(밀리초) 동안 sleep합니다.**버퍼 풀에 더티 버퍼가 없으면 bgwriter_delay 값에 관계 없이, 계속 sleep 합니다.**기본값은 200밀리초(200ms)입니다.많은 시스템에서 권장되는 값은 10ms입니다.10의 배수가 아닌 값으로 설정하면 10의자리에서 올림 되는 값으로 설정됩니다.

bgwriter_lru_maxpages (integer)

백그라운드 라이터의 작업 수행시, 이 값 이상의 버퍼를 디스크에 작성하지 않습니다.이 값을 0으로 설정하면 백그라운드 쓰기가 비활성화됩니다.**(별도의 전용 보조 프로세스에 의해 관리되는 체크포인트 작업은 영향을 받지 않습니다.)**기본값은 100입니다.

bgwriter_lru_multiplier (floating point)

각 작업당 작성된 더티 버퍼의 수는, 최근 작업들에서 서버 프로세스가 필요로 했던 새로운 버퍼의 양들을 기준으로 결정됩니다.평균적으로 최근 필요했던 버퍼의 양들과 bgwriter_lru_multiplier 값을 곱해서, 다음 라운드 동안 필요한 버퍼 수를 추정합니다.clean하고 reusable 버퍼가 충분할 때 까지 더티 버퍼를 디스크에 작성합니다. (bgwriter_lru_maxpages값을 넘기지 않습니다.)값이 크면 수요 급증에 대한 완충 역할을 하는 반면 값이 작을수록 의도적으로 쓰기 작업이 서버 프로세스에서 수행되도록 합니다.기본값은 2.0입니다.

bgwriter_flush_after (integer)

백그라운드 라이터가 bgwriter_flush_after값(byte 단위)이상의 용량을 디스크에 작성할 때마다 OS에 강제로 Synchronize 명령을 합니다.이 작업을 통해서 OS 커널의 페이지 캐시에 있는 더티 데이터의 양이 제한되어 체크포인트가 끝날 때 실행되는 fsync 작업이나, OS가 백그라운드 작업으로 디스크 사용량을 많이 할당할 때 부하를 줄일 수 있습니다.이 설정으로 인해 트랜잭션 레이턴시가 크게 줄어들지만, shared_buffers 보다 크고 OS의 page cache보다 작은 workload의 경우 성능이 저하될 수 있는 경우가 있습니다.설정 값의 유효한 범위는 0 ~ 2MB입니다. (0으로 설정할 시, 비활성화 됩니다.)기본값은 Linux에서 512KB이며, 다른 운영체제에서는 0입니다. ( BLCKSZ가 8kB가 아닌 경우 기본값 및 최대값은 이에 비례하여 조정이 필요합니다.)

</aside>

상태 조회 (뷰)

PostgreSQL은 Background Writer의 상태를 저장하는 View를 제공합니다.

pg_stat_bgwriter

컬럼명자료형설명
checkpoints_timedbigint수행 예약된 체크포인트의 수
checkpoints_reqbigint수행 요청된 체크포인트의 수
checkpoint_write_timedouble precision체크포인트 처리 부분에서 파일을 디스크에 작성하는데 소요된 총 시간(밀리초)
checkpoint_sync_timedouble precision체크포인트 처리 부분에서 파일이 디스크에 싱크되는데 소요된 총 시간(밀리초)
buffers_checkpointbigint체크포인트 동안 작성된 버퍼 수
buffers_cleanbigint백그라운드 라이터가 작성한 버퍼수
maxwritten_cleanbigint백그라운드 라이터가 너무 많은 버퍼를 작성하여, Cleaning scan을 중지한 횟수
buffers_backendbigint백엔드에서 직접 작성한 버퍼 수
buffers_backend_fsyncbigint백엔드가 자신의 fysnc 호출을 실행한 횟수
buffers_allocbigint할당된 버퍼의 수
setats_resettimestamp with time zone이 통계가 마지막으로 재설정된 시간

postgres=# select * from pg_stat_bgwriter;

-[ RECORD 1 ]———+——————————
checkpoints_timed | 0
checkpoints_req | 0
checkpoint_write_time | 0
checkpoint_sync_time | 0
buffers_checkpoint | 0
buffers_clean | 0 maxwritten_clean | 0
buffers_backend | 0
buffers_backend_fsync | 0
buffers_alloc | 93
stats_reset | 2023-02-06 23:49:07.854707+09

지금까지 ’PostgreSQL Background Writer 프로세스’에 관해 알아보았습니다

‘PostgreSQL의 Wait Events’를 바로 이어서 확인해보세요!