File I/O는 PostgreSQL이 데이터를 디스크에 읽고 쓰는 모든 작업을 의미합니다. PostgreSQL은 디스크 저장소를 이용해 데이터를 물리적으로 저장하고, 필요 시 이를 읽고 쓰는 작업을 통해 데이터베이스를 운영합니다.
PostgreSQL에서는 디스크의 파일 읽기/쓰기 작업에 대한 통계를 pg_stat_bgwriter와 pg_stat_file 뷰를 통해 제공합니다.
pg_stat_bgwriterpg_stat_bgwriter는 PostgreSQL의 백그라운드 프로세스인 bgwriter의 파일 I/O 작업 통계를 제공합니다.
SELECT * FROM pg_stat_bgwriter;
| 컬럼명 | 설명 |
|---|---|
buffers_written | 디스크에 기록된 버퍼의 수 |
buffers_alloc | 할당된 버퍼의 수 |
maxwritten_clean | 최대값을 기록한 clean 버퍼의 수 |
buffers_backend | 백엔드 프로세스에서 기록한 버퍼 수 |
buffers_backend_fsync | 백엔드 프로세스에서 fsync를 호출한 횟수 |
buffers_written: 백그라운드 프로세스가 디스크에 기록한 버퍼의 수buffers_alloc: 버퍼가 할당된 횟수buffers_backend: 클라이언트 쿼리에서 발생한 I/O를 보여주는 지표pg_stat_filepg_stat_file은 특정 파일의 상태 및 I/O 정보를 확인하는 데 사용됩니다.
SELECT * FROM pg_stat_file('data/pg_stat_statements');
| 컬럼명 | 설명 |
|---|---|
file_name | 파일의 경로 |
size | 파일 크기 (바이트) |
last_modified | 마지막 수정 시간 |
last_accessed | 마지막 접근 시간 |
SELECT
SUM(buffers_written) AS total_buffers_written,
SUM(buffers_alloc) AS total_buffers_alloc,
SUM(buffers_backend) AS total_buffers_backend
FROM pg_stat_bgwriter;
→ 전체 I/O 통계에서 가장 중요한 디스크에 기록된 버퍼와 백엔드에서 발생한 I/O를 모니터링.
SELECT
file_name,
size,
last_modified,
last_accessed
FROM pg_stat_file('data/base/16384/16385');
→ 특정 테이블의 파일(예: base/16384/16385)에 대한 파일 크기, 수정 시각, 접근 시각 등을 확인할 수 있습니다.
| 상황 | 최적화 방법 |
|---|---|
| 디스크 I/O가 병목 | - shared_buffers 크기 조정- effective_cache_size 최적화- random_page_cost, seq_page_cost 값 조정 |
| I/O 스레드 과부하 | - 데이터 파일을 다른 디스크나 tablespace로 분산- bgwriter_lru_maxpages, bgwriter_delay 값 조정 |
| WAL 디스크 사용 | - wal_level을 minimal로 조정- archive_mode 비활성화 |
| 특정 테이블만 I/O 집중 | - 테이블을 별도의 tablespace로 분리하여 디스크 부하 분산 |
pg_stat_bgwriter: 백그라운드 I/O 활동 모니터링pg_stat_file: 파일별 상태 모니터링iostat: OS 수준에서 디스크 I/O 성능 모니터링pgBadger: PostgreSQL 로그를 분석하여 쿼리 성능과 I/O 통계를 시각화WAL(Write Ahead Log)은 데이터베이스의 모든 변경 사항을 먼저 기록하는 로그로, 디스크에 직접 쓰기 작업을 자주 발생시킵니다. WAL 관련 통계도 파일 I/O 성능에 영향을 미칩니다.
SELECT
wal_records,
wal_fpi,
wal_buffers,
max_wal_size
FROM pg_stat_wal;
wal_records: WAL에 기록된 레코드 수wal_fpi: WAL에서 파일 페이지 이미지를 기록한 횟수wal_buffers: WAL 버퍼에서 기록된 바이트 수