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” 等问题。