프린트 하기

OS 환경 : Oracle Linux 8.4 (64bit)

 

DB 환경 : Oracle Database 23.4.0.24.05 ai Free

 

방법 : 오라클 23ai 신기능 UMM(Unified Memory Management) 통합메모리 관리

오라클 23ai 부터 통합 메모리 관리 옵션인 UMM(Unified Memory Management) 이 추가됨
기존에 10g 에 ASMM(Automatic Shared Memory Management)(SGA를 자동관리) 기능이 나왔고, 11g 에서 AMM(Auto Memory Management)(SGA와 PGA를 자동 관리) 기능이 나왔었음
그리고 23ai 버전에 UMM(Unified Memory Management)(SGA와 PGA를 자동 관리)이 나옴
이렇게만 보면 AMM과 UMM이 동일한 것으로 보이지만 기존 AMM은 DBCA로 설치시 물리 메모리가 4gb이상인 경우 AMM 을 선택하지 못하고 ASMM만 선택할수 있었음
그리고 AMM 을 사용하면 huge page도 사용하지 못함, 대규모 환경에 적합하지 않다는 의미로 해석될수 있음
하지만 UMM은 물리메모리가 4GB 이상인 환경에서도 사용이 가능하고 huge page도 사용가능함, 대규모 환경에서도 자동으로 메모리를 관리하기 위해 나온 기능으로 보임

 

 

참고용 원문
Unified Memory configures the database instance memory with a single parameter, MEMORY_SIZE.
The database can dynamically use this memory for any ratio of SGA, PGA, MGA, UGA, and other memory segments based on the current workload.
If huge pages are configured, they can be used for both SGA and PGA. Unified Memory provides an extremely flexible memory configuration.

 

 

이 메모리 관리 옵션은 memory_size 파라미터로 설정할 수 있음
memory_size 설명
설정값 범위 : 1536mb ~ memory_max_size 까지
설명 : pfile에서 memory_max_size를 생략하고 memory_size 값을 넣으면 자동으로 memory_max_size 값이 memory_size 값으로 설정됨
memory_size 값을 넣지않고 memory_max_size 값만 넣으면 memory_size 값이 0으로 설정됨
인스턴스가 기동중인 상태에서 memory_max_size 값 이내로 memory_size 값을 동적으로 변경 가능함
memory_size 값에 따라 인스턴스의 sga(sga_target), pga(pga_aggregate_limit) 파라미터 값이 내부적으로 자동 계산됨(이 크기는 Hugepage 설정에 따라 달라질 수 있음)
memory_size가 0이 아닌 값으로 설정되면, cdb에 설정된 sga_max_size, pga_aggregate_limit 및 sga_target 파라미터값은 무시됨(에러는 발생하지 않음, 수정시에만 에러 발생)
memory_size가 0이 아닌 값으로 설정되면, memory_max_target, memory_target 파라미터 값은 0으로 설정해야함
이 두 매개 변수 중 하나를 0이 아닌 값으로 설정하려고 하면 요청이 무시되고, db 기동시 경고메세지가 alert log에 남음

 

 

본문에서는 umm 파라미터(memory_size)를 설정해보고 memory_size 파라미터와 함께 sga_max_size, pga_aggregate_limit, amm 파라미터를 작성한뒤 기동했을때 어떻게 나오는지 확인해봄

 

 

테스트
1. umm(memory_size) 파라미터 설정
2. umm 파라미터와 함께 sga_max_size, pga_aggregate_limit 파라미터가 설정 되있을때 어떻게 나오는지 확인
3. umm 파라미터와 함께 memory_max_target, memory_target 파라미터가 설정 되있을때 어떻게 나오는지 확인
4. huge page 설정

 

 

테스트
1. umm(memory_size) 파라미터 설정
테스트 환경 물리 메모리 확인

1
2
$ grep MemTotal /proc/meminfo
MemTotal:        8152432 kB

물리메모리가 8gb 할당되어 있음

 

 

기존 ASMM 또는 AMM 파라미터 해제

