본문 바로가기
Database & Bigdata/PostgreSQL

[PostgreSQL] 운영 중 Temp File Issue 에 관한 정리

by z.1nee 2025. 2. 5.
SMALL

| 배경 ?

1년에 한번 꼴로는 운영하고 있는 PostgreSQL 서버에서 temp file로 증가로 인한 F/S full 장애 발생

주로 temp file은 data 디렉토리 하위에 위치하고 있어 critical한 장애로 이어짐

성능이 좋지 못한 query 혹은 적절하지 않은 parameter 등의 주된 원인 

 

 

| Temp File 이란 ?

  • PostgreSQL에서 자주 사용되는 데이터는 더 빠른 액세스를 위해 메모리에 캐시됨
  •  join/sort 등을 포함하는 복잡한 query의 경우 temp_buffers, work_mem에 허용된 사이즈 만큼 메모리를 사용하나 이를 초과하는 작업에 대해서는 임시로 디스크에 temp file(임시 파일)을 생성해 사용하게 됨
  • 이 파일은 쿼리가 실행되는 동안 사용되며 쿼리가 종료되면 반환(삭제)됨
  • 기본 생성 위치는 data 하위에 base/pgsql_tmp에 위치함 (보통 default_tablespace 설정을 하지 않고 운영하므로, $PGDATA 쪽에 저장)

 

| Temp File 이 증가하면 생기는 문제점

  1. temp file을 읽고 쓰기 위해 디스크 I/O가 발생되며 디스크 I/O는 메모리 처리보다 느리기에  In-Memory 작업 대비 속도 저하
  2. temp file이 증가하여 F/S full이 되면 Error 메시지가 발생함 (ex.could not write to temporary file: No space left on device)  
  3. temp file은 쿼리가 종료되어야 반환(삭제)되기 때문에 한 쿼리에서 생성된 temp file이 너무 많으면 다른 쿼리가 실행 불가 (wait 상태로 빠짐 -> 시스템 지연)

 

 

 

 

그렇다면, Temp File이 증가할 때 조치 방법 ?

| 조치 방법

우선 temp file은 DB가 재기동 되거나 쿼리가 종료되면 삭제된다.

빠른 조치가 필요하며 재기동이 가능한 경우에는 해당 방법으로 temp file 증가를 중지 시킬 수 있지만

운영상 재기동이 불가한 경우가 있다 이때는 temp file을 증가시키는 쿼리를 찾아내 kill 하는 방법이 있음

select replace(left(name, strpos(name, '.')-1),'pgsql_tmp','') as pid, count(*), sum(size) from pg_ls_tmpdir() group by pid;

 

위 쿼리로 각 PID에 대한 임시 파일의 합계를 확인 가능

 

 

 

 

 

Temp File 증가로 인한 Issue 를 예방하려면?

| temp_file_limit  파라미터 설정

이 파라미터는 제한된 temp_files 크기(KB)를 초과하는 쿼리를 강제 취소 시킴

temp file을 증가 시키는 쿼리가 중지되지 않고 계속 실행되어 F/S full 되는 현상을 방지 할 수 있음

운영계일 경우 이 파라미터 값을 설정하여 이슈를 예방하는 것이 좋음

 

| log_temp_files 파라미터 활성화

log_temp_files 파라미터를 활성화하고 모니터링하여

비효율/비정상 적인 쿼리의 튜닝 -> temp file 증가를 예방

log_temp_files란? 🔽

더보기

임시 파일 이름과 크기의 로깅을 제어합니다. 정렬, 해시 및 임시 쿼리 결과에 대한 임시 파일을 만들 수 있습니다. 이 설정으로 활성화하면 임시 파일이 삭제될 때 바이트 단위로 지정된 파일 크기로 각 임시 파일에 대한 로그 항목이 생성됩니다. 0 값은 모든 임시 파일 정보를 로깅하는 반면, 양수 값은 지정된 데이터 양보다 크거나 같은 크기의 파일만 로깅합니다. 이 값을 단위 없이 지정하면 킬로바이트로 간주됩니다. 기본 설정은 -1로, 이러한 로깅을 비활성화합니다. 적절한 SET권한이 있는 슈퍼유저와 사용자만 이 설정을 변경할 수 있습니다.

 

| tablespace 분리

temp 영역을 data 영역과 분리하여 이슈 발생 시 서비스 영향도를 줄이는 방법

temp_tablespaces 파라미터로 조정이 가능 아래 변경방법 참고

-- 적당한 마운트 포인트 설정
mkdir /postgres_temp
-- TEMP TABLESPACE 설정
create tablespace temp_tbs location '/postgres_temp';
alter system set temp_tablespaces = 'temp_tbs';
select pg_reload_conf();

 

|  그  외

위 세가지 방법은 각각 적용하여도 되지만 여러 방법을 병행해서 사용해도 좋음

또한 work_mem 파라미터 값이 적정하게 설정되어있는지도 확인이 필요

(worrk_mem 허용치를 초과하는 작업일 때 temp file을 생성하기 때문)

개별적으로 모니터링 툴을 이용하고 있다면, temp_bytes  temp_files 과 관련한 메트릭을 이용해

temp 파일 크기를 모니터링하고 관제하는 것이 좋음

 

 

 

 

 

참고한 글 🔽

더보기

댓글