Oracle在Ubuntu上的资源占用概览与优化要点
一、不同部署形态的典型占用
- 原生安装(19c/21c 等):数据库常驻内存主要由 SGA(系统全局区) 与 PGA(程序全局区) 决定;SGA 通常建议设为物理内存的1/2~1/3,PGA 约 1/4~1/2。例如 16GB 内存可先配 SGA_TARGET=8G、PGA_AGGREGATE_TARGET=4G,并按负载微调。系统层面需保证足够的 共享内存、文件句柄、进程数 等上限,否则会出现性能抖动或报错。
- Docker 容器:除数据库自身内存外,还需为容器配置足够的 /dev/shm(容器共享内存)。例如使用 Oracle 11g XE 镜像时,常见做法是通过 –shm-size=1G 启动,避免共享内存不足导致实例异常。
- Oracle XE(Express Edition):存在硬性上限,数据库最大 4GB(不含系统占用),内存上限 1GB,CPU 上限 1 核,更适合开发/测试或轻量场景。
二、系统资源占用构成与关键内核参数
- 共享内存:Oracle 依赖 System V 共享内存。常见建议为:kernel.shmmax ≈ 物理内存的 1/2~1/4(字节),kernel.shmall 需能覆盖 SGA(单位页,常见页大小 4KB),kernel.shmmni=4096。
- 信号量与 AIO:kernel.sem=250 32000 100 128;fs.aio-max-nr=1048576(提升 I/O 并发能力)。
- 文件与进程:fs.file-max=6815744(系统最大文件描述符);Oracle 用户级建议 nproc 16384、nofile 65536、stack 10240(单位 KB)。
- 网络与端口:net.ipv4.ip_local_port_range=9000 65500(缓解短连接端口耗尽),并适当调大 rmem/wmem 缓冲。以上参数需写入 /etc/sysctl.conf 并用 sysctl -p 生效。
三、Oracle内存参数与占用控制
- 自动内存管理(AMM):设置 memory_target(SGA+PGA 的目标总内存)与 memory_max_target(上限)。示例:
ALTER SYSTEM SET memory_target=8G SCOPE=SPFILE;
ALTER SYSTEM SET memory_max_target=16G SCOPE=SPFILE;
重启实例后生效。适合希望数据库自动平衡 SGA/PGA 的场景。
- 手动/ASMM:分别设置 sga_target/sga_max_size 与 pga_aggregate_target。示例:
ALTER SYSTEM SET sga_target=6G SCOPE=BOTH;
ALTER SYSTEM SET pga_aggregate_target=2G SCOPE=BOTH;
建议以 free -h 观察系统可用内存,避免超出物理内存导致换页与抖动。生产环境以实际负载逐步调优为宜。
四、快速自检与常见瓶颈定位
- 系统层:执行 sysctl -a | grep shm / file-max / sem 检查内核参数;切换到 oracle 用户执行 ulimit -u/-n 验证进程/文件句柄限制是否生效。
- Oracle 层:
- 查看内存目标:SHOW PARAMETER memory_target / memory_max_target / sga_target / pga_aggregate_target;
- 观察 SGA/PGA 使用:SELECT * FROM v$sgainfo;、SELECT * FROM v$pga_aggregate_target_advice;;
- 若使用 Docker,确认容器启动时设置了足够的 –shm-size,否则可能因共享内存不足导致实例启动或运行异常。