Skip to content

Oracle 操作系统优化

Oracle 操作系统优化概述

操作系统是Oracle数据库运行的基础平台,合理的操作系统配置对于数据库的性能、稳定性和安全性至关重要。操作系统优化是DBA日常运维工作中的重要组成部分,直接影响数据库的整体性能表现。

操作系统优化的基本原则

  1. 基于Oracle官方要求:遵循Oracle官方文档中针对不同版本和平台的系统要求
  2. 根据负载类型优化:不同类型的应用(OLTP、OLAP、混合负载)需要不同的操作系统配置
  3. 资源隔离:确保数据库获得足够的CPU、内存、磁盘I/O和网络资源
  4. 性能与安全平衡:在优化性能的同时,确保系统的安全性
  5. 版本兼容性:不同版本的Oracle数据库对操作系统版本和补丁有不同要求

操作系统优化的主要方面

  1. 内核参数配置:调整操作系统内核参数以适应Oracle数据库的需求
  2. 内存管理:优化内存分配和使用,确保数据库获得足够的内存资源
  3. 磁盘I/O配置:优化磁盘I/O性能,减少I/O等待时间
  4. 网络配置:优化网络参数,提高数据库的网络访问性能
  5. 安全加固:配置操作系统安全策略,保护数据库的安全
  6. 服务和进程管理:优化操作系统服务和进程,减少资源消耗

Linux系统优化

Linux是Oracle数据库最常用的操作系统平台,以下是针对Oracle数据库的Linux系统优化配置。

1. 内核参数优化

Linux内核参数是控制操作系统行为的关键配置,合理的内核参数设置可以显著提高Oracle数据库的性能。

主要内核参数配置

/etc/sysctl.conf文件中添加或修改以下参数:

bash
# Oracle数据库内核参数配置

# 共享内存配置
kernel.shmmax = 4294967296      # 最大共享内存段大小(字节),建议设置为物理内存的50%
kernel.shmall = 1048576          # 共享内存总页数,建议设置为shmmax/PAGE_SIZE
kernel.shmmni = 4096             # 最大共享内存段数量

# 信号量配置
kernel.sem = 250 32000 100 128   # SEMMSL SEMMNS SEMOPM SEMMNI

# 文件句柄配置
fs.file-max = 6815744            # 系统最大文件句柄数
fs.aio-max-nr = 1048576          # 异步I/O请求数

# 网络配置
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      # 最大发送缓冲区大小
net.core.netdev_max_backlog = 4096  # 网络设备最大积压数据包数
net.core.somaxconn = 4096        # 最大套接字连接数
net.ipv4.tcp_max_syn_backlog = 4096  # TCP最大SYN队列长度
net.ipv4.tcp_sack = 1            # 启用TCP SACK
net.ipv4.tcp_timestamps = 1      # 启用TCP时间戳
net.ipv4.tcp_fin_timeout = 30    # TCP连接关闭超时时间
net.ipv4.tcp_keepalive_time = 1200  # TCP keepalive时间
net.ipv4.tcp_window_scaling = 1  # 启用TCP窗口缩放
net.ipv4.tcp_max_tw_buckets = 5000  # 最大TIME_WAIT连接数
net.ipv4.tcp_tw_reuse = 1        # 允许重用TIME_WAIT连接
net.ipv4.tcp_tw_recycle = 1      # 快速回收TIME_WAIT连接

# I/O调度器配置
# 对于SSD,建议使用none或mq-deadline调度器
# 对于HDD,建议使用cfq调度器

# 内存管理配置
vm.swappiness = 10               # 内存交换倾向,建议设置为10-20
vm.dirty_background_ratio = 3    # 脏页后台写回阈值
vm.dirty_ratio = 8               # 脏页强制写回阈值
vm.dirty_expire_centisecs = 500  # 脏页过期时间(百分之一秒)
vm.dirty_writeback_centisecs = 100  # 脏页写回间隔(百分之一秒)

应用内核参数

bash
# 应用内核参数
sysctl -p

2. 内存管理优化

大页内存配置

大页内存(HugePages)可以减少内存管理开销,提高Oracle数据库的性能,特别是对于SGA较大的数据库。

1. 计算大页内存需求
bash
# 计算大页内存需求(假设SGA_TARGET=8G)
# 大页大小通常为2MB
# 大页数量 = SGA大小 / 大页大小
# 8G / 2MB = 4096

# 查看当前大页配置
grep HugePages /proc/meminfo

