공유 메모리(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 스타트업 파일에 영구적으로 적용하는 방법이 아래와 같습니다:
    # echo "2147483648" > /proc/sys/kernel/shmmax


  • · 또는 sysctl 커맨드를 사용하여 SHMMAX의 값을 변경할 수도 있습니다:
    # sysctl -w kernel.shmmax=2147483648


  • · 마지막으로, /etc/sysctl.conf 스타트업 파일에 커널 매개변수를 추가함으로써 변경 사항을 영구적으로 적용할 수 있습니다:
    # echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf
SHMMNI의 설정

SHMMAX 매개변수는 공유 메모리 세그먼트의 최대 숫자를 설정하는데 사용되며, 디폴트 값은 4096입니다. 이 값은 일반적으로 충분하며 변경될 필요가 없습니다.

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

# cat /proc/sys/kernel/shmmni
4096
SHMALL의 설정

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

ceil(SHMMAX/PAGE_SIZE)
SHMALL의 디폴트 사이즈는 2097152이며 아래 명령을 통해 조회할 수 있습니다:
# cat /proc/sys/kernel/shmall
2097152
SHMALL의 디폴트 설정값은 이 가이드에서 사용하는 테스트용 Oracle RAC 10g 설치 환경에 충분합니다.
(참고: i386 플랫폼 기반 Red Hat Linux의 페이지 사이즈는 4,096 바이트입니다. bigpages를 이용하면 메모리 페이지의 사이즈를 더 크게 변경할 수도 있습니다.)

Semaphore의 설정

세마포어(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의 설정

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

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

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

SEMMNS  또는  (SEMMSL * SEMMNI)
SEMOPM의 설정

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

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

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

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

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


  • · /proc 파일시스템에 변경 내용을 직접 적용하면, 시스템을 리부팅하지 않고도 세마포어 매개변수를 변경할 수 있습니다. /etc/rc.local 스타트업 파일에 아래 라인을 추가하면 됩니다:
    # echo "250 32000 100 128" > /proc/sys/kernel/sem


  • · sysctl 커맨드를 사용하면 전체 세마포어 설정을 한꺼번에 변경할 수 있습니다:
    # sysctl -w kernel.sem="250 32000 100 128"


  • · 마지막으로 /etc/sysctl.conf 스타트업 파일에 커널 매개변수를 추가함으로써 변경 내용을 영구적으로 적용할 수 있습니다:
    # echo "kernel.sem=250 32000 100 128" >> /etc/sysctl.conf

File Handle의 처리


Red Hat Linux 서버를 구성하는 과정에서, 사용 가능한 파일 핸들(file handle)의 수가 충분한지 확인하는 것은 매우 중요합니다. 파일 핸들의 최대 개수 설정에 따라 Linux 시스템에서 동시에 오픈할 수 있는 파일의 수가 달라지게 됩니다.

전체 시스템에서 사용 가능한 파일 핸들의 최대값을 확인하기 위해 아래 명령을 실행합니다:

# cat /proc/sys/fs/file-max
32768
오라클은 전체 시스템의 파일 핸들 수를 최소 65536개 이상으로 설정할 것을 권고하고 있습니다..

  • · /proc 파일시스템에 변경 내용을 직접 적용하면, 시스템을 리부팅하지 않고도 매개변수를 변경할 수 있습니다. /etc/rc.local 스타트업 파일에 아래 라인을 추가하면 됩니다:
    # echo "65536" > /proc/sys/fs/file-max


  • · 또는 sysctl 커맨드를 이용하여 SHMMAX의 값을 변경할 수도 있습니다:
    # sysctl -w fs.file-max=65536


  • · 마지막으로 /etc/sysctl.conf 스타트업 파일에 커널 매개변수를 추가함으로써 변경 내용을 영구적으로 적용할 수 있습니다:
    # echo "fs.file-max=65536" >> /etc/sysctl.conf
현재 사용되고 있는 파일 핸들의 수는 아래와 같이 조회할 수 있습니다:
# cat /proc/sys/fs/file-nr
613     95      32768
file-nr 파일에서 제공되는 3 개의 매개변수가 다음과 같습니다: 할당된 파일 핸들의 수, 현재 사용 중인 파일 핸들의 수, 할당 가능한 최대 파일 핸들의 수.
(참고: /proc/sys/fs/file-max의 값을 증가시키고자 하는 경우, 먼저 ulimit이 올바르게 설정되었는지 확인할 필요가 있습니다. 2.4.20 버전에서는 ulimit이 "unlimited"로 설정되는 것이 일반적입니다. umilit 커맨드를 사용하면 ulimit 설정을 확인할 수 있습니다:
# ulimit
unlimited


+ Recent posts