| 배경 ?
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 이 증가하면 생기는 문제점
- temp file을 읽고 쓰기 위해 디스크 I/O가 발생되며 디스크 I/O는 메모리 처리보다 느리기에 In-Memory 작업 대비 속도 저하
- temp file이 증가하여 F/S full이 되면 Error 메시지가 발생함 (ex.could not write to temporary file: No space left on device)
- 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 파일 크기를 모니터링하고 관제하는 것이 좋음
참고한 글 🔽
PostgreSQL Temp file 관련 정리 (Temp tablespace)
Temp file? Postgresql에서 Temporary table/Sort/Hash Operation 등의 작업 처리 시에 temp_buffers, work_mem에 허용된 사이즈 만큼 메모리를 사용한다. 이를 초과하는 작업에 대해서 임시로 디스크에 temp file을 생성
beforeforget.co.kr
https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/AuroraUserGuide/PostgreSQL.ManagingTempFiles.html
PostgreSQL을 사용한 임시 파일 관리 - Amazon Aurora
PostgreSQL을 사용한 임시 파일 관리 PostgreSQL에서 복잡한 쿼리는 여러 가지 정렬 또는 해시 연산을 동시에 수행할 수 있으며, 각 연산은 인스턴스 메모리를 사용하여 work_mem 파라미터에 지정된 값까
docs.aws.amazon.com
'Database & Bigdata > PostgreSQL' 카테고리의 다른 글
[PostgreSQL] 보안취약점 D-06 DBA 이외의 인가되지 않은 사용자가 시스템 테이블에 접근할 수 없도록 설정 (1) | 2023.10.17 |
---|---|
[PostgreSQL] Vacuum & Freeze (3) | 2023.01.12 |
[PostgreSQL] 서비스 운영을 위한 Postgresql.conf 기본 parameters 셋팅 (0) | 2022.11.01 |
[PostgreSQL] WAL 이란 ? / WAL 관련 파라미터 (0) | 2022.07.05 |
[PostgreSQL] Lock & Deadlock (0) | 2022.06.09 |
댓글