Oracle Linux系统资源如何分配
导读:Oracle Linux 系统资源分配实践 一、总体思路与分层 在 Oracle Linux 上,资源分配通常分为三层: 操作系统层:用 cgroups v1/v2 对 CPU、内存、I/O 进行配额与隔离,必要时结合 systemd...
Oracle Linux 系统资源分配实践
一、总体思路与分层
- 在 Oracle Linux 上,资源分配通常分为三层:
- 操作系统层:用 cgroups v1/v2 对 CPU、内存、I/O 进行配额与隔离,必要时结合 systemd 作用域/服务单元做按服务限制。
- 数据库层:用 Oracle Database Resource Manager(资源管理器) 按会话/用户/应用组在数据库内分配 CPU、并行度、活动会话与执行时间等。
- 内存与内核层:为数据库准备共享内存与信号量,并启用 HugePages 降低页表开销、提升大内存访问效率。
二、操作系统层 cgroups v2 分配 CPU 与内存
- 启用 cgroups v2(Oracle Linux 8 默认多为 v1)
- 设置内核引导参数并重启:
- 为所有内核:
sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=1" - 或仅当前内核:
sudo grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="systemd.unified_cgroup_hierarchy=1" - 重启:
sudo reboot
- 为所有内核:
- 验证:
mount -l | grep cgroup,应见 cgroup2 on /sys/fs/cgroup。
- 设置内核引导参数并重启:
- 按用户/服务做 CPU 配额(示例)
- 为用户 oracle 设置软/硬 CPU 配额(单位:相对权重,默认 100;这里软 512、硬 1024):
- 创建作用域目录:
sudo mkdir -p /sys/fs/cgroup/user.slice/user-1000.slice/session-1.scope - 设置权重:
echo 512 | sudo tee /sys/fs/cgroup/user.slice/user-1000.slice/session-1.scope/cpu.weight - 设置硬上限(CFS 配额,单位:微秒,这里为 50%):
echo 50000 | sudo tee /sys/fs/cgroup/user.slice/user-1000.slice/session-1.scope/cpu.max
- 创建作用域目录:
- 将 Oracle 相关 systemd 服务放入受限作用域(示例):
sudo systemctl set-property oracle.service CPUWeight=512 CPUQuota=50%
- 为用户 oracle 设置软/硬 CPU 配额(单位:相对权重,默认 100;这里软 512、硬 1024):
- 按服务做内存限制(示例)
- 限制 oracle.service 的内存上限为 8G:
sudo systemctl set-property oracle.service MemoryHigh=8Gsudo systemctl set-property oracle.service MemoryMax=8.5G
- 限制 oracle.service 的内存上限为 8G:
- 说明
- cgroups v2 统一层级下,CPU 使用 cpu.weight(相对份额)与 cpu.max(配额上限),内存使用 MemoryHigh/MemoryMax 做软/硬限制;也可对 blkio 做 I/O 权重/速率限制(需内核与文件系统支持)。
三、数据库层 Oracle Resource Manager 分配 CPU 与并发
- 典型目标:为 OLTP、DSS、BATCH 等不同工作负载分配不同比例的 CPU,并限制异常作业与并发会话。
- 示例计划(CPU 按比率分配)
- 创建计划与消费者组(示例名,需按实际替换):
BEGIN DBMS_RESOURCE_MANAGER.CREATE_PLAN(plan=> 'DAY_PLAN'); END; /BEGIN DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(group_name=> 'OLTP_USERS', comment=> 'OLTP'); END; /BEGIN DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(group_name=> 'DSS_USERS', comment=> 'DSS'); END; /BEGIN DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(group_name=> 'BATCH_USERS', comment=> 'BATCH'); END; /
- 设定 CPU 比率(RATIO 方法):OLTP:DSS:BATCH:OTHER = 4:3:2:1
BEGIN DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(plan=> 'DAY_PLAN', group_or_subplan=> 'OLTP_USERS', mgmt_p1=> 4); END; /BEGIN DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(plan=> 'DAY_PLAN', group_or_subplan=> 'DSS_USERS', mgmt_p1=> 3); END; /BEGIN DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(plan=> 'DAY_PLAN', group_or_subplan=> 'BATCH_USERS', mgmt_p1=> 2); END; /BEGIN DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(plan=> 'DAY_PLAN', group_or_subplan=> 'OTHER_GROUPS', mgmt_p1=> 1); END; /
- 激活计划:
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN='DAY_PLAN' SCOPE=BOTH;
- 创建计划与消费者组(示例名,需按实际替换):
- 常用控制项
- 并行度上限:
PARALLEL_DEGREE_LIMIT_MTH设为 ABSOLUTE,限制每个操作的最大并行进程数。 - 活动会话池:
ACTIVE_SESS_POOL_MTH设为 ACTIVE_SESS_POOL_ABSOLUTE,限制每组最大并发活动会话,超出的会话 FIFO 排队。 - 最大估计执行时间:
MAX_EST_EXEC_TIME,超过则作业不启动并报 ORA-07455,用于拦截异常大作业。
- 并行度上限:
四、内存与内核参数及 HugePages 配置
- 共享内存与信号量(确保 SGA/PGA 与并发需求)
- 关键参数与建议:
- kernel.shmmax:单个共享内存段最大字节数,应 ≥ SGA_MAX_SIZE(常见做法为不超过物理内存的 1/2,并预留系统内存)。
- kernel.shmall:系统可分配的共享内存总页数,至少为 ceil(SHMMAX / PAGE_SIZE)(常见页大小 4KB)。
- kernel.shmmni:共享内存段最大数量,常用 4096。
- kernel.sem:信号量数组参数,四个值分别为 SEMMSL、SEMMNS、SEMOPM、SEMMNI;可按“最大 PROCESSES + 10”等规则估算并设置,确保系统范围与每数组限制均充足。
- 动态与持久化:
- 动态:
sysctl -w kernel.shmmax=...;持久化:写入 /etc/sysctl.conf 或 /etc/sysctl.d/*.conf 并执行sysctl -p。
- 动态:
- 典型检查与设置示例:
- 查看:
cat /proc/sys/kernel/shmmax、cat /proc/sys/kernel/shmall、ipcs -lm - 设置:
echo "kernel.shmmax=... > > /etc/sysctl.conf
- 查看:
- 关键参数与建议:
- HugePages(提升大内存数据库性能)
- 计算与配置(示例):
- 估算 HugePages 数量(保守):
HugePages ≈ SGA_TARGET / HugePage_Size(HugePage_Size 通常为 2MB 或 1GB,视内核与硬件而定)。 - 保留内存:
vm.nr_hugepages=< 计算值>(写入 sysctl.conf 并sysctl -p)。 - 确保 Oracle 使用 HugePages(检查告警日志/视图,确认已分配)。
- 估算 HugePages 数量(保守):
- 计算与配置(示例):
- 常见错误与排查
- ORA-27102 / ENOSPC:共享内存不足,多由 shmall/shmmax 过小或系统内存紧张导致;按上述公式调大并重启实例。
五、快速落地清单
- 规划与测量:明确 SGA/PGA 目标、并发会话与关键业务优先级;记录基线指标(CPU、内存、I/O、AWR/ASH)。
- 操作系统层:启用 cgroups v2;为 Oracle 服务设置 CPUWeight/CPUQuota 与 MemoryHigh/MemoryMax;必要时对关键目录做 I/O 权重/限速。
- 数据库层:创建 Resource Manager 计划,按 OLTP/DSS/BATCH 分配 CPU 比率;设置 并行度上限 与 活动会话池;为异常作业配置 MAX_EST_EXEC_TIME。
- 内核与内存:按 SGA 设置 shmmax/shmall/shmmni 与 sem;启用并验证 HugePages;执行滚动重启与 AWR 对比验证效果。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Oracle Linux系统资源如何分配
本文地址: https://pptw.com/jishu/773340.html
