Oracle在Linux上的资源限制与调整方法
一 用户级资源限制与生效机制
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
session required pam_limits.sosession required pam_limits.soulimit -a应反映新限制;当前会话内可用ulimit -n 65536 -u 16384临时提升(受hard约束)。LimitNOFILE=65536、LimitNPROC=16384等,PAM对该会话不生效。二 内核参数与共享内存配置
sysctl -p生效):fs.file-max = 6815744
fs.aio-max-nr = 1048576
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
kernel.shmmax=12884901887(即16GB-1)。shmall = ceil(总共享内存需求 / 4KB)。例如需要16GB共享内存:16GB/4KB=4194304,则设kernel.shmall=4194304。三 内存管理与大页配置
SGA_TARGET(动态)与SGA_MAX_SIZE(静态,需重启)。示例:alter system set sga_max_size=4096M scope=spfile;
alter system set sga_target=4096M scope=spfile;
shutdown immediate; startup;
WORKAREA_SIZE_POLICY=AUTO,再设置PGA_AGGREGATE_TARGET(可在线调整)。示例:alter system set workarea_size_policy=auto scope=both;
alter system set pga_aggregate_target=512M scope=both;
MEMORY_TARGET/MEMORY_MAX_TARGET时,需确保**/dev/shm**容量≥目标内存;否则实例启动会失败。12288MB / 2MB = 6144,预留少量余量可设6200左右。vm.nr_hugepages=6200grep Huge /proc/meminfo、ipcs -m查看共享内存段是否使用大页四 CPU与I/O资源隔离与调度
taskset启动实例或调整进程亲和性(示例绑定到CPU 1,3-5):taskset -c 1,3-5 sqlplus '/ as sysdba'
startup
# 调整已运行进程
taskset -pc 1-3 <pid>
# 多线程需对线程逐一设置
for p in /proc/<pid>/task/*; do taskset -p -c 1-3 ${p##*/}; done
五 验证与常见问题处理
su - oracle -c 'ulimit -a'(确认nofile/nproc)sysctl -p与cat /proc/sys/fs/file-max、/proc/sys/kernel/shmmax等ipcs -m查看段大小与数量;df -h /dev/shm(AMM场景)grep Huge /proc/meminfotaskset -p <pid>查看nofile/nproc并确认PAM/服务单元已配置kernel.shmmax/kernel.shmall,或改用HugePages