温馨提示×

Oracle数据库Linux如何进行资源限制

小樊
34
2025-12-26 08:12:52
栏目: 云计算

Linux 上对 Oracle 数据库的资源限制实践

一 核心原则与检查命令

  • 使用 ulimit 查看与临时调整当前会话的资源限制;使用 /etc/security/limits.conf 配置用户级永久限制;使用 /etc/sysctl.conf 配置系统级内核参数。
  • 登录为 Oracle 安装用户(如 oracle)后,检查关键项:
    • 打开文件描述符:ulimit -Sn / ulimit -Hn(建议软≥1024、硬≥65536
    • 用户进程/线程数:ulimit -Su / ulimit -Hu(建议软≥2047、硬≥16384
    • 栈大小:ulimit -Ss / ulimit -Hs(建议软≥10240 KB、硬≤32768 KB
    • 锁定内存:ulimit -Sl / ulimit -Hl(启用 HugePages 时建议≥90% 物理内存;未启用时建议≥3145728 KB(3 GB)
  • 修改 limits.conf 后,需让 Oracle 用户重新登录才会生效;若通过 systemd 管理的服务启动,还需在服务单元中配置相应 Limit 项,否则可能不继承 limits.conf。

二 用户级限制配置 limits.conf

  • 编辑 /etc/security/limits.conf,为 oracle(及 grid,如采用角色分离)设置软硬限制:
    • 示例(按官方建议范围设置):
      • oracle soft nofile 1024
      • oracle hard nofile 65536
      • oracle soft nproc 2047
      • oracle hard nproc 16384
      • oracle soft stack 10240
      • oracle hard stack 32768
      • oracle soft memlock 3145728
      • oracle hard memlock 3145728
    • 如启用 HugePages,将 memlock 调整为不超过物理内存的 90%(以 KB 计)。
  • 确保 PAM 启用限制模块:在 /etc/pam.d/login(以及使用 systemd 时的服务单元)包含:
    • session required pam_limits.so
  • 使配置生效:让 oracle 用户完全登出并重新登录,或重启相关服务/系统。
  • 验证:
    • su - oracle
    • ulimit -n -S/-H、ulimit -u -S/-H、ulimit -s -S/-H、ulimit -l -S/-H
  • 提示:limits.conf 的变更不会自动作用于已登录会话;systemd 服务需在单元中显式设置 LimitNOFILE、LimitNPROC、LimitMEMLOCK 等。

三 系统级内核参数 sysctl.conf

  • 编辑 /etc/sysctl.conf(或 /etc/sysctl.d/99-oracle.conf),典型 Oracle 数据库建议值如下(按实际内存与实例规模调整):
    • fs.file-max = 6815744
    • fs.aio-max-nr = 1048576
    • kernel.shmmax = 建议大于数据库 SGA_MAX_SIZE(64 位系统通常可设为接近物理内存上限)
    • kernel.shmall = 共享内存总页数(页大小通常为 4 KB,计算:所需页数 = 共享内存大小 / 4096)
    • kernel.shmmni = 4096
    • kernel.sem = 5010 641280 5010 128(SEMMSL/SEMMNS/SEMOPM/SEMMNI)
    • 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
  • 应用生效:sysctl -p(或 sysctl --system)。
  • 说明:
    • shmmax 应足够大以容纳单个共享内存段中的 SGA;shmall 需满足所有共享内存段的总页数需求;SEMMNS 与系统中实例的 PROCESSES 参数相关,需合理规划。

四 systemd 服务的资源限制与验证

  • 若 Oracle 通过 systemd 管理(如监听、ASM、数据库实例),在对应单元文件(例如:oracle.service、asm.service)中添加:
    • [Service]
      • LimitNOFILE=65536
      • LimitNPROC=16384
      • LimitMEMLOCK=3145728(或按 HugePages 需求设置更高)
  • 重新加载并重启服务:
    • systemctl daemon-reexec
    • systemctl restart oracle.service
  • 运行时验证(在实例内或监听进程对应会话中):
    • 查看打开文件数:cat /proc//limits | grep “Max open files”
    • 查看进程/线程数:cat /proc//limits | grep “Max processes”
    • 查看锁定内存:cat /proc//limits | grep “Max locked memory”
    • 动态查看系统级文件句柄使用:cat /proc/sys/fs/file-nr
  • 监控与排障:
    • 使用 lsof 统计某进程或实例的打开文件数,定位 “Too many open files” 等问题。

0