009_关闭linux的THP
背景:
公司某个大型业务系统反馈最近数据库服务器总是宕机(此处描述不准确,后面解释),最后,客户、运维人员都觉得实在是忍无可忍了,项目经理打电话找到我问是否能帮忙诊断一下,刚好第二天要去现场沟通另外一个系统的测试需求,于是答应第二天顺便看一下。
------------------------------------
排查解决过程:
第二天来到现场,正在沟通需求的时候,运维人员突然说,操作又开始卡了,
于是连上服务器,先用top大概看了一下资源的使用情况,此时CPU已经基本上满载了,而且可以发现用户态的CPU占比并不高,大部分时间竟然都是内核态的CPU占用,
当时我开始怀疑可能是数据库服务对底层的某个调用出了问题,有死循环?
于是立刻用perf top大概看了一下,
发现比重较大的是自旋锁还有一个compaction_alloc,内存碎片整理?
从该信息判断,可能是内存的什么操作导致了很多线程在临界区各种等待。
为了进一步弄明白具体是什么操作导致,于是对内核参数的调用栈进行取样
perf record -a -g -F 1000 sleep 60
“-g'的意思是按照调用关系存储数据;“-F 1000 sleep 60”表示按照每秒取1000个样本的频率取一分钟。
取完样后,使用perf report -g打开取样的数据,可以看到如下的调用栈:
很明显这个自旋锁是由内存页的碎片整理导致,而进行碎片整理是由hugepage导致的,
看到这里的时候,我突然想起来linux的一个THP特性,貌似是kelnel 2.6.38版本后开始加进来的,
这个特性实际上就是会把这种巨页的使用对用户透明,用户不需要再进行巨页的配置,
内存会自动将连续的512个普通页作为一个巨页处理,
正如我们在前面的调用栈看到的,这种特性就需要对内存碎片进行整理,
所以我们看到的现象是内存碎片页移动导致的自旋锁,而根本原因是THP特性所导致的。
知道了问题原因,解决也就容易了,只要把THP关闭就可以了。
关闭的方法如下:
vi /etc/rc.local
在文件末尾添加如下指令:
if test -f /sys/kernel/mm/redhat_transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/redhat_transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag
fi
保存后,重启即可。
PS:此处不同版本的linux路径会有些区别,自己看好了
vi /sys/kernel/mm/redhat_transparent_hugepage/enabled
如果显示如下:
即为关闭THP生效。
其实这样做完还不算完全解决问题,就如我们前面说的,
THP的引入是为了减少维护人员配置巨页的工作,我们把THP特性关掉了,
最好的实践是我们应该再根据我们数据库服务需要的共享内存大小进行hugepage的配置。
毕竟在现在动辄几十G,甚至上百G的内存,如果在按照4K普通页大小去维护TLB,也是一个很大的开销。
这里hugepage的配置,因为数据库不同,甚至数据库版本不同,配置过程也不大相同,最重要的一点,我发现这篇日志写的有点太长了。
因此,这里就不展开赘述了,有时间可以开帖讲一讲。
-----------------------------------------------
解决效果:
在进行如上两步处理后,连续观察了几天,果然再没有所谓的“宕机”事件了。
这里“宕机”用了引号,对应最前面反馈问题时项目经理所说的服务器宕机描述,其实这个描述本身就是错误的,明天我准备再针对这个详细解释一下:如何正确的提问。
具体操作:如何将Transparent HugePages关闭
reference:https://blog.csdn.net/scofy0/article/details/43270517
009_关闭linux的THP的更多相关文章
- 本地访问weblogic控制台无反应,关闭linux操作系统防火墙
有时候,我们在Linux操作系统上成功启动了weblogic,也查看了7001端口的状态是开启的.但是访问weblogic控制台没有反应,也没有报错. 使用 netstat -ano | grep 7 ...
- 批量关闭linux进程
批量关闭linux进程 你是否经常遇到需要批量杀死很多进程的情况?而你是否还在一个一个的kill. 接下来我教你一个小秘诀吧. 1.首先我们查看当前的进程列表. 我们以查看nginx进程为例,通过ps ...
- 如何关闭Linux里边的selinux ?
原文地址: http://jingyan.baidu.com/article/6d704a131ba67828da51ca73.html 有很多的Linux使用者因为对selinux不熟悉,所以都会将 ...
- 打开与关闭Linux防火墙
1) 重启后生效 开启: chkconfig iptables on 关闭: chkconfig iptables off 2) 即时生效,重启后失效 开启: service iptables sta ...
- 关闭Linux(Ubuntu)错误报告
关于错误报告 网上查了下,Ubuntu(包括elementary,elementary是基于Ubuntu的)桌面版预装了Apport,它是一个错误收集系统,会收集软件崩溃.未处理异常和其他,包括程序b ...
- 关闭Linux防火墙(iptables) 及 SELinux
一.关闭防火墙 1.重启后永久性生效: 开启:chkconfig iptables on 关闭:chkconfig iptables off 2.即时生效,重启后失效: 开启:service ipta ...
- 查看、关闭linux自启动网络服务
1.查看 netstat --tulnp ..master smtp 服务 2.关闭 /etc/init.d/服务 stop 停止 : start 启动 chkconfig 服务 off 关闭 ...
- 关闭linux下的使用的端口
lsof -P -n -i kill pid 另外防火墙 iptables之类的也可以关闭端口
- 关闭Linux里边的selinux
首先我们可以用命令来查看selinux的状态 getenforce 这个命令可以查看到selinux的状态,当前可以看到是关闭状态的. 还有一个命令也可以查看出selinux的状态. sest ...
随机推荐
- winddow10下 virtualBox Ubuntu网络设置
1. virtualbox 全局设置 2. 虚拟机网络设置 3.虚拟机中设置 4. 宿主机 设置 5. 最后 在虚拟机中 ping www.baidu.com
- ruby--Hash方法汇总
一.给Hash添加默认值 :h = {1,2,3,4} #=> {1 => 2, 3 => 4} h.default = 7 h[1] ...
- 立个Flag不学好PHP誓不罢休
3年前从部队退伍退伍回来,就莫名其秒的爱上的编程,复学期间我几乎忘记了本专业的知识(原本我是读书籍设计的),从刚刚开始的C程序开始,一路走到一拿起书本我就几乎是睡着的状态,后来就开始了视频的学习之路, ...
- mysql批量替换数据
如题,项目域名迁移,导致原来商城的商品图片无法查看,地址错误. 怎么办?修改数据库图片路径呗!什么几千行呐,开玩笑.这个任务没人接,只有我干咯! 怎么也得不少时间吧,好吧半天,这是上面的要求. 有聪明 ...
- Nmap扫描基础常用命令(包含进阶使用)
Nmap扫描常用命令 - Nmap scans common commands 1.扫描单个目标 nmap ip 如:nmap 192.168.0.101 2.扫描多个目标 nmap ip1 ip2 ...
- Coursera, Deep Learning 5, Sequence Models, week3, Sequence models & Attention mechanism
Sequence to Sequence models basic sequence-to-sequence model: basic image-to-sequence or called imag ...
- 帝国cms建站方法和知识点
帝国cms建站方法和知识点 1. 首先在帝国cms网站上下载模板系统.根据模板系统上的提示,将指定的目录文件放在指定的位置.然后进行安装.后台管理系统的命名设置.数据库的设置等等. 2. 安装完成 ...
- es集群数据库~原理细节
ES原理一 基本定义 index(索引) 相当于mysql中的数据库 type(类型) 相当于mysql中的一张表 document(文档) 相当于mysql中的一行(一条记录) fie ...
- nginx基础命令
1.nginx 启动nginx service nginx start 查看nginx状态 service nginx status 关闭nginx service nginx stop 热重启(前提 ...
- 多次使用图片物理路径提示占用进程,用流读取设置FileShare权限解决
//用流读取图片 清空之后再次关联地址 //设置FileShare.ReadWrite权限之后 不会提示占用进程异常 item是物理路径DiscussionImageList = new Interv ...