1
2
3
4
5
6
SQL>
alter system reset sga_target scope=spfile;
alter system reset pga_aggregate_target scope=spfile;
alter system reset pga_aggregate_limit scope=spfile;
alter system reset memory_target scope=spfile;
alter system reset memory_max_target scope=spfile;

 

 

UMM 파라미터 설정

1
2
3
SQL> alter system set memory_size=1536m scope=spfile;
 
System altered.

*23ai FREE 버전이라 메모리를 2gb이상 설정하지 못함

 

 

재기동 후 파라미터 확인

1
2
3
4
5
SQL> show parameter memory_size
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
memory_size                          big integer 1536M

정상적으로 적용됨

 

 

2. umm 파라미터와 함께 sga_max_size, pga_aggregate_limit 파라미터가 설정되있을때 어떻게 나오는지 확인
pfile 생성

1
2
3
SQL> create pfile from spfile;
 
File created.

 

 

pfile 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$ cat $ORACLE_HOME/dbs/initFREE.ora
FREE.__data_transfer_cache_size=0
FREE.__datamemory_area_size=0
FREE.__db_cache_size=822083584
FREE.__inmemory_ext_roarea=0
FREE.__inmemory_ext_rwarea=0
FREE.__java_pool_size=16777216
FREE.__large_pool_size=16777216
FREE.__oracle_base='/opt/oracle'#ORACLE_BASE set from environment
FREE.__pga_aggregate_target=16777216
FREE.__sga_target=1275068416
FREE.__shared_io_pool_size=67108864
FREE.__shared_pool_size=318767104
FREE.__streams_pool_size=0
FREE.__unified_pga_pool_size=0
FREE._instance_recovery_bloom_filter_size=1048576
*.compatible='23.0.0'
*.control_files='/app/oracle/oradata/FREE/control01.ctl','/app/oracle/oradata/FREE/control02.ctl'
*.db_block_size=8192
*.db_name='FREE'
*.diagnostic_dest='/opt/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=FREEXDB)'
*.enable_pluggable_database=true
*.local_listener='LISTENER_FREE'
*.memory_size=1572864000
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.processes=200
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'

 

 

__ 로 시작하는 파라미터 삭제 및 sga_max_size, pga_aggregate_limit 추가 후 저장

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ vi $ORACLE_HOME/dbs/initFREE.ora
*.compatible='23.0.0'
*.control_files='/app/oracle/oradata/FREE/control01.ctl','/app/oracle/oradata/FREE/control02.ctl'
*.db_block_size=8192
*.db_name='FREE'
*.diagnostic_dest='/opt/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=FREEXDB)'
*.enable_pluggable_database=true
*.local_listener='LISTENER_FREE'
*.memory_size=1572864000
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.processes=200
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
 
*.pga_aggregate_limit=20480
*.sga_max_size=1572864000

pga_aggregate_limit은 20kb, sga_max_size는 1536mb를 설정함

 

 

db 종료

1
2
3
4
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

 

 

pfile을 이용해 spfile 생성

1
2
3
SQL> create spfile from pfile;
 
File created.

 

 

db 기동

1
2
3
4
5
6
7
8
9
10
SQL> startup
ORACLE instance started.
 
Total System Global Area 1284958328 bytes
Fixed Size                  5359736 bytes
Variable Size             452984832 bytes
Database Buffers          822083584 bytes
Redo Buffers                4530176 bytes
Database mounted.
Database opened.

정상적으로 기동됨

 

 

pga_aggregate_limit, sga_max_size 파라미터 확인

1
2
3
4
5
6
7
8
9
10
11
SQL> show parameter pga_aggregate_limit
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit                  big integer 644245094
 
SQL> show parameter sga_max_size
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 1232M

내가 설정한 값이 무시되고 다른값이 자동으로 할당됨

 

 

pga_aggregate_limit, sga_max_size 파라미터 변경 시도

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL> alter system set pga_aggregate_limit = 1000m scope = both;
alter system set pga_aggregate_limit = 1000m scope = both
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-62356: cannot set pga_aggregate_limit parameter value since MEMORY_SIZE is set
Help: https://docs.oracle.com/error-help/db/ora-02097/
 