# 查看大页大小
grep Hugepagesize /proc/meminfo
2. 配置大页内存

/etc/sysctl.conf文件中添加或修改以下参数:

bash
# 大页配置
vm.nr_hugepages = 4096           # 大页数量
vm.hugetlb_shm_group = 54321     # Oracle用户组ID
3. 配置Oracle用户的内存限制

/etc/security/limits.conf文件中添加或修改以下参数:

bash
# Oracle用户内存限制
oracle   soft   memlock    unlimited
oracle   hard   memlock    unlimited

3. 磁盘I/O优化

磁盘I/O是Oracle数据库性能的关键瓶颈之一,合理的磁盘I/O配置可以显著提高数据库的性能。

1. I/O调度器配置

对于不同类型的存储设备,应使用不同的I/O调度器:

  • SSD:建议使用nonemq-deadline调度器
  • HDD:建议使用cfq调度器
临时配置I/O调度器
bash
# 查看当前I/O调度器
cat /sys/block/sda/queue/scheduler

# 临时修改I/O调度器
echo "mq-deadline" > /sys/block/sda/queue/scheduler
永久配置I/O调度器

/etc/default/grub文件中添加或修改以下参数:

bash
GRUB_CMDLINE_LINUX="... elevator=mq-deadline"

然后重新生成grub配置:

bash
# 对于BIOS系统
grub2-mkconfig -o /boot/grub2/grub.cfg

# 对于UEFI系统
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

2. 磁盘挂载选项优化

/etc/fstab文件中添加或修改以下挂载选项:

bash
# 示例:优化后的磁盘挂载选项
/dev/sda1 /                     ext4    defaults,noatime,nodiratime    1 1
/dev/sdb1 /u01                  ext4    defaults,noatime,nodiratime,barrier=0,nobh,data=writeback 1 2

常用挂载选项说明:

  • noatime:不更新文件访问时间
  • nodiratime:不更新目录访问时间
  • barrier=0:禁用写屏障(仅适用于有电池备份的RAID控制器)
  • nobh:不使用缓冲区头
  • data=writeback:数据写回模式(提高性能,但可能导致数据丢失)
  • discard:启用TRIM命令(适用于SSD)

3. 磁盘分区对齐

确保磁盘分区对齐,以提高I/O性能,特别是对于SSD和高级格式化硬盘。

4. 网络配置优化

1. 网卡参数配置

/etc/sysconfig/network-scripts/ifcfg-eth0文件中添加或修改以下参数:

bash
ETHTOOL_OPTS="speed 10000 duplex full autoneg off"

2. 启用Jumbo Frames

对于数据仓库等大流量场景,可以考虑启用Jumbo Frames:

bash
# 临时启用Jumbo Frames
ip link set eth0 mtu 9000

# 永久启用Jumbo Frames
# 在/etc/sysconfig/network-scripts/ifcfg-eth0文件中添加
MTU="9000"

5. 安全加固

1. 用户和权限管理

bash
# 创建Oracle用户和组
groupadd -g 54321 oinstall
groupadd -g 54322 dba
groupadd -g 54323 oper
useradd -u 54321 -g oinstall -G dba,oper oracle

# 设置Oracle用户密码
passwd oracle

2. 文件权限配置

/etc/security/limits.conf文件中添加或修改以下参数:

bash
# Oracle用户资源限制
oracle   soft   nproc    2047
oracle   hard   nproc    16384
oracle   soft   nofile   1024
oracle   hard   nofile   65536
oracle   soft   stack    10240
oracle   hard   stack    32768
oracle   soft   memlock  unlimited
oracle   hard   memlock  unlimited

3. 禁用不必要的服务

bash
# 查看当前运行的服务
systemctl list-units --type=service

# 禁用不必要的服务
systemctl disable firewalld
systemctl disable NetworkManager
systemctl disable chronyd
systemctl disable postfix
systemctl disable tuned

4. 启用SELinux和防火墙

根据安全要求,决定是否启用SELinux和防火墙:

bash
# 查看SELinux状态
sestatus

# 临时禁用SELinux
setenforce 0

# 永久禁用SELinux
# 修改/etc/selinux/config文件
SELINUX=disabled

# 启用防火墙
systemctl enable firewalld
systemctl start firewalld

# 配置防火墙规则
firewall-cmd --permanent --add-port=1521/tcp
firewall-cmd --permanent --add-port=5500/tcp
firewall-cmd --reload

6. 服务和进程管理

