Oracle的SGA基于共享内存实现,需合理配置以下参数以避免内存碎片或无法分配:
kernel.shmmax:设置为大于SGA_MAX_SIZE的值(如SGA为16GB,则设为17GB),确保SGA能在一个共享内存段中分配,减少内存管理开销。kernel.shmall:计算公式为SGA总大小(字节)/页大小(通常4KB),如16GB SGA需设置为(16*1024*1024*1024)/4096=4194304,表示系统可分配的共享内存总页数。kernel.shmmni:共享内存段最大数量,默认4096通常足够,无需修改。fs.file-max:增加系统最大文件句柄数(如设为65536),避免Oracle打开大量数据文件时出现“Too many open files”错误。大页可减少页表管理开销,提升内存访问效率,尤其适合SGA较大的场景:
大页数量 = SGA总大小(KB)/ 2048(每页2MB),如16GB SGA需16*1024*1024/2048=8192页。/etc/sysctl.conf:添加vm.nr_hugepages=8192,执行sysctl -p使配置生效。hugetlb组:usermod -aG hugetlb oracle,并重启数据库使大页生效。vm.swappiness:设置为10(默认60),降低系统使用交换分区(Swap)的倾向,避免内存不足时频繁换页导致性能下降。vm.dirty_ratio(默认20%,设为10%)、vm.dirty_background_ratio(默认10%,设为5%),控制脏页写回的阈值,平衡内存使用与I/O负载。MEMORY_TARGET(总内存)和MEMORY_MAX_TARGET(最大总内存)参数,让Oracle自动分配SGA与PGA。设置方法:ALTER SYSTEM SET MEMORY_TARGET=30G SCOPE=SPFILE;
ALTER SYSTEM SET MEMORY_MAX_TARGET=40G SCOPE=SPFILE;
适用于简化管理,但需确保MEMORY_TARGET不超过系统物理内存的70%(留出空间给操作系统和其他应用)。SGA_TARGET(目标SGA大小)和SGA_MAX_SIZE(最大SGA大小),Oracle自动调整SGA组件(如Buffer Cache、Shared Pool)。设置方法:ALTER SYSTEM SET SGA_TARGET=16G SCOPE=SPFILE;
ALTER SYSTEM SET SGA_MAX_SIZE=16G SCOPE=SPFILE;
适用于需要精细控制SGA但不想手动调整各组件的场景。若采用手动管理,需根据业务类型调整各组件大小:
DB_CACHE_SIZE):用于缓存数据文件块,命中率应保持在95%以上(计算公式:1 - (PHYSICAL_READS / (DB_BLOCK_GETS + CONSISTENT_GETS)))。若命中率低,可增加DB_CACHE_SIZE(如从8GB增至12GB)。SHARED_POOL_SIZE):用于缓存SQL、PL/SQL代码,命中率应保持在90%以上(计算公式:(SUM(PINS) - SUM(RELOADS)) / SUM(PINS))。若命中率低,可增加SHARED_POOL_SIZE或使用绑定变量减少SQL解析。LARGE_POOL_SIZE):用于并行查询、RMAN备份等,若使用共享服务器模式,需分配足够空间(如设为2GB)。从Oracle 10g开始,默认使用自动PGA管理,通过PGA_AGGREGATE_TARGET参数设置PGA总大小(如设为8GB),Oracle会根据负载动态分配给各个会话的工作区(如排序、哈希连接)。设置方法:
ALTER SYSTEM SET PGA_AGGREGATE_TARGET=8G SCOPE=SPFILE;
workarea_size_policy需设为AUTO(默认值),允许Oracle自动调整工作区大小。
通过以下视图评估PGA使用效率,调整PGA_AGGREGATE_TARGET:
V$PGASTAT:查看PGA总使用量、工作区命中率(PGA Cache Hit Ratio,应大于90%)。V$PGA_TARGET_ADVICE:分析不同PGA_AGGREGATE_TARGET值下的性能提升(如设置PGA_AGGREGATE_TARGET=8G时,命中率是否比4G时更高)。V$PROCESS:查看单个进程的PGA使用量,识别内存消耗大的会话。AWR、ADDM报告定期分析内存使用趋势,及时调整参数。PGA_AGGREGATE_TARGET)。