SQL> alter system set sga_max_size = 1000m scope = both;
alter system set sga_max_size = 1000m scope = both
                 *
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified
Help: https://docs.oracle.com/error-help/db/ora-02095/

pga_aggregate_limit 는 memory_size 파라미터 때문에 변경이 안된다고 에러 메세지가 나오지만
sga_max_size 는 그냥 온라인으로 변경 불가한 파라미터를 both 로 변경할때 발생하는 메세지만 나옴

 

 

3. umm 파라미터와 함께 memory_max_target, memory_target 파라미터가 설정되있을때 어떻게 나오는지 확인
pfile 생성 후 db 종료

1
2
3
SQL> 
create pfile from spfile;
shutdown immediate

 

 

파라미터 파일 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ vi $ORACLE_HOME/dbs/initFREE.ora
*.compatible='23.0.0'
*.control_files='/app/oracle/oradata/FREE/control01.ctl','/app/oracle/oradata/FREE/control02.ctl'
*.db_block_size=8192
*.db_name='FREE'
*.diagnostic_dest='/opt/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=FREEXDB)'
*.enable_pluggable_database=true
*.local_listener='LISTENER_FREE'
*.memory_size=1572864000
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.processes=200
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
 
*.memory_max_target=1572864000
*.memory_target=1572864000

 

 

pfile을 이용해 spfile 생성

1
2
3
SQL> create spfile from pfile;
 
File created.

 

 

db 기동

1
2
3
4
5
6
7
8
9
10
SQL> startup
ORACLE instance started.
 
Total System Global Area 1284958328 bytes
Fixed Size                  5359736 bytes
Variable Size             369098752 bytes
Database Buffers          905969664 bytes
Redo Buffers                4530176 bytes
Database mounted.
Database opened.

기동시에는 에러 발생하지 않음

 

 

alert log 확인

1
2
3
4
5
6
7
8
$ vi /opt/oracle/diag/rdbms/free/FREE/trace/alert_FREE.log
2024-06-14T20:49:43.022432+09:00
Adjusting the default value of parameter "parallel_max_servers" from 0 to 1.
WARNING: Since memory_size is set, memory_target is ignored
WARNING: Since memory_size is set, memory_max_target is ignored
PARALLEL_MAX_SERVERS (with value 1) is insufficient. This may affect transaction recovery performance.
Stored outlines will be desupported in the next release.
Starting ORACLE instance (normal) (OS id: 518814)

 

 

memory_target, memory_max_target 이 무시되었다고 WARNING 메세지가 표시됨

 

 

