Note-Notice

➽|PostgreSQL : 메모리 동작방식

↘ 메모리 구성 - Shared / Local Memory 일반

  • Shared Memory
    • 모든 세션이 공유해서 사용하는 공간
  • Local Memory
    • Client 별로 개별/전용으로 할당되는 공간
    • SQL문 처리에 필요한 공간
      • Connection 다량 발생 시 Local Memory 사용량 증가하게됨
    • OS Memory 공간 고려가 필요

↘ 동작방식 : Shared Memory

title: Shared Memory - 데이터베이스 기동 시의 공용 메모리 공간

  • Shared Memory는 Client의 요청으로 생성된 모든 Backend 프로세스에 의해 공유되는 영역
    • 참고 : 클라이언트가 데이터베이스 접속요청 시, Backend 프로세스를 위한 Local Memory를 할당한다.

↳ Shared Buffers

title: 데이터와 데이터의 변경사항을 Block 단위로 저장하고 공유되는 공간
  • Shared Buffers

    • 데이터와 데이터의 변경사항을 Block 단위로 저장 / 논리적 I/O를 수행 (None-물리I/O)
      • 상기 Block == Shared Buffers에 기록되는 단위 > Page Size, 8Kb(Default)
      • Parameter : shared_buffers
    • Client로 부터 요청된 데이터와 변경 요청된 데이터를 저장하고 있음
    • 물리적 I/O를 수행하지 않아 빠르게 처리할 수 있다.
  • 동작방식

    • Client로 부터 데이터요청 >
      • Shared Buffers에 데이터 존재 X, 디스크에 있는 테이블로 부터 데이터 Read,
        Shared Buffers에 적재(Load) 후 Client로 전달
      • Shared Buffers에 데이터 존재 O, 버퍼의 데이터를 Read하여 Client로 전달
    • 동일/다른 세션에 상관없이, 요청한 데이터가 shared buffers에 존재할 경우,
      메모리에 적재된 데이터(Page)를 공유/재활용 하는 형태
≫ CMD : CHECK
  • 확인 : 환경파일
    # PGDATA=PostgreSQL Database Path
      cat ${PGDATA}/postgresql.conf | grep -F "shared_buffers"

  • 확인 : SHOW COMMANDS
    # PG CONNECT : psql -U postgres
      SHOW shared_buffers;

  • 확인 : SQL QUERY
    --# PG CONNECT : psql -U postgre
    --# setting Unit : Page Count , Page * Block(8kb)
      SELECT name
           , setting
        FROM pg_settings
       WHERE name = 'shared_buffers'
      ;

≫ CMD : TEST
  • Shared Buffers 역할 확인 - pgbenchtest
    • Test Database 생성 및 확인

      # psql -U postgre -d postgres
        CREATE DATABASE pgbenchtest;
        \l

    • pgbench 실행

      # pgbench 통한 Instance workload 수행
        which pgbench
        pgbench -i -s 10 -U postgre pgbenchtest

    • Shared buffers 정보 확인

      # postgre 접속 및 Shared_buffers 사용 확인
        psql -U postgre -d pgbenchtest
        
        select DATNAME
             , BLKS_HIT
             , BLKS_READ
          from pg_catalog.pg_stat_database
        ;

    • shared buffers read Test 및 확인

      --# pgbenchtest의 None Access 데이터 Read 수행 / 이후 Buffer 사용 확인
        select count(*)
          from public.pgbench_accounts
        ;


↳ Wal Buffers

title: Client로 부터 요청된 데이터변경에 대한 트랜잭션 정보를 저장!, DB복구에 사용(Wal Files)
  • Wal Buffers

    • Wal Buffers는 Client로 부터 요청된 변경된 데이터와 트랜잭션 정보를 저장
    • Wal Writer 프로세스에 의해 Wal Files에 저장된다.
      • Wal Files는 DB 복구 시 사용되며 데이터 무결성을 보장한다.
      • Parameter : wal_buffers
  • 동작방식

    • 데이터베이스의 변경사항을 Wal Buffers 상에 순차적으로 저장(FIFO)한다.
      • 세션의 USER정보/테이블정보, 변경되는 데이터 정보 등의 기록
    • 많은 트랜잭션 발생 시 저장 / 주기적으로 저장 (COMMIT)
≫ CMD : CHECK
  • 확인 : 환경파일
    # PGDATA=PostgreSQL Database Path
      cat ${PGDATA}/postgresql.conf | grep -F "wal_buffers"

  • 확인 : SHOW COMMANDS
    # PG CONNECT : psql -U postgres
      SHOW wal_buffers;

  • 확인 : SQL QUERY
    --# PG CONNECT : psql -U postgre
    --# setting Unit : Page Count , Page * Block(8kb)
      SELECT name
           , setting
        FROM pg_settings
       WHERE name = 'wal_buffers'
      ;