APP下载

Linux内核分析:页回收导致的cpu load瞬间飙高的问题分析与思考

2017-04-15陈李飞

数字技术与应用 2016年12期

陈李飞

摘要:本文主要讨论在Linux系统内核在页回收时出现cpu load瞬间飙高的问题,主要表现为Linux系统响应慢,我们从内核的角度分析了导致该问题的几种可能情况。我们可以借助提高watermark low可以尽早的唤醒kswapd,然后kswapd来做background reclaim。Linux内核提供了各种各样的机制,我们根据具体的使用场景来选择使用合适的策略。从而实现系统性能的提升。

关键词:linux 内核分析 页回收

中图分类号:TP31 文献标识码:A 文章编号:1007-9416(2016)12-0252-01

Abstract:This article main discussion in Linux kernel CPU load instantly soared during pp recycling problems, main show is Linux system response is slow, we analyzed the cause of the problem from the Angle of the kernel several possible situation. We can help improve the watermark low can awaken kswapd as soon as possible, then kswapd to do background reclaim. The Linux kernel provides a variety of mechanisms, we according to the specific usage scenarios to choose to use the right strategy. So as to realize the system performance improvement.

Key Words:Linux;kernel analysis;page recovery

1 前言

搜索团队的服务器前段时间频繁出现CPU load很高(比如load average达到80多)的情况,希望能借助这个机会给大家介绍一下在Linux系统出现问题时我们能够借助哪些工具去协助分析;以及介绍一下Linux在内存管理方面的一些机制以及我们的使用策略。

2 Linux系统出现常见问题的分析

在Linux系统里面有很多的问题定位工具,可以协助我们来分析问题。于是我们就针对目前搜索服务器的现象,思考可以借助哪些工具来找到问题原因。

Linux系统响应慢,从内核的角度看,大致可能有以下几种情况:

(1)线程在内核态执行的时间过长,这个时间超出了它被调度算法给分配的执行时间,它在内核态长时间的占用CPU,而且也不返回用户态。这种现象有个术语,叫做softlockup。

通过一个现象来简单说下内核态和用户态。我们可能遇到这个现象,执行完一个命令,CTRL+C怎么都杀不死它,而且敲键盘也反应,这可能就是因为此时这个进程正运行在内核态,CRTL+C是给进程发signal的方式通知进程,而进程只有在从内核态返回用户态的时候才会去检查有没有信号,所以如果它处在内核态的话显然是无法被杀死的。这种现象就给我们系统很忙的感觉。

(2)CPU load值高,说明处于Running状态和D状态的线程太多。线程等待资源而去睡眠,就会进入D状态(即Disk sleep,深度睡眠),进入D状态的线程是不能够被打断的,他们会一直睡眠直到等待的资源被释放时主动去唤醒他们。(大致的原理是,这些线程在等待什么资源,比如某个信号量,它就会被加入到这个信号量的等待队列里,然后其它的线程释放这个信号量的时候会去检查该信号量的等待队列,然后把队列里线程给唤醒。)

(3)在内核态,除了进程上下文外,还有中断上下文。中断也可能有异常,比如长时间被关中断。中断长时间被关闭,这个现象叫做hardlockup。

针对hardlockup,内核也有监测机制,是NMI watchdog。可以通过/proc/interrupts来看系统是否使能了NMI watchdog。如果值不为0,说明系统使能了NMI watchdog。然后我们通过sysctl将kernel.nmi_watchdog设置为1,即,在触发了NMI watchdog的时候主动让内核去panic。从而监测出hardlockup这种故障。

3 解决问题

为了避免direct reclaim,我们得保证在进程申请内存时有足够可用的free pages,从前面的背景知识我们可以看出,提高watermark low可以尽早的唤醒kswapd,然后kswapd来做background reclaim。为此,内核专门提供了一个sysctl接口给用户来使用:vm.extra_free_kbytes.

于是我们增大这个值(比如增大到5G,hohoho),确实也解决了问题。增大该值来提高low水位,这样在申请内存的时候,如果free的内存低于了该水位,就会唤醒kswapd去做页回收,同时又由于还有足够的free内存可用所以进程能够正常申请而不触发直接回收。

4 总结和思考:机制与策略

从前面我们讨论的这个问题也可以看出,Linux内核提供了各种各样的机制,然后我们根据具体的使用场景来选择使用的策略。由于搜索服务器存在很多批量文件操作,所以对page cache的使用很频繁,所以我们才选择了尽早的能够触发background reclaim这个策略;而如果你的文件操作不频繁,显然就没有必要去尽早的唤醒后台回收线程。另外一个,作为一个文件服务器,它对page cache的需求是很大的,越多的内存作为page cache,系统的整体性能就会越好,所以我们就没有必要为了数据的局部性而预留DMA内存,两相比较肯定是page cache对性能的提升大于数据的局部性对性能的提升;而如果你的文件操作不多的话,那还是打开zone_reclaim的。

5 结语

通过以上论述可以使我们更加熟悉与了解Linux的内核机制,可以和现场好多就地控制系统性能的提升,方便文件的操作,从而使此Linux系统的性能充分发挥,服务实际需要。

参考文献

[1]赖娟.Linux内核分析及实时性改造[D].电子科技大学,2007.

[2]张荣亮.Linux操作系统内核分析与研究[D].江西师范大学,2007.

技術分会、中国核学会核电子学与核探测技术分会,第十届全国核电子学与核探测技术学术年会论文集[C].中国电子学会.

[3] IEC 61850-5 communication requirements for functionsand device models[S].

[4]C-LABCooperativeComputing&.CommunicationLaboratory,‘Real-TimeL/nux},universityof Paderhorn Bv Martin Eikermanm 200l.

[5]Krishna CM,Kang G s.实时系统.北京:清华大学出版社,2001.