1. 配置Oracle服务自动启动

/etc/systemd/system/oracle.service文件中添加以下内容:

bash
[Unit]
Description=Oracle Database Service
After=network.target

[Service]
Type=forking
User=oracle
Group=oinstall
Environment=ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1
Environment=ORACLE_SID=orcl

ExecStart=/u01/app/oracle/product/19.3.0/dbhome_1/bin/dbstart $ORACLE_HOME
ExecStop=/u01/app/oracle/product/19.3.0/dbhome_1/bin/dbshut $ORACLE_HOME

Restart=on-failure

[Install]
WantedBy=multi-user.target

然后启用Oracle服务:

bash
systemctl daemon-reload
systemctl enable oracle.service
systemctl start oracle.service

Windows系统优化

Windows也是Oracle数据库的常用操作系统平台,以下是针对Oracle数据库的Windows系统优化配置。

1. 系统配置优化

1. 电源选项配置

将电源选项设置为"高性能",以确保系统始终以最佳性能运行:

cmd
# 使用命令行设置电源选项
powercfg /setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c

2. 虚拟内存配置

合理配置虚拟内存,建议设置为物理内存的1.5-2倍:

  1. 右键点击"计算机",选择"属性"
  2. 点击"高级系统设置"
  3. 在"高级"选项卡中,点击"性能"下的"设置"
  4. 在"高级"选项卡中,点击"虚拟内存"下的"更改"
  5. 取消"自动管理所有驱动器的分页文件大小"
  6. 选择Oracle数据文件所在的驱动器
  7. 选择"自定义大小",设置初始大小和最大值
  8. 点击"设置",然后点击"确定"

3. 关闭不必要的服务

禁用不必要的Windows服务,以减少资源消耗:

  • 打印后台处理程序 (Print Spooler)
  • Windows搜索 (Windows Search)
  • 家庭组列表器 (HomeGroup Listener)
  • 家庭组提供者 (HomeGroup Provider)
  • 媒体中心服务 (Windows Media Center Service Launcher)
  • 远程注册表 (Remote Registry)

2. 内存管理优化

1. 大页内存配置

Windows Server 2008及以后版本支持大页内存(Large Pages),可以提高Oracle数据库的性能:

  1. 启用锁定内存页权限:

    • 打开"本地组策略编辑器"(gpedit.msc)
    • 导航到"计算机配置" > "Windows设置" > "安全设置" > "本地策略" > "用户权限分配"
    • 双击"锁定内存页"
    • 点击"添加用户或组",添加Oracle服务账户
    • 点击"确定"
  2. 在Oracle初始化参数中启用大页内存:

    sql
    ALTER SYSTEM SET USE_LARGE_PAGES=ONLY SCOPE=SPFILE;

3. 磁盘I/O优化

1. 文件系统配置

  • 使用NTFS文件系统
  • 禁用索引服务:右键点击驱动器,选择"属性",取消"允许此驱动器上的文件编制索引以便快速搜索"
  • 禁用磁盘碎片整理计划:右键点击驱动器,选择"属性",点击"工具"选项卡,点击"优化",然后点击"更改设置",取消"按计划运行"

2. I/O调度器配置

Windows默认使用"自动优化"的I/O调度器,对于Oracle数据库,建议设置为"高效模式":

cmd
# 使用命令行设置I/O调度器
fsutil behavior set DisableLastAccess 1

3. 磁盘分区对齐

确保磁盘分区对齐,以提高I/O性能,特别是对于SSD和高级格式化硬盘。

4. 网络配置优化

1. 网卡参数配置

  • 禁用自动协商,手动设置网卡速度和双工模式
  • 启用Jumbo Frames(如果网络支持)
  • 调整TCP/IP参数

2. TCP/IP参数优化

在注册表中添加或修改以下参数:

reg
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpTimedWaitDelay"=dword:0000001e          # 30
"MaxUserPort"=dword:0000fffe               # 65534
"TcpNumConnections"=dword:00fffffe          # 16777214
"TcpMaxDataRetransmissions"=dword:00000005  # 5
"TcpWindowSize"=dword:00040000             # 262144字节
"GlobalMaxTcpWindowSize"=dword:00040000     # 262144字节
"TcpAckFrequency"=dword:00000001           # 1个数据包确认一次
"TcpDelAckTicks"=dword:00000000             # 立即确认

5. 安全加固

