简单说说THP——记一次数据库服务器阻塞的问题解决
上一篇 /
下一篇 2016-04-26 15:58:51
/ 个人分类:性能诊断调优
背景:51Testing软件测试网1Bc#o%o6r H.mo公司某个大型业务系统反馈最近
数据库服务器总是
宕机(此处描述不准确,后面解释),最后,客户、运维人员都觉得实在是忍无可忍了,项目经理打
电话找到我问是否能帮忙诊断一下,刚好第二天要去现场沟通另外一个系统的
测试需求,于是答应第二天顺便看一下。
51Testing软件测试网Y'G&K@ZA3So------------------------------------
51Testing软件测试网H;f;W,F*w2I{"a51Testing软件测试网,H0gt%d e5dY排查解决过程:51Testing软件测试网M/JTb6G{8L9h.L,n*^U第二天来到现场,正在沟通需求的时候,运维人员突然说,操作又开始卡了,
nT'DwN)_5Nt-M0于是连上服务器,先用
top大概看了一下资源的使用情况,此时CPU已经基本上满载了,而且可以发现用户态的CPU占比并不高,大部分时间竟然都是内核态的CPU占用,
)uQ"I c-oF'fY)}0
51Testing软件测试网$r0u)`T/fF-L-Nj当时我开始怀疑可能是数据库服务对底层的某个调用出了问题,有死循环?
51Testing软件测试网a(G!R|!x4[@+o.s于是立刻用perf top大概看了一下,
51Testing软件测试网/m9d[7`I
,Z0_E2fXK[u0发现比重较大的是自旋锁还有一个compaction_alloc,内存碎片整理?
51Testing软件测试网0K!q+ogr从该信息判断,可能是内存的什么操作导致了很多线程在临界区各种等待。
51Testing软件测试网r"}Y Za#j_)@,t为了进一步弄明白具体是什么操作导致,于是对内核参数的调用栈进行取样
51Testing软件测试网 M\x/r,KC5bL|perf record -a -g -F 1000 sleep 60
6i?)Q.Rus0“-g'的意思是按照调用关系存储数据;“-F 1000 sleep 60”表示按照每秒取1000个样本的频率取一分钟。
51Testing软件测试网[7O`KI'{取完样后,使用perf report -g打开取样的数据,可以看到如下的调用栈:
R.~ H.f BF9cmH4} K0
51Testing软件测试网?8QHNg,Q很明显这个自旋锁是由内存页的碎片整理导致,而进行碎片整理是由
hugepage导致的,
51Testing软件测试网o,}_ s9kA {
}看到这里的时候,我突然想起来linux的一个THP特性,貌似是kelnel 2.6.38版本后开始加进来的,
6EojqL0这个特性实际上就是会把这种巨页的使用对用户透明,用户不需要再进行巨页的配置,
51Testing软件测试网-DL'x'rv9D0ke
w内存会自动将连续的512个普通页作为一个巨页处理,
'W;^8OQZd#RP0正如我们在前面的调用栈看到的,这种特性就需要对内存碎片进行整理,
51Testing软件测试网!_MdJ-N@*|-uSn所以我们看到的现象是内存碎片页
移动导致的自旋锁,而根本原因是THP特性所导致的。
5}U6];S}:J0知道了问题原因,解决也就容易了,只要把THP关闭就可以了。