热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

hugepages使用出现kswapd导致系统负载突然上升

在运行Oracle数据库的linux服务器上,某个时间段的每分钟负载会突然上升到40以上,在进程队列里看到kswapd0出现,导致数据库

在运行Oracle 数据库的linux 服务器上,某个时间段的每分钟负载会突然上升到40 以上,在进程队列里看到kswapd0 出现,导致数据库

在运行Oracle 数据库的linux 服务器上,某个时间段的每分钟负载会突然上升到40 以上,在进程队列里看到kswapd0 出现,导致数据库无响应,持续时间数分钟。
对于应用而言,这个时间段有明显的停滞感,像系统已经挂掉了一样。
如果这是发生在Oracle RAC 环境中某一个节点上,那么这个节点就可能会重启。
这属于非常严重和致命的问题。

1. 问题
环境是这样,数据库服务器的内存96GB ,操作系统linux RedHat 5 ,采用hugepages 管理部分内存,运行一个数据库实例,数据库系统版本为10.2.0.4 。
数据库实例中sga_max_size 的值为48GB, pga_aggregate_target 的值为24GB 。
还有个实例为ASM ,用于存储数据库的数据文件等。
性能摇摆期间的top 显示的结果如下: top - 13:21:11 up 49 days, 21:52, 4 users, load average: 42.76, 14.42, 6.12
Tasks: 471 total, 26 running, 444 sleeping, 0 stopped, 1 zombie
Cpu(s): 87.2%us, 12.2%sy, 0.0%ni, 0.1%id, 0.1%wa, 0.1%hi, 0.2%si, 0.0%st
Mem: 98989932k total, 98152840k used, 837092k free, 2056k buffers
Swap: 50331636k total, 12554316k used, 37777320k free, 37715224k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1057 root 20 -5 0 0 0 R 100.2 0.0 991:39.65 [kswapd0] zzz ***Fri Jun 29 13:21:35 CST 2012 top - 13:21:39 up 49 days, 21:52, 4 users, load average: 28.99, 13.85, 6.19
Tasks: 471 total, 2 running, 468 sleeping, 0 stopped, 1 zombie
Cpu(s): 0.2%us, 8.4%sy, 0.0%ni, 91.3%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 98989932k total, 98104680k used, 885252k free, 3028k buffers
Swap: 50331636k total, 12801004k used, 37530632k free, 37606456k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1057 root 20 -5 0 0 0 R 100.3 0.0 992:07.44 [ kswapd0 ]
12530 root 15 0 13032 1400 812 R 0.7 0.0 0:00.03 top -b -c -n 2
1376 root 10 -5 0 0 0 S 0.3 0.0 22:00.23 [scsi_eh_1] 可以明显看到服务器的一分钟负载上升的很厉害,都到42 了,而正常才4 左右。在运行的进程队列中,看到 kswapd0 。
操作系统每过一定时间就会唤醒kswapd ,看看内存是否紧张,如果不紧张,则睡眠,在 kswapd 中,有2 个阀值, pages_hige和pages_low,当空闲内存页的数量低于 pages_low 的时候, kswapd进程就会扫描内存并且每次释放出32 个free pages,直到 free page 的数量到达pages_high. 通过检查vmstat 的输出结果,发现在那个时间段内,系统的页面换入换成现象很严重。
zzz ***Fri Jun 29 13:22:05 CST 2012
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
7 0 13022188 919216 3064 37429916 27 17 203 559 0 0 3 1 95 1 0
4 0 13040224 914712 3116 37411924 680 2196 1450 2844 1387 1654 13 10 77 0 0
2 0 13058536 919060 3216 37395064 104 1444 1118 1492 1235 839 16 9 75 0 0
zzz ***Fri Jun 29 13:22:35 CST 2012
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
9 0 13573224 912300 3356 36885376 27 17 203 559 0 0 3 1 95 1 0
8 0 13573088 913408 3368 36885224 276 0 3740 5643 1643 7707 31 9 60 0 0
1 0 13572892 913300 3368 36885920 252 0 374 3955 2209 9632 14 9 77 0 0 就是说,问题是内存紧张了,导致了交换分区频繁使用到。kswapd0 进程需要换入换出虚拟内存磁盘空间,导致了系统出现短时间摇摆。
操作系统的物理内存有25576 个page 没有被使用,所以肯定会有kswap 进程执行虚拟内存换页操作。 2. 分析
问题既然发生在内存使用上,但我们的服务器物理内存配置是96GB ,数据库实例的内存配置也是合理的。
但在vmstat 确实有交换分区的换页情况发生。
我们需要分析的是,这96GB 的内存都是如何使用的呢?
在环境介绍中,我们介绍了使用大内存管理模式管理内存的。因此,我们首先查询系统内存信息中关于大内存的使用情况。
[root@db3 ~]# cat /proc/meminfo |grep -i huge
HugePages_Total: 25576
HugePages_Free: 25517
HugePages_Rsvd: 4
Hugepagesize: 2048 kB 哇,看到结果大吃一惊。大内存有25517 个页面没有使用,一个页面大小是2MB ,也就是说有51034MB 内存被大内存管理机制限制了,属于空闲状态,而系统上其他进程也无法使用到。只有59 个页面合计118MB 的内存使用到了。
(注,为什么新进程如何使用到该内存区域,而是使用虚拟内存空间呢?这是一个疑问。可能是新数据库实例的SGA 已经使用了剩余的48 内存,还不够用,所以用到虚拟内存。) 在系统配置中,hugepages 的大小设置为25576 ,计48GB 内存,是物理内存的一半。
[root@db3 ~]# sysctl -p
vm.nr_hugepages = 25576 使用ipcs –m 看到oracle 用户下使用的共享内存段如下所示:
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0xb0af65c0 3047451 oracle 600 132120576 13
0x4507bd98 3702814 oracle 640 51541704704 132
最大的51541704704 字节,计49154MB 。这个SGA 中所有 'shared_pool_size' , 'large_pool_size' , 'java_pool_size' , 'streams_pool_size' , 'db_cache_size' 大小之和。
Oracle 用户的共享内存段完全没有使用到hugepages 。 再检查系统日志,发现之前有一个oracle 的实例使用到该hugepages ,而现在的实例是后来启动的,所以使用到另外的内存。
后来前一个实例关闭了,但hugepages 中的内存空间却一直空闲下来,新的实例也不能使用到这个内存空间。 3. 解决
问题分析到这里,,其实已经有解决方法了。
我们重启了一下数据库实例,就可以使用该hugepages 内存空间。
如果实例不能重启,我们也可以通过设置nr_hugepages 的值降低设置。但这只是个人建议,不排除有新的问题出现。 4. 技术hugepages
如果需要增大hugepages 大小,需要重启操作系统。
如果您认为这就是一个内存参数值,可以使用sysctl –w 修改的。这点是不正确的。这里涉及到内存管理方面,hugepages 需要大量连续的内存区域,否则严重的内存碎片会影响到系统的性能。 linux 的hugepages 技术随着近年大内存服务器陆续上市,逐步推广使用,因此关于hugepages 的问题也随着而来。
本文是在hugepages 使用中遇到的问题的解决分析总结。


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
author-avatar
星空下的舞者j
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有