1. 用户和权限管理

  • 创建专门的Oracle服务账户,避免使用管理员账户
  • 限制Oracle服务账户的权限,只授予必要的权限

2. 防火墙配置

  • 启用Windows防火墙
  • 配置防火墙规则,只允许必要的端口访问(如1521、5500等)

3. 防病毒软件配置

  • 排除Oracle软件目录和数据文件目录,避免防病毒软件扫描这些目录
  • 调整防病毒软件的扫描计划,避免在业务高峰期进行扫描

不同Oracle版本的操作系统要求差异

Oracle 19c 操作系统要求

Linux系统

  • 支持的Linux发行版

    • Red Hat Enterprise Linux 7.4-7.9, 8.1-8.5
    • Oracle Linux 7.4-7.9, 8.1-8.5
    • SUSE Linux Enterprise Server 12 SP4-SP5, 15 SP1-SP3
  • 内核版本要求

    • RHEL/Oracle Linux 7.x: 3.10.0-693.el7.x86_64或更高
    • RHEL/Oracle Linux 8.x: 4.18.0-147.el8.x86_64或更高

Windows系统

  • 支持的Windows版本
    • Windows Server 2016 Standard, Datacenter
    • Windows Server 2019 Standard, Datacenter
    • Windows Server 2022 Standard, Datacenter

Oracle 21c 操作系统要求

Linux系统

  • 支持的Linux发行版

    • Red Hat Enterprise Linux 7.9, 8.2-8.6, 9.0-9.1
    • Oracle Linux 7.9, 8.2-8.6, 9.0-9.1
    • SUSE Linux Enterprise Server 12 SP5, 15 SP2-SP4
  • 内核版本要求

    • RHEL/Oracle Linux 7.x: 3.10.0-1160.el7.x86_64或更高
    • RHEL/Oracle Linux 8.x: 4.18.0-305.el8.x86_64或更高
    • RHEL/Oracle Linux 9.x: 5.14.0-70.13.1.el9_0.x86_64或更高

Windows系统

  • 支持的Windows版本
    • Windows Server 2019 Standard, Datacenter
    • Windows Server 2022 Standard, Datacenter

操作系统优化的最佳实践

  1. 遵循Oracle官方文档:严格按照Oracle官方文档中针对不同版本和平台的系统要求进行配置
  2. 测试优化效果:在测试环境中充分测试优化效果,然后再应用到生产环境
  3. 监控系统性能:使用操作系统自带的监控工具(如Linux的top、vmstat、iostat,Windows的性能监视器)监控系统性能
  4. 定期审查配置:定期审查操作系统配置,确保它们仍然符合当前的业务需求
  5. 文档化所有变更:详细记录每次优化变更的原因、内容和效果
  6. 保持系统更新:定期应用操作系统补丁和更新,确保系统的安全性和稳定性
  7. 资源隔离:使用虚拟化或容器技术,将Oracle数据库与其他应用程序隔离开来
  8. 备份系统配置:定期备份操作系统配置,以便在出现问题时快速恢复

操作系统优化的实际案例

案例1:Linux系统大页内存优化

问题:某OLTP系统使用了8G的SGA,但是内存管理开销较大,导致CPU利用率较高

分析:通过vmstat命令发现,系统存在大量的页面换入换出操作,CPU的系统时间占比较高

优化方案

  1. 配置4096个2MB的大页内存
  2. 启用Oracle的大页内存支持
  3. 配置Oracle用户的内存限制

优化效果

  • CPU利用率从70%降低到40%
  • 系统时间占比从30%降低到10%
  • 数据库响应时间从平均200ms降低到100ms

案例2:Windows系统磁盘I/O优化

问题:某数据仓库系统在执行ETL作业时,磁盘I/O等待时间较长,导致作业执行时间长

分析:通过Windows性能监视器发现,磁盘的平均队列长度达到了20,I/O等待时间占比超过50%

优化方案

  1. 将电源选项设置为"高性能"
  2. 优化虚拟内存配置
  3. 禁用磁盘索引服务
  4. 禁用磁盘碎片整理计划
  5. 调整TCP/IP参数

优化效果

  • 磁盘平均队列长度降低到5
  • I/O等待时间占比降低到10%
  • ETL作业执行时间从平均6小时降低到3小时

常见问题(FAQ)

Q1: 如何确定操作系统是否需要优化?

