F.24. pg_buffercache

pg_buffercache 모듈을 이용하면, 공유 버퍼 캐시가 어떻게 사용되고 있는지를 실시간으로 살펴볼 수 있다.

C로 만든 pg_buffercache_pages 함수는 버퍼 캐시 정보를 레코드 단위로 리턴하고, 이를 이용해서 좀 더 보기 편한 pg_buffercache 뷰도 제공한다.

보안상 이슈가 될 여지가 있어, 이 두 기능은 소유주와 슈퍼 유저만 사용할 수 있다.

F.24.1. pg_buffercache

이 뷰에서 제공하는 칼럼은 표 F-16 표와 같다.

표 F-16. pg_buffercache 칼럼들

이름자료형관계설명
bufferidinteger ID, 1..shared_buffers 범위
relfilenodeoidpg_class.relfilenode릴레이션 파일 노드 번호
reltablespaceoidpg_tablespace.oid해당 릴레이션의 테이블스페이스 OID
reldatabaseoidpg_database.oid해당 릴레이션의 데이터베이스 OID
relblocknumberbigint 해당 릴레이션에서의 페이지 번호
relforknumbersmallint 해당 릴레이션에서의 포크 번호; include/common/relpath.h 참조
relblocknumberbigint 릴리이션 안의 페이지 수
isdirtyboolean 디스크에 기록해야 할 페이지인지?
usagecountsmallint Clock-sweep 접근 회수
pinning_backendsinteger 해당 버퍼 꽂은(?) 백엔드 수

하나의 로우는 공유 캐시 안에서의 하나의 버퍼 정보다. 이 버퍼가 사용되고 있지 않다면, bufferid 칼럼을 제외한 모든 칼럼 값이 null이다. 공용 시스템 카탈로그는 데이터베이스 OID가 0으로 표시된다.

이 출력 자료는 공유되고 있는 모든 캐시 정보를 보여주기 때문에, 현재 데이터베이스에 속하지 않은 정보들도 출력된다. 그래서, pg_class 테이블에 없는 릴레이션 OID 값이 출력될 수도 있다. pg_class 테이블과 join 쿼리를 사용한다면, reldatabase 값이 0인 경우도 고려해서 쿼리를 작성해야한다.

pg_buffercache 뷰를 사용하면, 먼저 버퍼 정보를 출력하기 위해 내장 버퍼 관리자에서 버퍼 사용을 잠그고, 버퍼 정보 전체를 복사한다. 이렇게 해서, 잠겨지지 않은 일반 버퍼들도 필요 이상으로 활성상태가 되지만, 그 출력 결과는 일관되게 유지할 수 있다. 그럼에도 불구하고, 이 뷰를 자주 사용한다면, 약간의 데이터베이스 성능을 저하가 발생할 수도 있다.

F.24.2. 출력 예제

regression=# SELECT c.relname, count(*) AS buffers
             FROM pg_buffercache b INNER JOIN pg_class c
             ON b.relfilenode = pg_relation_filenode(c.oid) AND
                b.reldatabase IN (0, (SELECT oid FROM pg_database
                                      WHERE datname = current_database()))
             GROUP BY c.relname
             ORDER BY 2 DESC
             LIMIT 10;

             relname             | buffers
---------------------------------+---------
 tenk2                           |     345
 tenk1                           |     141
 pg_proc                         |      46
 pg_class                        |      45
 pg_attribute                    |      43
 pg_class_relname_nsp_index      |      30
 pg_proc_proname_args_nsp_index  |      28
 pg_attribute_relid_attnam_index |      26
 pg_depend                       |      22
 pg_depend_reference_index       |      20
(10 rows)

F.24.3. 만든이

Mark Kirkwood

디자인 제안: Neil Conway

디버깅 도와준 이: Tom Lane