Linux标准大页没有使用案例分享
背景介绍
一套在RHEL的集群上运行的Oracle实例,是用systemd服务启动Oracle实例的(方便集群的切换操作).在测试过程中发现标准大页没有被用上.
具体情况如下所示:
$ grep HugePages /proc/meminfo
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 2034
HugePages_Free: 2034
HugePages_Rsvd: 0
HugePages_Surp: 0
原因分析
如上所示,HugePages_Free的值为2034, HugePages_Total的值也是2034,也就是说标准大页完全没有使用.
Linux服务器的基本信息如下
$ more /etc/redhat-release
Red Hat Enterprise Linux release 8.10 (Ootpa)
$ free -m
total used free shared buff/cache available
Mem: 11697 4929 5986 17 780 6612
Swap: 16383 0 16383
检查数据库的参数如下, 完全符合条件:
SQL> select banner from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
SQL> col name for a20;
SQL> col value for a32;
SQL> select name, value from v$parameter
2 where name in ('memory_target','sga_target','use_large_pages');
NAME VALUE
-------------------- --------------------------------
use_large_pages TRUE
sga_target 4261412864
memory_target 0
SQL>
内核参数vm.nr_hugepages也是正确设置的,具体如下所示
$ grep vm.nr_hugepages /etc/sysctl.conf
vm.nr_hugepages = 2034
$ ./hugepages_settings.sh
This script is provided by Doc ID 401749.1 from My Oracle Support
(http://support.oracle.com) where it is intended to compute values for
the recommended HugePages/HugeTLB configuration for the current shared
memory segments on Oracle Linux. Before proceeding with the execution please note following:
* For ASM instance, it needs to configure ASMM instead of AMM.
* The 'pga_aggregate_target' is outside the SGA and
you should accommodate this while calculating the overall size.
* In case you changes the DB SGA size,
as the new SGA will not fit in the previous HugePages configuration,
it had better disable the whole HugePages,
start the DB with new SGA size and run the script again.
And make sure that:
* Oracle Database instance(s) are up and running
* Oracle Database 11g Automatic Memory Management (AMM) is not setup
(See Doc ID 749851.1)
* The shared memory segments can be listed by command:
# ipcs -m
Press Enter to proceed...
Recommended setting: vm.nr_hugepages = 2034
资源限制配置文件limits.conf中的memlock的设置也是正确的.如下所示:
# grep memlock /etc/security/limits.conf
# - memlock - max locked-in-memory address space (KB)
oracle soft memlock 10485760
oracle hard memlock 10485760
# su - oracle
Last login: Fri Aug 8 13:54:36 CST 2025 on pts/0
$ ulimit -l
10485760
$ grep memlock /etc/security/limits.conf
# - memlock - max locked-in-memory address space (KB)
oracle soft memlock 10485760
oracle hard memlock 10485760
很是纳闷为什么配置都是正确,但是Oracle就是不用标准大页,于是重启一下Oracle实例,在告警日志中发现了蛛丝马迹,如下所示:
**********************************************************************
2025-08-08T13:50:16.662256+08:00
Dump of system resources acquired for SHARED GLOBAL AREA (SGA)
2025-08-08T13:50:16.662285+08:00
Domain name: system.slice/bpsdbsvr.service
2025-08-08T13:50:16.662302+08:00
Per process system memlock (soft) limit = 64K
2025-08-08T13:50:16.662318+08:00
Expected per process system memlock (soft) limit to lock
instance MAX SHARED GLOBAL AREA (SGA) into memory: 4066M
2025-08-08T13:50:16.662356+08:00
Available system pagesizes:
4K, 2048K
2025-08-08T13:50:16.662387+08:00
Supported system pagesize(s):
2025-08-08T13:50:16.662404+08:00
PAGESIZE AVAILABLE_PAGES EXPECTED_PAGES ALLOCATED_PAGES ERROR(s)
2025-08-08T13:50:16.662421+08:00
4K Configured 11 1040395 NONE
2025-08-08T13:50:16.662450+08:00
2048K 2034 2033 0 NONE
2025-08-08T13:50:16.662466+08:00
RECOMMENDATION:
2025-08-08T13:50:16.662483+08:00
1. Increase per process memlock (soft) limit to at least 4066MB
to lock 100% of SHARED GLOBAL AREA (SGA) pages into physical memory
2025-08-08T13:50:16.662514+08:00
**********************************************************************
检查Oracle进程的限制,发现进程的Max locked memory为65536,也就是64K.
# oracle_pid=$(pgrep -f "_pmon_")
# cat /proc/$oracle_pid/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 33554432 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 46635 46635 processes
Max open files 262144 262144 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 46635 46635 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
也就是说systemd服务启动Oracle实例时,由于某些原因memlock依然是64K,即日志中的提示"Per process system memlock (soft) limit = 64K"
于是改用手工启动数据库实例,检查发现标准大页被Oracle使用了,但是systemd服务启动Oracle实例就会出现上面标准大页不被使用的情况
$ grep HugePages /proc/meminfo
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 2034
HugePages_Free: 4
HugePages_Rsvd: 3
HugePages_Surp: 0
后面和同事查资料,发现systemctl启动的服务默认不读取资源限制配置文件(limits.conf). limits.conf中的限制是针对用户会话级别的资源控制,
由PAM模块在用户登录时生效。而systemd服务是通过systemd进程直接启动的,属于非登录会话,默认不会触发PAM的pam_limits.so模块,
因此/etc/security/limits.conf 中为oracle用户设置的所有资源限制都不会自动应用到通过 systemd 服务启动的进程.
解决方案
如果想让systemd服务启动Oracle实例时memlock限制生效,可以在oracle.service 中直接配置 memlock 限制或者通过PAM让服务读取limits.conf.
网上资料推荐直接在systemd服务文件中配置(这是 systemd 推荐的方式,比依赖limits.conf更可靠), 如下所示:
oracle.service原始的配置
[Unit]
Description=Oracle Database Service
After=network.target
[Service]
Type=forking
User=oracle
Group=oinstall
ExecStart=/home/oracle/xxxx/ora19c.sh start
ExecStop=/home/oracle/xxxx/ora19c.sh shutdown
StandardOutput=append:/var/log/rhcs_resource_logs/xxx/xxx.log
RemainAfterExit=yes
KillMode=none
[Install]
WantedBy=multi-user.target
注意: oracle.service配置做了一点混淆,不影响大家理解.
oracle.service修改后配置
[Unit]
Description=Oracle Database Service
After=network.target
[Service]
Type=forking
User=oracle
Group=oinstall
ExecStart=/home/oracle/xxxx/ora19c.sh start
ExecStop=/home/oracle/xxxx/ora19c.sh shutdown
StandardOutput=append:/var/log/rhcs_resource_logs/xxx/xxx.log
RemainAfterExit=yes
KillMode=none
# oracle /etc/security/limits.conf
LimitNPROC=16384
LimitNOFILE=65536
LimitSTACK=10485760
LimitMEMLOCK=10737418240
[Install]
WantedBy=multi-user.target
这样配置后,通过systemd服务启动Oracle实例就能正常使用标准大页了.问题Troubleshooting完美解决. 究其原因还是因为对Linux的systemd服务了解得不够多.不够深入!
Linux标准大页没有使用案例分享的更多相关文章
- Linux内存大页设置
实际环境中,遇到3次由于内存大页设置参数不合理或者错误,导致系统内存不足,或者数据库内存不足的问题. 按照如下方式,推荐设置大页参考下发设置! 参考HugePages on Oracle Linux ...
- 禁用Linux透明大页
Oracle 安装时官方建议关闭Linux的透明大页,防止内存延迟分配导致的性能问题 https://docs.oracle.com/cd/E11882_01/install.112/e47689/p ...
- OpenStack 高性能虚拟机之大页内存
目录 文章目录 目录 前文列表 虚拟存储器系统 页式虚拟存储器 大页内存 Linux 的大页内存 大页的实现原理 大页内存配置 透明巨型页 THP 大页面对内存的影响 Nova 虚拟机的大页内存设置 ...
- LINUX下为ORACLE数据库设置大页--hugepage
在Linux中配置hugepage可以提高oracle的性能,减少oracle sga的页交换,类似于aix中的lagepage. 为什么 使用大页? LINUX内存的默认块大小是4K如果SGA为:1 ...
- Linux HugePages及MySQL 大页配置
http://blog.csdn.net/dba_waterbin/article/details/9669929 ㈠ HugePages简介 HugePages是 ...
- 转:// LINUX下为ORACLE数据库设置大页--hugepage
一.在解释什么情况下需要开启大页和为啥需要开启大页前先了解下Linux下页的相关的知识:以下的内容是基于32位的系统,4K的内存页大小做出的计算1)目录表,用来存放页表的位置,共包含1024个目录en ...
- Linux大页内存管理等---菜鸟初学
1. 查看linux的内存情况: free -m 2. 查看是否开启大页的方法: cat /proc/meminfo |grep -i HugePage AnonHugePages: 276480 k ...
- Linux关闭透明大页配置
一.为何要关闭透明大页 A--MOS获取 . #翻译 由于透明超大页面已知会导致意外的节点重新启动并导致RAC出现性能问题,因此Oracle强烈建议禁用透明超大页面. 另外,即使在单实例数据库环境 ...
- [转帖] 学习 Linux 大页的内存知识
一.在解释什么情况下需要开启大页和为啥需要开启大页前先了解下Linux下页的相关的知识:以下的内容是基于32位的系统,4K的内存页大小做出的计算1)目录表,用来存放页表的位置,共包含1024个目录en ...
- 老李案例分享:Weblogic性能优化案例
老李案例分享:Weblogic性能优化案例 POPTEST的测试技术交流qq群:450192312 网站应用首页大小在130K左右,在之前的测试过程中,其百用户并发的平均响应能力在6.5秒,性能优化后 ...
随机推荐
- JuiceFS 企业版 5.2:迈入千亿文件时代,稳定性与性能再升级,首次支持 Windows 客户端
JuiceFS 企业版 5.2 版本近日发布,文件管理规模迈入千亿级.此次升级重点提升了超大规模集群的稳定性,优化了分布式缓存的网络性能,并增强了系统的易用性与安全性,旨在支持高并发访问等复杂的高性能 ...
- 股票技术面分析方法-K线图
看涨吞没形态 看跌吞没形态 启明星形态 图形信号:看涨信号.第三根K线实体越长,看涨信号越强. 关键要素: 第二根K线是纺锤线或十字星 第三根K线向上能覆盖第一根K线的大半部分实体 黄昏星 ...
- QMediaPlayer+QVideoWidget+QAudioOutput实现一个简单视频播放器-Qt6.8
此篇是我在观看使用nginx搭建音视频点播服务器 - seedoubleu - 博客园后,想着使用qt widget写的一个简单播放器 完成nginx搭建音视频点播服务器的话,我推荐使用ffplay进 ...
- CF1983E I Love Balls
Problem - E - Codeforces 爱丽丝和鲍勃玩摸球游戏.有 \(n\) 个球,其中 \(k\) 个是特殊球.每个球都有其价值. 他们轮流且不放回地摸球,每回合随机摸一个球并获得该球的 ...
- 钓鱼攻击(phishing)详解和实现过程
钓鱼攻击 定义:钓鱼攻击是一种常见的网络攻击手段,攻击者通过伪装成合法的网站.邮件或信息,诱骗用户提供敏感信息,如用户名.密码.银行卡号等,从而达到非法获取用户数据或进行欺诈的目的. 网络钓鱼(phi ...
- .net 实现 CQRS 的的一个设想
一.先总结一下以前的经验 本人前公司项目开发基本算是CQRS的 后台和数据接口用.net(后大部分转java),前台nodejs 数据统计用hive 但是涉及列表含模糊搜索基本都是交给站内搜索团队,他 ...
- Hack 说明
在今天的模拟赛中,部分同学由于对出现某个数在模 \(1000000007\) 意义下为 \(0\) 的情况不规范被 Hack. Hack 原理:开始时有 \(2\) 个 \(1\),先都加到 \(10 ...
- Blazor学习之旅:文章目录索引
1 Blazor学习路径 微软学习社区(Microsoft Learn)早在两三年前就推出了一门学习路径<使用Blazor构建Web应用程序>,我们可以学到如何通过Blazor Web应用 ...
- net core api 跨域 Cors 找不到 “Access-Control-Allow-Origin”
public static void AddCorsSetup(this IServiceCollection services) { services.AddCors(c => { //允许任 ...
- SQL Server 游标写入数据
https://www.cnblogs.com/wanghonghu/p/4093411.html set identity_insert 表名 ON --允许对自增列Id插入指定数据 insert ...