-
背景,公司一台我从来没有接触过服务,突然被告警被当做人矿机在工作,买了ECS的最低配安全策略后重启,发现CPU和网络IO已经恢复,但是内存居高不下,在他自己搞了一天后,第二天早上说让我解决,于是开始了下面的尝试方法(本来Java开发,最近几年多在做管理,少写代码,稍多知道一些,啥多不精)
-
问题处理步骤
-
分析问题:被矿机搞过,那能存在以下种种况,1)还有驻留的随服务器自启动进程,该进程主要耗内存;2)我的知识盲区
-
验证猜想:
-
如果是1)进程问题,那么用free -h查看内存,用top查看进程,结果top和free获得内存使用情况不一致,所以是第二种情况;
-
当然也是看了free中cache占比极少的情况,辅助判断如果是,cache占比较高,可直接搜索“linux清理内存缓存”
-
如果是2)先百度,我运气好(百度搜索命中和效率极低)发现了一个我们见过的名称Hugepages,其介绍
官网:docs.oracle.com/cd/E11882_0… HugePages是集成到Linux内核2.6中的功能。启用HugePages使操作系统能够支持大于默认值(通常为4KB)的内存页面。使用大页可以减少访问页表条目所需的系统资源量来提高系统性能。HugePages可用于32位和64位的系统配置。根据内核版本和硬件架构,大页大小从2MB到256MB不等。对于Oracle数据库,使用HugePages可减少页面状态的操作系统维护,并增加页表缓冲(TBL)的命中率 没有HugePages,操作系统将每个4KB的内存保存为一个页面,当它被分配给SGA时,该页面的生命周期(dirty,free,mapped to process等)根据系统内核保持最新的状态。 使用HugePages,操作系统页表(虚拟内存到物理内存映射)较小,因为每个页表条目都指向从2MB到256MB的页面。并且内核较少的页面,其生命周期一定会被监视。 注意2MB大小的HugePages可用于Linux x86-64,Linux x86和IBM:Linux on System z. 以下是使用HugePages的优点: ·通过增加TLB命中来提高性能。 ·页面被锁定在内存中,不会被交换出来,保证像SGA这样的共享内存保留在RAM中。 ·连续的页面是预先分配的,不能用于其他任何东西,而只能用于System V共享内存(例如:SGA) ·由于更大的页面大小,对于虚拟内存的这部分的内核而言,更少的记录工作
-
简单的说就是大页内存使用某些程序使用所需,据说是centos7后出现的,他所占用的内存不可以交换,我的理解就是别的程序不能使用独占,无论他是否使用
-
解决思路:根本找到了,接下来就是关闭或取消该功能,最次降低其内存上限;
-
思路实验:
-
禁用Transparent Huge Pages,参考www.manongjc.com/detail/6-ou… ,然而重启后没有卵用,内存没有降低
-
降低Transparent Huge Pages上限,因为不清楚改功能是否禁用后有影响,所以考虑修改,参考www.jb51.net/article/150…,发现可以
-
实际操作:
-
1.查看大页内存的实际情况 grep Huge /proc/meminfo
-
2.因为大页内存占用内存计算=HugePages_Total * Hugepagesize = 20 * 2M = 40M,HugePages_Total=20是我改后,改之前是HugePages_Total=1170
-
3.所以修改HugePages_Total或Hugepagesize,我发现可以通过/etc/sysctl.conf修改HugePages_Total 于是 vim /etc/sysctl.conf
-
4.修改红框的数字,然后执行sysctl -p就生效了,内存直接下来了
-
总结和废话:
-
我们尝试怎么修改Hugepagesize,有兴趣的同学可以试试,另外关于禁用为什么不能使内存下降,有兴趣的同学也可以研究一下,时间有限解决了问题就要继续coding了