A: 可以通过以下方法确定操作系统是否需要优化:

  1. 监控系统性能指标,如CPU利用率、内存使用率、磁盘I/O等待时间、网络延迟等
  2. 分析Oracle数据库的等待事件,如"db file sequential read"、"db file scattered read"、"direct path read"等
  3. 比较系统性能与Oracle官方基准测试结果
  4. 根据业务需求和预期性能目标,评估当前系统是否满足要求

Q2: 如何监控Linux系统的性能?

A: 可以使用以下Linux系统监控工具:

  • top:实时监控系统CPU、内存、进程等信息
  • vmstat:监控虚拟内存、进程、CPU等信息
  • iostat:监控磁盘I/O性能
  • mpstat:监控CPU使用情况
  • sar:收集、报告和保存系统活动信息
  • netstat:监控网络连接和统计信息
  • nmon:综合监控工具,可生成报告

Q3: 如何监控Windows系统的性能?

A: 可以使用以下Windows系统监控工具:

  • 性能监视器(Performance Monitor):实时监控系统性能指标
  • 资源监视器(Resource Monitor):监控CPU、内存、磁盘I/O和网络使用情况
  • 事件查看器(Event Viewer):查看系统事件日志
  • 任务管理器(Task Manager):实时监控系统资源使用情况

Q4: 大页内存和透明大页有什么区别?

A: 大页内存(HugePages)和透明大页(Transparent HugePages)的主要区别:

  • 大页内存:需要手动配置,Oracle数据库明确支持,性能更好
  • 透明大页:自动管理,无需手动配置,但Oracle数据库不推荐使用,可能导致性能问题

Oracle官方建议禁用透明大页:

bash
# 查看透明大页状态
cat /sys/kernel/mm/transparent_hugepage/enabled

# 临时禁用透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

# 永久禁用透明大页
# 在/etc/default/grub文件中添加
GRUB_CMDLINE_LINUX="... transparent_hugepage=never"

Q5: 如何优化Oracle数据库的网络性能?

A: 可以通过以下方法优化Oracle数据库的网络性能:

  1. 优化操作系统的网络参数,如TCP缓冲区大小、端口范围等
  2. 启用Jumbo Frames(如果网络支持)
  3. 配置合适的网卡速度和双工模式
  4. 使用高速网络设备,如10G或25G网卡
  5. 优化Oracle的网络参数,如SQLNET.RECV_TIMEOUT、SQLNET.SEND_TIMEOUT等
  6. 考虑使用Oracle RAC或Data Guard等技术,减少网络流量

Q6: 如何在不重启系统的情况下应用操作系统优化?

A: 大部分操作系统优化可以在不重启系统的情况下应用:

  • Linux

    • 内核参数:使用sysctl -p命令应用
    • 大页内存:配置后需要重启Oracle数据库
    • I/O调度器:可以临时修改,永久修改需要重启系统
  • Windows

    • 服务配置:可以立即应用
    • 注册表修改:大部分需要重启系统
    • 网络参数:部分需要重启网络服务

Q7: 如何平衡操作系统的性能和安全性?

A: 可以通过以下方法平衡操作系统的性能和安全性:

  1. 仅启用必要的服务和端口
  2. 使用防火墙和入侵检测系统保护系统安全
  3. 定期应用操作系统补丁和更新
  4. 配置合理的用户权限和访问控制
  5. 在测试环境中充分测试安全配置对性能的影响
  6. 根据业务需求和安全要求,调整安全策略

Q8: 如何备份操作系统配置?

A: 可以通过以下方法备份操作系统配置:

  • Linux

    • 备份/etc目录下的配置文件
    • 使用tar或rsync命令备份系统配置
    • 使用clonezilla等工具创建系统镜像
  • Windows

    • 使用系统还原点
    • 使用Windows Server Backup创建系统备份
    • 使用第三方备份工具创建系统镜像

操作系统优化的总结

操作系统优化是Oracle数据库性能优化的重要组成部分,合理的操作系统配置可以显著提高数据库的性能、稳定性和安全性。无论是Linux还是Windows系统,都需要根据Oracle数据库的版本和负载类型,进行针对性的优化配置。

在进行操作系统优化时,DBA应该遵循以下原则:

  1. 基于Oracle官方要求进行配置
  2. 根据实际负载类型进行优化
  3. 在测试环境中充分测试优化效果
  4. 监控系统性能,及时调整优化策略
  5. 文档化所有优化变更
  6. 保持系统更新和安全

通过不断的学习和实践,DBA可以积累丰富的操作系统优化经验,为企业的Oracle数据库系统提供更好的支持和保障。