공유 메모리 및 Semaphores 설정

Development 의견 남기기

공유 메모리의 설정

공유 메모리(shared memory)는 프로세스가 공유 메모리 세그먼트를 통해 공통 데이터 구조 및 데이터에 접근할 수 있게 합니다. 공유 메모리는 커널 작업을 수반하지 않으며 프로세스 간의 데이터 복제 작업이 불필요하기 때문에,  IPC(inter-process communication)를 위한 가장 빠른 방법으로 선호되고 있습니다.

오라클은 오라클의 백업 및 포어그라운드 프로세스를 위한 공유 메모리 영역으로 Shared Global Area (SGA)를 제공합니다. SGA는 데이터베이스 버퍼 캐시, 공유 SQL, 접근 경로 등의 저장에 활용되므로, SGA 크기의 설정에 따라 오라클의 성능이 크게 달라질 수 있습니다.

공유 메모리 설정을 확인하려면 아래와 같이 명령을 수행합니다.

# ipcs -lm
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 32768
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1

SHMMAX의 설정

SHMMAX 매개변수는 공유 메모리 세그먼트의 최대 크기(바이트 단위)를 정의하는데 사용됩니다. 오라클 SGA는 공유 메모리로 구성되며, SHMMAX가 올바르게 설정되지 않은 경우 SGA의 크기가 제약될 수도 있습니다. 따라서 SGA의 크기보다 작지 않도록 SHMMAX를 설정해야 합니다. SHMMAX 매개변수가 잘못 설정된 경우에는 다음과 같은 에러가 발생합니다.

ORA-27123: unable to attach to shared memory segment

SHMMAX 매개변수의 설정값을 확인하려면 아래와 같이 명령을 수행합니다.

# cat /proc/sys/kernel/shmmax
33554432

SHMMAX의 디폴트 값은 32MB입니다. 이 사이즈는 Oracle SGA로 활용하기에는 너무 부족합니다. 필자는 보통 SHMMAX 매개변수를 2GB로 설정합니다. 그 방법이 아래와 같습니다.

/proc파일시스템에 변경사항을 직접 적용하면 서버를 리부팅하지 않고도 SHMMAX설정을 변경할 수 있습니다. SHMMAX의 값을 다이내믹하게 변경하고 커맨드를/etc/rc.local스타트업 파일에 영구적으로 적용하는 방법이 아래와 같습니다.

# sysctl -w kernel.shmmax=2147483648

다음으로 /etc/sysctl.conf 스타트업 파일에 커널 매개변수를 추가함으로써 변경 사항을 영구적으로 적용할 수 있습니다:

# echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf

SHMMNI의 설정

이제SHMMNI매개변수를 살펴볼 차례입니다. 이 매개변수는 시스템 전체에서 사용하는 공유 메모리 세그먼트의 최대 숫자를 설정하는데 사용되며 디폴트 값은 4096입니다.

SHMMNI의 설정값을 확인하는 방법이 아래와 같습니다:

# cat /proc/sys/kernel/shmmni
4096

SHMMNI의 디폴트 설정값은 Oracle RAC 10gRelease 2 설치 환경에 충분합니다.

SHMALL의 설정

마지막으로, SHMALL커널 매개변수는 특정 시점에 시스템에서 사용 가능한 공유 메모리의 최대 크기(페이지 단위)를 설정하는데 사용됩니다. 따라서 이 매개변수는 최소한 아래 값보다 커야 합니다.

ceil(SHMMAX/PAGE_SIZE)

SHMALL의 디폴트 사이즈는 2097152이며 아래 명령을 통해 조회할 수 있습니다.

# cat /proc/sys/kernel/shmall
2097152

SHMALL의 디폴트 설정값은 테스트용 Oracle RAC 10g설치 환경에 충분합니다. (Note: i386 플랫폼 기반 Red Hat Linux의 페이지 사이즈는 4,096 바이트입니다. bigpages를 이용하면 메모리 페이지의 사이즈를 더 크게 변경할 수도 있습니다.)

