温馨提示×

Oracle Linux系统资源如何分配

小樊
38
2025-12-16 12:57:40
栏目: 云计算

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.service 的内存上限为 8G
      • sudo systemctl set-property oracle.service MemoryHigh=8G
      • sudo systemctl set-property oracle.service MemoryMax=8.5G
  • 说明
    • cgroups v2 统一层级下,CPU 使用 cpu.weight(相对份额)与 cpu.max(配额上限),内存使用 MemoryHigh/MemoryMax 做软/硬限制;也可对 blkio 做 I/O 权重/速率限制(需内核与文件系统支持)。

三、数据库层 Oracle Resource Manager 分配 CPU 与并发

  • 典型目标:为 OLTPDSSBATCH 等不同工作负载分配不同比例的 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/shmmaxcat /proc/sys/kernel/shmallipcs -lm
      • 设置:echo "kernel.shmmax=... >> /etc/sysctl.conf
  • HugePages(提升大内存数据库性能)
    • 计算与配置(示例):
      • 估算 HugePages 数量(保守):HugePages ≈ SGA_TARGET / HugePage_Size(HugePage_Size 通常为 2MB1GB,视内核与硬件而定)。
      • 保留内存:vm.nr_hugepages=<计算值>(写入 sysctl.conf 并 sysctl -p)。
      • 确保 Oracle 使用 HugePages(检查告警日志/视图,确认已分配)。
  • 常见错误与排查
    • ORA-27102 / ENOSPC:共享内存不足,多由 shmall/shmmax 过小或系统内存紧张导致;按上述公式调大并重启实例。

五、快速落地清单

  • 规划与测量:明确 SGA/PGA 目标、并发会话与关键业务优先级;记录基线指标(CPU、内存、I/O、AWR/ASH)。
  • 操作系统层:启用 cgroups v2;为 Oracle 服务设置 CPUWeight/CPUQuotaMemoryHigh/MemoryMax;必要时对关键目录做 I/O 权重/限速
  • 数据库层:创建 Resource Manager 计划,按 OLTP/DSS/BATCH 分配 CPU 比率;设置 并行度上限活动会话池;为异常作业配置 MAX_EST_EXEC_TIME
  • 内核与内存:按 SGA 设置 shmmax/shmall/shmmnisem;启用并验证 HugePages;执行滚动重启与 AWR 对比验证效果。

0