4. huge page 설정
memory_size 가 설정된 상태에서 아래 게시글에 있는 스크립트를 실행했을때 에러가 발생함
오라클 19c Hugepages 설정 방법 ( https://positivemh.tistory.com/603 )
그래서 memory_size 값 그대로 sga_target 를 설정한 뒤 memory_size를 주석처리 한뒤 기동함
그리고 hugepages_settings.sh 쉘을 실행해서 나온 값을 설정해보았음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ sh hugepages_settings.sh
 
This script is provided by Doc ID 401749.1 from My Oracle Support
(http://support.oracle.com) where it is intended to compute values for
the recommended HugePages/HugeTLB configuration for the current shared
memory segments on Oracle Linux. Before proceeding with the execution please note following:
 * For ASM instance, it needs to configure ASMM instead of AMM.
 * The 'pga_aggregate_target' is outside the SGA and
   you should accommodate this while calculating the overall size.
 * In case you changes the DB SGA size,
   as the new SGA will not fit in the previous HugePages configuration,
   it had better disable the whole HugePages,
   start the DB with new SGA size and run the script again.
And make sure that:
 * Oracle Database instance(s) are up and running
 * Oracle Database 11g Automatic Memory Management (AMM) is not setup
   (See Doc ID 749851.1)
 * The shared memory segments can be listed by command:
     # ipcs -m
 
 
Press Enter to proceed...
 
Recommended setting: vm.nr_hugepages = 751

권장값이 751로 나옴

 

 

해당 값으로 hugapages 설정

1
2
# sysctl -w vm.nr_hugepages=751
vm.nr_hugepages = 751

 

 

서버 재기동 이후에도 변경되지 않도록 /etc/sysctl.conf 에 기록

1
2
# vi /etc/sysctl.conf
vm.nr_hugepages=751

 

 

오라클 use_large_pages 파라미터 변경 전 Huge Page사용량 확인
(바로 적용이 안되서 서버 재기동함)

1
2
3
4
5
6
7
8
9
10
# grep Huge /proc/meminfo
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:     751
HugePages_Free:      751
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:         1538048 kB

Huge Page Total이 751이고 Free가 751임을 확인 할 수 있음

 

 

오라클 접속 후 파라미터 변경

1
2
3
4
5
6
7
8
9
SQL> show parameter use_large_pages
 
NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
use_large_pages              string     TRUE
 
SQL> alter system set use_large_pages=only scope=spfile;
 
System altered.

 

 

db 재기동

1
2
3
SQL> shutdown immediate
SQL> startup
ORA-27109: Setting of values for parameters related to SGA creation is not compatible.

에러와 함께 기동되지 않음

 

 

alert log 확인

1
2
3
4
5
6
7
8
9
10
11
$ vi /opt/oracle/diag/rdbms/free/FREE/trace/alert_FREE.log
2024-06-14T20:56:48.413334+09:00
Adjusting the default value of parameter "parallel_max_servers" from 0 to 1.
WARNING: Since memory_size is set, memory_target is ignored
WARNING: Since memory_size is set, memory_max_target is ignored
PARALLEL_MAX_SERVERS (with value 1) is insufficient. This may affect transaction recovery performance.
Stored outlines will be desupported in the next release.
Starting ORACLE instance (normal) (OS id: 2627)
Cannot start the instance with specified startup parameters
use_large_pages is set to ONLY/AUTO_ONLY (either explicitly set or turned on due to Exadata setup).
SGA dynamic mode (sga_target and sga_max_size values different) requires hugetlbfs setup. Set _use_hugetlbfs_for_SGA and _use_hugetlbfs_per_granule.

_use_hugetlbfs_for_SGA 파라미터나 _use_hugetlbfs_per_granule 파라미터를 설정하라고 하는데
이 파라미터에 대해서는 따로 나와있는 내용이 없어서 더이상 진행하지 않음

 

 

결론 :
23ai 버전부터 대용량 메모리 환경에서 sga와 pga를 함께 자동으로 관리할수 있는 옵션인 umm(memory_size) 가 나오게 됨
현재는 실무에서 sga_target과 pga_aggregate_target 으로 각각 관리하거나 sga는 그냥 메뉴얼로 관리하는 경우도 있는데
추후에는 umm도 많이 안정화되어서 실무에서도 사용할수 있으면 좋을듯함
메뉴얼에서 umm 사용시 hugepage도 설정 가능하다고 해서 설정을 시도했지만 현재는 제대로 설정되지 않는듯함(FREE 버전의 기능 제한 문제일수도 있음)(20240614 기준)

 

 

참조 : 

https://apex.oracle.com/pls/apex/features/r/dbfeatures/features?feature_id=1677
https://docs.oracle.com/en/database/oracle/oracle-database/23/admin/managing-memory.html#GUID-04EFED7D-D1F1-43C3-B78F-0FF9AFAC02B0
https://docs.oracle.com/en/database/oracle/oracle-database/23/refrn/MEMORY_SIZE.html
https://docs.oracle.com/en/database/oracle/oracle-database/23/tgdba/database-memory-allocation.html#GUID-CC3F45CF-9C63-4EB7-8D77-EDC468F80A2B
https://docs.oracle.com/en/database/oracle/oracle-database/23/ladbi/configuring_hugepages.html#GUID-19BFCC60-BA4C-4750-85EB-7432282A9556
https://www.ahmedbaraka.com/unified-memory-management/
https://positivemh.tistory.com/603