Semaphores의 설정

다음은 세마포어를 설정할 차례입니다. 세마포어(semaphore)란 (공유 메모리와 같은) 공유 리소스의 사용 과정에서 프로세스(또는 프로세스 내 쓰레드) 간의 동기화를 위해 사용되는 일종의 카운터(counter)입니다. 세마포어 셋(semaphore set)은 Unix System V에서 지원됩니다. 애플리케이션이 세마포어를 이용하면, 운영체체는 “셋(set)”을 통해 세마포어를 지원합니다.

세마포어 설정값을 확인하려면 아래와 같이 명령을 수행합니다:

# ipcs -ls
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767

또는 다음 명령을 사용할 수도 있습니다:

# cat /proc/sys/kernel/sem
250 32000 32 128

SEMMSL의 설정

세마포어 셋 당 세마포어의 최대 갯수는SEMMSL커널 매개변수를 통해 정의됩니다.

오라클은 init.ora파일의 PROCESS 인스턴스 매개변수의 (전체 데이터베이스 중) 최대값에 10을 더한 값을 사용할 것을 권장하고 있습니다. 또SEMMSL의 값을 100 이상으로 설정하는 것이 권장됩니다.

SEMMNI의 설정

SEMMNI커널 매개변수는 전체 Linux 시스템의 세마포어 셋의 최대 개수를 정의하는데 사용됩니다. 오라클은SEMMNI를 100 이상의 값으로 설정할 것을 권장하고 있습니다.

SEMMNS의 설정

SEMMNS커널 매개변수는 전체 Linux 시스템의 (“세마포어 셋”이 아닌) 세마포어의 최대 개수를 정의하는데 사용됩니다.

오라클은 각 데이터베이스의PROCESSES인스턴스 매개변수의 값을 모두 더한 뒤, 가장 큰PROCESSES값을 두 차례 더하고, 마지막으로 각 데이터베이스 별로 10을 더한 값으로SEMMNS를 설정하도록 권고하고 있습니다.

Linux 시스템에 할당될 수 있는 세마포어의 최대 개수를 결정하기 위해 다음과 같은 공식을 사용합니다. 아래의 두 항목 중 더 낮은 값을 적용합니다:

SEMMNS -또는- (SEMMSL * SEMMNI)

SEMOPM의 설정

SEMOPM커널 매개변수는 semop시스템 호출 (system call) 별로 수행될 수 있는 세마포어 작업의 수를 설정하는데 사용됩니다.

semop시스템 호출(함수)은 하나의semop시스템 호출을 통해 여러 개의 세마포어를 지원합니다. 세마포어 셋에서 가질 수 있는 세마포어의 최대값은SEMMSL매개변수를 통해 정의됩니다. 따라서SEMOPM을SEMMSL과 동일하게 설정하는 것이 권장됩니다.

오라클은SEMOPM을 100 이상의 값으로 설정할 것을 권장하고 있습니다.

세마포어 커널 매개변수의 설정

마지막으로 세마포어 매개변수를 설정하는 방법에 대해 알아보겠습니다. 여기에서는SEMOPM만을 변경하고, 다른 설정은 디폴트 값을 그대로 사용하는 것으로 합니다.

아래 명령을 통해 /proc파일시스템 (/proc/sys/kernel/sem)에 변경 내용을 직접 적용하면, 시스템을 리부팅하지 않고도 세마포어 매개변수를 변경할 수 있습니다.

# sysctl -w kernel.sem="250 32000 100 128"

그런 다음 /etc/sysctl.conf 스타트업 파일에 커널 매개변수를 추가함으로써 변경 내용을 영구적으로 적용할 수 있습니다:

# echo "kernel.sem=250 32000 100 128" >> /etc/sysctl.conf

의견을 남겨주세요

Trackback URL : http://blueruin.org/archives/20/trackback

WP Theme & Icons by N.Design Studio
Entries RSS Log in