优化Ubuntu上Oracle内存使用的关键策略
调整内核参数
编辑/etc/sysctl.conf
文件,优化以下参数以提升内存管理效率:
kernel.shmall
:设置为物理内存页数的一半(如16GB物理内存为8388608
);kernel.shmmax
:设置为物理内存大小(如16GB设为17179869184
);vm.nr_hugepages
:启用大页内存(如分配1024
页,每页2MB则共2GB);vm.swappiness
:降低至10
以下(减少系统使用交换空间的倾向)。sudo sysctl -p
使配置生效。关闭不必要的系统服务
使用systemctl
命令停止非核心服务(如oracle.service
外的其他守护进程),减少内存竞争。例如:
sudo systemctl stop unneeded-service
sudo systemctl disable unneeded-service
配置大页内存
Oracle使用大页可减少内存碎片、提高访问效率。操作步骤:
SHOW PARAMETER USE_LARGE_PAGES;
(需设为TRUE
);物理内存(MB)/ 大页大小(默认2MB)
;/etc/default/grub
,在GRUB_CMDLINE_LINUX
中添加vm.nr_hugepages=1024
,更新grub并重启:sudo update-grub
sudo reboot
调整vm.max_map_count
增加内存映射区域数量,避免ORA-4030
错误。编辑/etc/sysctl.conf
,添加:
vm.max_map_count=65530
执行sudo sysctl -p
生效。
采用自动内存管理(AMM)
通过MEMORY_TARGET
和MEMORY_MAX_TARGET
参数,让Oracle自动分配SGA与PGA内存。操作步骤:
CREATE PFILE='/home/oracle/pfile.ora' FROM SPFILE;
;ALTER SYSTEM SET MEMORY_TARGET=0 SCOPE=SPFILE;
;ALTER SYSTEM SET MEMORY_TARGET=14G SCOPE=SPFILE; ALTER SYSTEM SET MEMORY_MAX_TARGET=16G SCOPE=SPFILE;
;SGA_TARGET
和PGA_AGGREGATE_TARGET
)。优化SGA组件
SGA是共享内存区域,需合理分配各组件:
40%-60%
(如SGA_TARGET=20G
,则DB_CACHE_SIZE=8G-12G
);10%-20%
(如SHARED_POOL_SIZE=2G-4G
);LOG_BUFFER=16M-64M
)。ALTER SYSTEM SET DB_CACHE_SIZE=10G SCOPE=BOTH;
ALTER SYSTEM SET SHARED_POOL_SIZE=3G SCOPE=BOTH;
ALTER SYSTEM SET LOG_BUFFER=32M SCOPE=BOTH;
优化PGA内存
PGA是会话私有内存,用于排序、哈希等操作。设置PGA_AGGREGATE_TARGET
为物理内存的5%-25%
(如PGA_AGGREGATE_TARGET=3G-8G
),避免过大导致内存浪费或过小导致磁盘排序(TEMP
表空间压力大)。
使用动态性能视图监控内存
SELECT * FROM V$SGASTAT;
;SELECT * FROM V$PGASTAT;
;SELECT * FROM V$MEMORY_DYNAMIC_COMPONENTS;
;SELECT * FROM V$MEMORY_RESIZE_OPS;
。生成AWR/ADDM报告
通过AWR(自动工作负载存储库)和ADDM(自动数据库诊断监视器)识别内存瓶颈:
@?/rdbms/admin/awrrpt.sql -- 生成AWR报告
@?/rdbms/admin/addmrpt.sql -- 生成ADDM报告
报告会指出SGA/PGA分配不合理、共享池碎片化等问题,指导针对性调整。