기술자료
DBMS, DB 구축 절차, 빅데이터 기술 칼럼, 사례연구 및 세미나 자료를 소개합니다.
DB2 튜닝 가이드 Part 7: 튜닝과 트러블슈팅(3) 메모리 병목 대부분의 DB2 시스템은 '성능 전개(performance evolution)' 과정을 거친다. 시스템을 배포한 후 시스템 모니터링을 하고, 만약 문제점이 발생되면 문제해결 과정을 거친다. DB2 튜닝 가이드는 단계별로 최상의 성능을 위한 최적의 설정을 제시함으로써, DB2 시스템 성능이 최상을 유지하도록 도와준다. 이번 회에서는 성능 튜닝과 트러블슈팅 과정 중 메모리 병목 상태에서의 해결 방안을 살펴본다. 시스템 병목상태 > 메모리 병목상태 ‘지연 시스템' 병목상태 시스템 병목상태 > 지연 시스템 시스템 병목상태 > 지연 시스템 > 잠금 대기 시스템 병목상태 > 지연 시스템 > 교착상태 / 잠금 시간초과 필자소개DB2 튜닝 가이드 Part 7: 튜닝과 트러블슈팅(3) 메모리 병목
<연재순서>
DB2 튜닝 가이드 - Part 1: 최상의 성능을 위한 시스템 구성
DB2 튜닝 가이드 - Part 2: 최상의 성능을 위한 DB 구성 (1)
DB2 튜닝 가이드 - Part 3: 최상의 성능을 위한 DB 구성 (2)
DB2 튜닝 가이드 - Part 4: 시스템 성능 모니터링
DB2 튜닝 가이드 - Part 5: 튜닝과 트러블슈팅(1) - 디스크 병목
DB2 튜닝 가이드 - Part 6: 튜닝과 트러블슈팅(1) - CPU 병목
DB2 튜닝 가이드 Part 7: 튜닝과 트러블슈팅(3) 메모리 병목
명시적인 힙 크기를 지정했건 또는 STMM을 대신 사용했건 간에 실제 DB2 메모리 소비를 확인하는 가장 좋은 방법은 구성된 현재 힙 크기를 데이터베이스, 인스턴스, 애플리케이션 레벨에 각각 제공하는 데이터베이스, 데이터베이스 매니저, 애플리케이션 스냅샷(또는 SYSIBMADM.SNAPDB_MEMORY_POOL, SNAPDBM_MEMORY_POOL, SNAPAGENT_MEMORY_POOL 관리 뷰)의 메모리 사용량 섹션을 사용하는 것이다. 이렇게 하면 구성된 현재 힙과 애플리케이션 할당을 검사하고 현재 총 할당을 확인할 수 있다.DB2 버전 9.5 메모리 사용의 최상위 한도는 INSTANCE_MEMORY 데이터베이스 매니저 구성 매개변수와 DATABASE_MEMORY 데이터베이스 구성 매개변수로 적용된다. 대부분의 플랫폼에서 이러한 매개변수의 기본값은 AUTOMATIC으로 인스턴스별 또는 데이터베이스별 메모리 사용량이 변동될 수 있으며, 지원되는 경우 DB2 데이터베이스와 시스템 상황의 필요에 따라 DB2 데이터베이스 제품이 OS로부터 메모리를 가져와서 OS로 메모리를 반환함을 의미한다. 이러한 매개변수의 현재 숫자 값은 GET DATABASE MANAGER CONFIGURATION, GET DATABASE CONFIGURATION 명령에 SHOW DETAIL 옵션을 사용하여 가져올 수 있다. 그러므로 DB2 메모리 관리 시스템은 여기서 고려되는 종류의 메모리 병목상태를 방지하도록 디자인되었다.메모리 병목상태는 다음과 같은 상황에서 발생할 수 있다.
이 경우 INSTANCE_MEMORY가 AUTOMATIC으로 설정되지 않았기 때문에 STMM은 메모리를 해제함으로써 시스템의 메모리 압력에 반응하지 않는다. 따라서 DB2 시스템과 다른 주요 메모리 소비자(예: 애플리케이션 서버)의 결합은 총 시스템 전반 메모리 사용량을 지나치게 높일 수 있다. UNIX 시스템의 ps 명령 또는 Windows의 작업 관리자(task manager)는 프로세스별 메모 있는 메모리 소비자를 추적하는 데 대단히 유용한 도구이다.
이전에 언급한 것처럼 기술적으로는 파일 시스템 캐시 메모리를 DB2 데이터베이스와 같은 소비자가 사용할 수 있다고 해도 대용량의 파일 시스템 캐시(특히 메모리를 다른 메모리 사용자에게 해제하기 전에 디스크로 플러시되어야 하는 수정된 데이터의 캐시)는 메모리에 대한 추가 요구가 발생하는 경우 페이징을 일으키는 경우가 될 수 있다.
시스템에 비해 INSTANCE_MEMORY의 명시적인 값이 너무 크면 추가 데이터베이스가 온라인이 되어 총 DB2 데이터베이스 할당을 시스템에서 수용할 수 있는 것보다 높이지만 여전히 INSTANCE_MEMORY 내에 있을 때까지는 문제가 되지 않을 수 있다.
STMM은 필요한 경우 메모리를 다시 OS로 해제함으로써 메모리 압력을 극복하도록 디자인되었기 때문에 이러한 시나리오는 대부분 STMM이 활성화되어 있지 않거나 관련된 플랫폼(예: Solaris 운영 체제)에서 OS로의 메모리 해제를 지원하지 않거나 데이터베이스의 메모리 요구가 지나치게 동적인 경우(예: 데이터베이스 연결의 빠른 생성과 소멸 또는 매우 짧은 기간 동안의 데이터베이스 활성화) 발생할 가능성이 높다.
이 양이 과도한 경우 STMM을 사용하건 사용하지 않건 데이터베이스 전역 메모리 할당을 위한 메모리가 너무 적어지므로 연결 집중 장치의 사용을 통해 줄여야 한다.
많은 다른 유형의 DB2 스냅샷 모니터 데이터와는 달리 잠금 정보는 매우 일시적이다. 실행 중인 전체인 LOCK_WAIT_TIME 이외에 대부분의 다른 잠금 정보는 잠금 자체가 해제되면 사라진다. 따라서 잠금 및 잠금 대기 스냅샷은 전개되는 그림을 보다 잘 이해할 수 있도록 일정한 기간 동안 주기적으로 수집하는 경우 가장 가치가 있다. 앞에서 제안한 것처럼 대용량의 모니터 데이터 분석에 가장 좋은 방법은 관리 뷰를 통해 데이터를 수집하여 DB2에 저장하는 것이다. 특히 애플리케이션, 데이터베이스 및 잠금 스냅샷으로부터의 데이터로 구성되어 GET SNAPSHOT 명령으로부터 이러한 양식으로 사용할 수 없는 SNAPLOCKWAIT에서 가져온 데이터인 경우가 여기에 해당된다.또한 다른 유형의 스냅샷과 달리 잠금 스냅샷의 주 오버헤드는 스냅샷을 만들 때 발생하며 잠금 모니터 스위치를 통해 스냅샷을 활성화시키는 경우는 오버헤드가 없다. 따라서 규칙적으로 잠금 스냅샷을 수집하고 분석을 위해 저장하는 것이 유용하다고 하더라도 스냅샷을 지나치게 자주 만들면 그 자체로 병목상태를 일으킬 수 있다.다음은 잠금 경합 및 잠금 대기 시간을 줄이는 데 도움을 주는 몇 가지 지침이다.
잠금 에스컬레이션은 경합의 주요 원인이 될 수도 있다. 잘 디자인된 애플리케이션에서 수행한 개별 행 잠금은 충돌하지 않을 수 있지만 에스컬레이션으로 인한 블록 레벨 또는 테이블 레벨 잠금은 일련화(serialization)나 극심한 성능 문제를 일으킬 가능성이 매우 높다. 데이터베이스 스냅샷은 잠금 에스컬레이션의 전역 카운트를 표시한다(SYSIBMADM.SNAPDB.LOCK_ESCALS). 이는 대부분 각 에스컬레이션이 발생하면 (DIAGLEVEL 3에서) db2diag.log에 쓰여진 메시지를 조사하여 개별 테이블의 에스컬레이션으로 쉽게 분리될 수 있다.잠금 에스컬레이션은 애플리케이션이 잠금 목록의 허용된 부분을 사용할 때 발생한다(잠금 목록의 허용된 부분은 잠금 목록 크기의 비율로 표현되는 데이터베이스 구성 매개변수인 MAXLOCKS에 의해 결정된다). 따라서 MAXLOCKS 또는 LOCKLIST를 증가시키면 에스컬레이션의 가능성 또는 빈도를 줄일 수 있다. 뿐만 아니라 위에서 언급한 것처럼 애플리케이션에서 수행한 잠금의 수를 커밋 빈도를 늘리거나 격리 수준을 줄이는 등의 방법을 통해서 줄이면 에스컬레이션을 줄일 수 있다.
Thomas Rech:DB2 SAP Center of Excellence 선임 컨설턴트
Gang Shen:IBM Data Servers 기술 영업 전문가
Roman B. Melnyk:DB2 Information Development출처 : KDUG (http://www.kdug.kr/)제공 : DB포탈사이트 DBguide.net