개발/DB2

DB2 메모리 문제 해결

좋은느낌/원철 2008. 6. 25. 17:05

32-bit AIX에서 데이터베이스 공유 메모리를 할당할 때의 일반적인 문제들

데이터베이스 공유 메모리를 적절히 초기화 하지 못하면 다음과 같은 문제가 생긴다.

  • 데이터베이스 시작 시 (데이터베이스를 실행하거나 데이터베이스를 처음 연결할 때) - SQL1478W, SQL0987C, SQL1084C
  • 런타임 시 - SQL10003N, SQL1042C

다음은 문제로 이어질 수 있는 부적절한 설정 예제들이다.

예제 1

다음 설정을 생각해 보자. (모든 페이지 크기가 4KB이다.)

  • 싱글 파티션, 집중장치 실행 안됨, INTRA_PARALLEL OFF, DB2_MMAP_READ=NO, DB2_MMAP_WRITE=NO, fenced 함수나 프로시저 없음.
  • IBMDEFAULTBP 450,000 pages
  • UTILHEAP 17,500 pages
  • DBHEAP 10,000 pages
  • LOCKLIST 1000 pages
  • PCKCACHE 5000 pages
  • CATALOGCACHE 2500 pages

한계: 이 설정에서 데이터베이스 공유 메모리의 한계는 2GB 이거나 8 세그먼트이다.

계산: 다음 공식을 사용하여 데이터베이스 공유 메모리를 계산한다.
Database shared memory = (Total of 486,000 pages x 4KB per page) x 1.1 (account for 10% overhead) = ~2.1GB = 9 segments

주: 이 계산에서 네 개의 숨겨진 버퍼 풀을 남겨두었다. 너무 작아서 차이를 보이지도 않는다.

문제: 이것은 2GB의 한계를 초과한다. 데이터베이스를 실행하거나 데이터베이스에 처음으로 연결할 때 다음과 같은 경고를 받는다.
SQL1478W The defined buffer pools could not be started. Instead, one small buffer pool for each page size supported by DB2 has been started. SQLSTATE=01626

db2diag.log에서 DB2가 숨겨진 버퍼 풀 없이 시작할 것이라는 메시지를 보게 될 것이다. 이 문제를 해결하려면 메인 버퍼 풀의 크기를 줄인다.

예제 2

다음과 같은 설정을 생각해 보자. (모든 페이지의 크기가 4K이다.)

  • 싱글 파티션, Fenced 함수나 프로시저 없음, INTRA_PARALLEL=ON
  • IBMDEFAULTBP 300,000 pages
  • UTILHEAP 17,500 pages
  • DBHEAP 10,000 pages
  • SHEAPTHRES_SHR 50,000 pages
  • LOCKLIST 1000 pages
  • PCKCACHE 5000 pages
  • CATALOGCACHE 2500 pages

한계: 1.5GB (6 세그먼트). 한 개의 세그먼트가 애플리케이션 그룹 메모리에 사용된다. INTRA_PARALLEL이 ON이기 때문이다. 또 다른 세그먼트는 로컬 연결에 사용된다. DB2_MMAP_READ와 DB2_MMAP_WRITE가 YES로 설정되기 때문이다. (디폴트)

계산:
Database shared memory = (Total of 386,000 pages x 4KB per page) x 1.1 = ~1.67GB = 7 segments

문제: 이것은 1.5GB 한계를 초과한다. 데이터베이스를 활성화 하거나 데이터베이스에 처음 연결할 때 다음과 같은 에러 메시지를 받게 된다.
SQL1042C An unexpected system error occurred. SQLSTATE=58004

이 문제를 해결하려면:

  • db2set를 사용하여 DB2_MMAP_READ와 DB2_MMAP_WRITE를 NO로 설정한다. 이로서 DB2는 로컬 커넥션에 세그먼트 E를 사용하게 되고 데이터베이스 공유 메모리에 한 개의 세그먼트가 남게 된다.

예제 3

다음과 같은 설정을 생각해 보자. (모든 페이지 크기가 4K 이다.)

  • IBMDEFAULTBP 250,000 pages
  • INTRA_PARALLEL=ON
  • UTILHEAP 17,500 pages
  • DBHEAP 10,000 pages
  • SHEAPTHRES_SHR 20,000 pages
  • LOCKLIST 1000 pages
  • PCKCACHE 5000 pages
  • CATALOGCACHE 2500 pages
  • Fenced UDF exists

한계: 다음 항목들이 한 개의 세그먼트를 취한다: Intra-parallel ON, 로컬 커넥션, fenced UDFB. 데이터베이스 공유 메모리에 5 세그먼트나 1.25G를 남겨둔다.

계산:
Database shared memory = (Total of 306,000 pages x 4KB per page) x 1.1% = ~1.35GB = 6 segments

문제: fenced UDF를 참조하는 쿼리가 sql10003C로 실패한다. 이 문제를 해결하려면, unfenced 모드에서 UDF를 실행하거나 데이터베이스 공유 메모리를 줄여 5 세그먼트가 넘지 않도록 한다.