Linux内核参数遇上Oracle:初学者的“避坑宝典”
点击上方蓝字,关注我们
想学会更多实用技巧,欢迎加入青学会MOP技术社区(实名社区)。
加入方法:公众号后台回复关键字“加入”获取小助手微信,添加后登记入会。
同时欢迎大家在评论区留言互动交流!社区会不定期举行相关的抽奖、公开分享活动。
如果你有想了解的知识点希望我们发文可以后台私信。
最近联合几个 Oracle ACE技术专家 开通了一个付费微信群,都是具有10多年金融、医疗、制造业10年以上的一线专家,坑位费399/人,无限期,目前群内近150人。加群后会有一些福利(分享各类技术文档,干货资源,问题解答等等),更有特邀嘉宾会定期在群内直播,解读AWR,快问快答等!有问题我们尽量都解答,毕竟399不能都解决所有问题。有兴趣联系微:ywu0613
内部知识库正在筹建中,不止有oracle!
正文开始
在Oracle数据库的运维中,操作系统参数的配置往往起着至关重要的作用。特别是对于Linux系统,一些关键的内核参数设置直接影响到数据库的性能和稳定性。今天,我们就来聊聊这些看似复杂却非常重要的参数,希望能帮助初学者更好地理解和掌握它们。
共享内存参数:kernel.shmall 和 kernel.shmmax
想象一下,你有一个巨大的储物柜(物理内存),而Oracle数据库需要从中分配一些空间来存储临时数据(共享内存)。这就涉及到了两个关键参数:kernel.shmall 和 kernel.shmmax。
** kernel.shmall**:它表示系统中可以分配的共享内存总量,单位是“页”。简单来说,它决定了你的储物柜能被分成多少个小格子。** kernel.shmmax**:这个参数则表示单个共享内存段的最大大小,单位是“字节”。它决定了每个小格子的最大容量。
这两个参数的值需要根据系统的物理内存和页面大小来设置。通常的计算公式是:
kernel.shmall = 物理内存页数kernel.shmmax = (物理内存页数 / 2) × 页面大小
举个例子,如果你的系统有128GB的物理内存,页面大小为4KB,那么:
物理内存页数 = 128GB / 4KB = 33554432 页 kernel.shmall = 33554432kernel.shmmax = (33554432 / 2) × 4KB = 6710886KB4
通过以下命令可以查看和计算这些值:
shell> echo $(expr $(getconf _PHYS_PAGES))
shell> echo $(expr $(getconf _PHYS_PAGES) / 2 \* $(getconf PAGE_SIZE))
文件句柄与异步I/O参数
在Linux系统中,文件句柄是用来管理文件和网络连接的重要资源。如果文件句柄的数量不足,可能会导致“Too many open files”或“Socket/File: Can't open so many files”等错误。
** fs.file-max**:这个参数表示系统能够打开的最大文件句柄数量。如果达到上限,就会出现上述错误。
另外,对于Oracle数据库的异步I/O操作,还有一个重要的参数:
** fs.aio-max-nr**:它表示系统能够支持的最大异步I/O请求数量。如果超过这个值,可能会导致“ORA-27090: Unable to reserve kernel resources for asynchronous disk I/O”错误。
网络参数:套接字缓冲区与端口范围
Oracle数据库依赖于网络通信,因此网络参数的配置也非常关键。
net.core.rmem_default和 **net.core.rmem_max**:这两个参数分别表示接收套接字缓冲区的默认值和最大值。它们决定了接收数据时的缓冲区大小。net.core.wmem_default和 **net.core.wmem_max**:这两个参数则分别表示发送套接字缓冲区的默认值和最大值。
此外,还有一个参数:
** ip_local_port_range**:它表示系统允许使用的端口范围。如果端口范围过小,可能会导致网络连接问题。
用户资源限制:limits.conf
在Linux系统中,limits.conf 文件用于限制用户可以使用的资源,例如文件数、线程数和内存大小等。对于Oracle数据库用户(通常是oracle用户),限制这些需要合理配置。
例如:
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
** soft**:这是一个警告值,当资源使用接近这个值时,系统会发出警告。** hard**:这是一个硬性限制,一旦超过这个值,系统就会报错。
Linux内存大页配置:提升内存管理效率
随着内存容量的不断增加,传统的4KB小页面管理方式可能会导致内存管理效率低下。为了解决这个问题,Linux引入了内存大页(HugePages)技术。
为什么需要内存大页?
假设你的系统有512GB的物理内存,以4KB页面为单位,虚拟内存将拥有超过1亿个页面!无论是Hash还是索引树,管理这么多页面的成本都非常高。而内存大页可以将页面大小从4KB提升到16MB甚至更大,从而显著减少页面数量,提高内存管理效率。
如何配置内存大页?
以RHEL6(同样适用于RHEL7)为例,以下是配置内存大页的步骤:
检查操作系统版本和内核参数
使用以下命令查看系统版本和内核信息:
shell> more /etc/redhat-release
shell> uname -a
查看当前HugePages配置
使用以下命令查看当前的HugePages配置:
shell> grep Huge /proc/meminfo
如果HugePages_Total为0,说明当前未配置HugePages。
修改用户的memlock限制
编辑/etc/security/limits.conf文件,设置用户的memlock限制。例如,如果系统内存为64GB,可以设置为:
* soft memlock 60397977
* hard memlock 60397977
单位为KB,memlock的大小应略大于系统上所有SGA的总和。
禁用AMM(自动内存管理)
如果你的Oracle版本是11g,需要禁用AMM,因为它与HugePages不兼容。可以通过以下命令禁用AMM:
SQL> ALTERSYSTEMRESET memory_target SCOPE=SPFILE;
SQL> ALTERSYSTEMRESET memory_max_target SCOPE=SPFILE;
SQL> ALTERSYSTEMSET sga_target=<n>g SCOPE=SPFILE;
SQL> ALTERSYSTEMSET pga_aggregate_target=<n>g SCOPE=SPFILE;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
计算vm.nr_hugepages的值
简单的计算公式是:总SGA大小 / 大页大小 + 100。例如,如果主机内存为128GB,计划使用70GB作为SGA共享内存,大页大小为2MB,则:
vm.nr_hugepages = (70 × 1024) / 2 + 100 = 35840
也可以使用Oracle提供的脚本hugepages_settings.sh来自动计算这个值。
设置vm.nr_hugepages参数
编辑/etc/sysctl.conf文件,添加以下内容:
vm.nr_hugepages = 35840
然后运行以下命令使配置生效:
shell> sysctl -p
重启主机验证
重启主机后,使用以下命令验证HugePages的配置:
shell> grep Huge /proc/meminfo
正常情况下,HugePages_Free的值应小于HugePages_Total,HugePages_Rsvd的值应为非零值。
操作系统参数的配置对于Oracle数据库的性能和稳定性至关重要。通过合理设置共享内存参数、文件句柄限制、网络参数以及内存大页配置,可以显著提升数据库的运行效率。希望这篇文章能帮助初学者更好地理解和掌握这些知识,让你在Oracle数据库运维的道路上迈出坚实的一步。如果你还有其他问题,欢迎在评论区留言,我们一起探讨!
往期文章回顾
MOP社区新闻
金仓专栏
告别繁琐!KingbaseES v9数据库一键安装-青学会&金仓专栏(1)
KingbaseES v9数据库Docker安装-青学会&金仓专栏(2)
DBA实战小技巧
实战:记一次RAC故障排查
DBA实战运维小技巧安装篇(一)Oracle 主流版本不同架构下的静默安装指南
DBA实战运维小技巧存储篇(一)根目录满了如何处理
DBA实战运维小技巧存储篇(二)打包迁移单机数据库至新存储
MOP社区投稿-内核开发
简单解析 IvorySQL 增强 Oracle xml 兼容能力的原理
简单讨论 PostgreSQL C语言拓展函数返回数据表的方式
简单分析 pg_config 程序的作用与原理
Redis 日志机制简介(一):SlowLog
Redis 日志机制简介(二):AOF 日志
Redis 日志机制简介(三):RDB 日志
pg_cron插件使用介绍
Redis 的指令表实现机制简介
pg几款源码工具介绍
Redis 事务功能简介