2013-10-30

CentOS - Oracle 11gR2 - HugePages


Oracle이 잦은 swapping으로 성능 저하가 나는 경우가 있다.
주로 메모리 요구량이 많거나 또는 기본 4K pool이 모자라서 발생한다.

일반적으로 16GB 이상을 Oracle에 할당하면 발생하기 시작한다.
RHEL/CentOS 에서는 HugePages 라는 2M 혹은 4M 크기로 할당하여 회피할 수 있다.
또한 HugePage로 할당된 메모리는 swap되지 않고 메모리에 있는다.

1. Oracle 에 할당할 메모리크기 확인

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> show parameter target

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target                   integer     0
db_flashback_retention_target        integer     1440
fast_start_io_target                 integer     0
fast_start_mttr_target               integer     0
memory_max_target                    big integer 0
memory_target                        big integer 0
parallel_servers_target              integer     16
pga_aggregate_target                 big integer 180M
sga_target                           big integer 600M
SQL>
[oracle@ora11 ~/scripts]$ ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x3b5a955c 5013505    oracle    660        631242752  22
 600+M 정도 필요하다.

2. Oracle 수행 계정에서 900M 까지(600M이상) 사용할 수 있게 준비


[root@ora11 ~]# tail -2 /etc/security/limits.conf
oracle soft memlock 921600
oracle hard memlock 921600
 확인
[root@ora11 ~]# su - oracle -c "ulimit -l"
921600
혹은
[oracle@ora11 ~/scripts]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 16037
max locked memory       (kbytes, -l) 921600
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 16037
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[oracle@ora11 ~/scripts]$

수행 계정의 그룹정보를 확인
[oracle@ora11 ~/scripts]$ id -a
uid=500(oracle) gid=500(dba) groups=500(dba)
[oracle@ora11 ~/scripts]$ grep dba /etc/group
dba:x:500:dmadmin

3. 준비할 HugePage 블럭 계산


[oracle@ora11 ~/scripts]$ grep Hugepagesize /proc/meminfo
Hugepagesize:     2048 kB
 2M 단위로 할당 중임, 600M / 2M = 300 개 필요, 넉넉하게 400개 지정
group id 는 500
[root@ora11 ~]# tail -2 /etc/sysctl.conf
vm.nr_hugepages = 400
vm.hugetlb_shm_group = 500

4. 커널 값 적용


리부팅 혹은
[root@ora11 ~]# sysctl -w vm.nr_hugepages=400
vm.nr_hugepages = 400
[root@ora11 ~]# sysctl -w vm.hugetlb_shm_group=500
vm.hugetlb_shm_group = 500
[root@ora11 ~]#

5. Oracle 재시작 후 확인


HugePage 적용시
[oracle@ora11 ~/scripts]$ egrep -e Mem -e Page -e Huge /proc/meminfo
MemTotal:      2056548 kB
MemFree:        674696 kB
AnonPages:       69968 kB
PageTables:      11384 kBHugePages_Total:   500
HugePages_Free:    199

HugePages_Rsvd:      0
Hugepagesize:     2048 kB
 미 적용시

[oracle@ora11 ~/scripts]$ egrep -e Mem -e Page -e Huge /proc/meminfo
MemTotal:      2056548 kB
MemFree:       1055076 kB
AnonPages:       71488 kB
PageTables:      37716 kB
HugePages_Total:     0
HugePages_Free:      0

HugePages_Rsvd:      0
Hugepagesize:     2048 kB
 HugePage 사용시 메모리 할당 갯수가 줄어들어 관리용 PageTable도 줄어드는 것 확인됨


기타.

가용한 HugePage가 모자라면 Oracle 기동 중 경고 없이 기존 방식대로 수행된다.

11.2.0.1에는 호환성 문제가 있어서 AMM (Automatic Memory Management) 구성은 안된다.
다만, ASMM (Automatic Shared Memory Management)는 지원한다.
즉, memory_target, memory_max_target 을 설정하는 AMM은 안되니, reset하고
대신 sga_target, sga_max_size, pga_aggregate_target 으로 조정해야한다.
SQL> show parameter target

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target                   integer     0
db_flashback_retention_target        integer     1440
fast_start_io_target                 integer     0
fast_start_mttr_target               integer     0
memory_max_target                    big integer 0
memory_target                        big integer 0

parallel_servers_target              integer     16
pga_aggregate_target                 big integer 180M
sga_target                           big integer 600M
SQL>
11.2.0.2 부터는 HugePage를 강제로 사용하고 모자라면 기동안되게하는
use_large_pages설정이 추가됐다.
ALTER SYSTEM SET use_large_pages=only SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;
 단순히 swap되지 않고 메모리에만 있게 하려면 다른 방법도 있다.
/etc/fstab에 보면 메모리를 통상 /dev/shm 에 shm 혹은 tmpfs 로 마운트하는데
ramfs로 마운트하면 swap되지 않는다.

# umount /dev/shm
# mount -t ramfs ramfs /dev/shm

댓글 없음:

댓글 쓰기