Innovating today, leading tomorrow

OpenSQL_Internals
[OpenSQL] PostgreSQL의 Virtual File Descriptor

[OpenSQL] PostgreSQL의 Virtual File Descriptor

Overview

PostgreSQL의 경우 테이블 오브젝트(table object) 마다 최소 한 개의 파일을 생성하기 때문에 Oracle이나 Tibero에 비해 상대적으로 많은 수의 파일 디스크립터(file descriptor, 이후 FD)를 사용할 수 있습니다. 이는 OS나 커널 설정에 따라 “Too many open files” 에러가 발생할 수 있기 때문에 PostgreSQL에서는 가상 파일 디스크립터(virtual file descriptor, 이후 VFD) 모듈을 통해 FD에 대한 관리를 하고 있습니다.

Virtual file descriptor

PostgreSQL에서 FD를 효율적으로 관리하기 위해 VFD 모듈에서는 획득한 FD를 캐싱(caching)하고, 프로세스마다 동시에 얻을 수 있는 FD의 수를 제한하고 있습니다. 만약 요청된 파일의 수가 제한된 수를 넘을 경우 VFS 내부에서는 LRU(least recently used) 방식을 사용해 기존에 캐싱되었던 FD를 정리하고 새로운 FD를 획득합니다. 때문에 다른 모듈에서는 VFD 모듈 인터페이스를 통해 파일을 열고, 닫아야 합니다.

max_files_per_process

PostgreSQL은 하나의 프로세스에서 동시에 열 수 있는 파일의 최대 수를 max_files_per_process 파라미터를 통해 설정할 수 있습니다. 기본값은 1000이며, 64부터 INT_MAX(2147483647)까지 설정할 수 있습니다. 이 파라미터를 수정한 값을 적용하려면 PostgreSQL 서버를 재시작해야 합니다.

테스트 및 검증

max_file_per_process를 64로 설정하고 PSQL로 접속한 백엔드 프로세스(backend process)가 최대로 획득한 FD의 수를 모니터링해 보겠습니다.

1. max_files_per_process 파라미터 설정

  • 일단 max_files_per_process를 최소값인 64로 설정한 후, PostgreSQL 서버를 재기동합니다.

$ vi $PGDATA/postgresql.conf

# 아래 파라미터 설정을 추가
max_files_per_process = 64

$ pg_ctl restart

2. max_files_per_process를 초과한 FD를 얻도록 SQL 실행

  • 백엔드 프로세스가 max_files_per_process를 초과한 FD를 요청하는 상황을 만들기 위해 100개의 테이블을 생성하고, 이에 대한 커서를 각각 열도록 하겠습니다.

# CREATE
CREATE TABLE T1(C1 NUMERIC, … C100 NUMERIC);

CREATE TABLE T100(C1 NUMERIC, … C100 NUMERIC);

# INSERT
INSERT INTO T1 SELECT generate_series(1, 1000), … generate_series(1, 1000);

INSERT INTO T100 SELECT generate_series(1, 1000), … generate_series(1, 1000);
COMMIT;

# DECLARE CURSOR
DECLARE C1 CURSOR FOR SELECT * FROM T1;

DECLARE C100 CURSOR FOR SELECT * FROM T100;

# FETCH CURSOR
FETCH 1 FROM C1;

FETCH 1 FROM C100;

3. 백엔드 프로세스가 획득한 FD 확인

  • 아래 PGDATA 디렉토리로 이동해서 백엔드 프로세스가 FD를 획득한 데이터 파일(data file)의 수를 확인해보겠습니다.
  • 2에서 작성한 SQL을 하나씩 수행하면서 확인을 해도 64를 넘지 않는 것을 확인할 수 있습니다.

$ cd $PGDATA
$ lsof +D . | grep [BACKEND_PROC_PID] | wc -l

4. max_safe_fds 변수

  • 위의 예시를 반복해보면 FD의 수가 64를 넘지 않을 뿐 아니라 64에 미치지 않는 특정 숫자를 넘지 않는 현상을 확인할 수 있습니다.
  • PostgreSQL은 시스템 콜이나 dynamic loader 혹은 VFD를 거치지 않고 직접 FD를 얻는 코드를 위해 확보해 놓은 FD의 수, 그리고 VFD가 만들어지기 전에 미리 열어놓은 FD의 수를 max_files_per_process에서 차감한 값을 백엔드 프로세스의 전역 변수인 max_safe_fds에 저장하여 VFD를 운영하기 때문입니다.

지금까지 PPostgreSQL의 Virtual File Descriptor에 관해 알아보았습니다

PostgreSQL의 Background Process 관리를 바로 이어서 확인해보세요!

광고성 정보 수신

개인정보 수집, 활용 목적 및 기간

(주)티맥스티베로의 개인정보 수집 및 이용 목적은 다음과 같습니다.
내용을 자세히 읽어보신 후 동의 여부를 결정해 주시기 바랍니다.

  • 수집 목적: 티맥스티베로 뉴스레터 발송 및 고객 관리
  • 수집 항목: 성함, 회사명, 회사 이메일, 연락처, 부서명, 직급, 산업, 담당업무, 관계사 여부, 방문 경로
  • 보유 및 이용 기간: 동의 철회 시까지

※ 위 개인정보 수집 및 이용에 대한 동의를 거부할 권리가 있습니다.
※ 필수 수집 항목에 대한 동의를 거부하는 경우 뉴스레터 구독이 제한될 수 있습니다.

개인정보의 처리 위탁 정보
  • 업체명: 스티비 주식회사
  • 위탁 업무 목적 및 범위: 광고가 포함된 뉴스레터 발송 및 수신자 관리
 

개인정보 수집 및 이용

개인정보 수집, 활용 목적 및 기간

(주)티맥스티베로의 개인정보 수집 및 이용 목적은 다음과 같습니다. 내용을 자세히 읽어보신 후 동의 여부를 결정해 주시기 바랍니다.

  • 수집 목적: 티맥스티베로 뉴스레터 발송 및 고객 관리
  • 수집 항목: 성함, 회사명, 회사 이메일, 연락처, 부서명, 직급, 산업, 담당업무, 관계사 여부, 방문 경로
  • 보유 및 이용 기간: 동의 철회 시까지

※ 위 개인정보 수집 및 이용에 대한 동의를 거부할 권리가 있습니다.
※ 필수 수집 항목에 대한 동의를 거부하는 경우 뉴스레터 구독이 제한될 수 있습니다.

개인정보의 처리 위탁 정보

  • 업체명: 스티비 주식회사
  • 위탁 업무 목적 및 범위: 광고가 포함된 뉴스레터 발송 및 수신자 관리
  •