大页内存可减少TLB(Translation Lookaside Buffer)未命中,降低页交换频率,显著提升Oracle SGA的内存访问效率。
配置步骤:
grep Huge /proc/meminfo(若输出包含"HugePages_Total"则表示支持);/etc/sysctl.conf文件,添加或修改以下参数(your_calculated_value需根据SGA大小计算,通常为SGA大小的1/4至1/2,且为2的幂次方,如SGA为8GB则设置为2048):vm.nr_hugepages = your_calculated_value
vm.hugetlb_shm_group = 0 # 允许Oracle用户使用大页
sysctl -p;grep Huge /proc/meminfo(HugePages_Free应接近0,表示大页已被Oracle使用)。修改/etc/sysctl.conf文件,优化以下关键参数以支持Oracle内存需求:
kernel.shmmax = 物理内存大小(如8GB则为8589934592) # 单个共享内存段最大大小,需大于SGA大小
kernel.shmmni = 4096 # 系统中共享内存段的最大数量(默认足够,无需修改)
kernel.shmall = 物理内存大小/4(单位:页) # 系统共享内存总大小(页),如8GB则为2097152
fs.file-max = 65536 # 系统最大文件句柄数(Oracle连接会占用文件句柄)
net.ipv4.ip_local_port_range = 1024 65000 # 应用程序可使用的端口范围(避免端口冲突)
修改后执行sysctl -p使配置生效。
SGA是Oracle实例的共享内存区域,包含数据库缓冲区缓存、共享池、重做日志缓冲区等组件,其大小直接影响数据库缓存命中率和性能。
Oracle提供三种SGA内存管理模式,推荐使用自动共享内存管理(ASMM),简化内存分配:
MEMORY_TARGET=0、MEMORY_MAX_TARGET=0(需在spfile中修改);SGA_TARGET为物理内存的70%-80%(如8GB物理内存设置为5-6GB),SGA_MAX_SIZE大于等于SGA_TARGET(如6GB)。ALTER SYSTEM SET MEMORY_TARGET=0 SCOPE=SPFILE;
ALTER SYSTEM SET MEMORY_MAX_TARGET=0 SCOPE=SPFILE;
ALTER SYSTEM SET SGA_TARGET=5G SCOPE=SPFILE;
ALTER SYSTEM SET SGA_MAX_SIZE=6G SCOPE=SPFILE;
DB_CACHE_SIZE(数据缓冲区)、SHARED_POOL_SIZE(共享池)、LARGE_POOL_SIZE(大池)等参数,适用于高级调优场景。若使用自动共享内存管理,Oracle会自动分配各组件内存;若手动管理,需根据业务负载调整:
DB_CACHE_SIZE):缓存数据块,减少磁盘I/O,通常设置为SGA的40%-70%(如SGA为5GB则设置为2-3.5GB);SHARED_POOL_SIZE):存储SQL、PL/SQL代码和数据字典,通常设置为SGA的15%-30%(如SGA为5GB则设置为0.75-1.5GB);LARGE_POOL_SIZE):用于并行查询、RMAN备份等,通常设置为SGA的5%-10%(如SGA为5GB则设置为0.25-0.5GB);LOG_BUFFER):缓存重做日志条目,通常设置为1-2MB(无需频繁调整)。PGA是Oracle进程的私有内存区域,包含排序区、会话信息、游标状态等,主要用于内存密集型操作(如排序、哈希连接)。
Oracle推荐使用自动PGA内存管理(APMM),通过PGA_AGGREGATE_TARGET参数统一管理PGA内存:
PGA_AGGREGATE_TARGET为物理内存的10%-20%(OLTP系统)或20%-30%(DSS系统),如8GB物理内存设置为1-2GB(OLTP)或1.6-2.4GB(DSS);ALTER SYSTEM SET PGA_AGGREGATE_TARGET=1G SCOPE=SPFILE;
WORKAREA_SIZE_POLICY=MANUAL,并手动调整SORT_AREA_SIZE、HASH_AREA_SIZE等参数(适用于高级调优)。通过以下视图监控PGA使用情况,评估配置合理性:
V$PGASTAT:查看PGA内存使用统计(如total PGA allocated、total PGA inuse);V$PGA_TARGET_ADVICE:查看PGA目标值调整建议(如增加PGA_AGGREGATE_TARGET是否能提升性能);SELECT round(m.value/(m.value+d.value),4)*100|| '%' memory_disk_sort_ratio FROM (SELECT value FROM v$sysstat WHERE NAME = 'sorts(memory') m, (SELECT value FROM v$sysstat WHERE NAME = 'sorts(disk)') d;:查看内存排序占比(理想值为100%,表示无磁盘排序)。SCOPE=SPFILE需重启生效,SCOPE=BOTH立即生效),可根据业务负载动态调整;