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 -m600+M 정도 필요하다.
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x3b5a955c 5013505 oracle 660 631242752 22
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/meminfo2M 단위로 할당 중임, 600M / 2M = 300 개 필요, 넉넉하게 400개 지정
Hugepagesize: 2048 kB
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/meminfoHugePage 사용시 메모리 할당 갯수가 줄어들어 관리용 PageTable도 줄어드는 것 확인됨
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가 모자라면 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 target11.2.0.2 부터는 HugePage를 강제로 사용하고 모자라면 기동안되게하는
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>
use_large_pages설정이 추가됐다.
ALTER SYSTEM SET use_large_pages=only SCOPE=SPFILE;단순히 swap되지 않고 메모리에만 있게 하려면 다른 방법도 있다.
SHUTDOWN IMMEDIATE;
STARTUP;
/etc/fstab에 보면 메모리를 통상 /dev/shm 에 shm 혹은 tmpfs 로 마운트하는데
ramfs로 마운트하면 swap되지 않는다.
# umount /dev/shm
# mount -t ramfs ramfs /dev/shm