一、云主机13G内存被无故占用
今天群里的小伙伴在巡检云主机时发现一台云主机的内存监控报警了,登陆该云主机系统后发现系统内存被莫名占用了13G,空闲内存为“0”,所以导致监控报警,如图一所示:
图一 内存使用截图
接着小伙伴查看了进程相关信息,如图二所示,发现所有进程占用都是零点几,没有超过1G的,13G的内存去哪里了?
图二 系统进程截图
怀疑是系统缓存占用,于是重启了该云主机;但在重启云主机后还是一样的现象,查看内存使用的used项还是13G,空闲变为17G,如图三所示,。
图三 重启云主机后内存使用截图
这证明不是缓存占用,那该云主机的13G被谁用了?
二、揭秘云主机的13G内存
从上面的进程信息中我们可以看出,这台云主机主要运行的是oracle数据库,稍后有oracle经验的人都有所了解,在oracle部署和使用时往往需要配置HugePages,HugePages对于Linux上提升Oracle数据库性能是至关重要的。在系统中执行:grep HugePages /proc/meminfo命令,结果如图四所示,看到了HugePages _Total是6708,这个数字同13G还有差距,但感觉离答案进了一步!
图四 查看HugePages的信息
继续学习一下相关参数
HugePages_Total是指系统总共预留了多少HugePages,HugePages_Free指当前还有多少HugePages未分配(allocate),HugePages_Rsvd是指有多少HugePages是系统承诺了会分配给程序(commitment to allocate),但实际并未分配,HugePages_Surp指超分的页。
2.1大页内存示例数据解析
下面用实际的数据来进行说明,示例如图五所示。
图五 示例HugePages的信息
从上面的信息可以得出以下结论:当前hugepages一共实际使用了13007-11813=1194个pages(不包括预留的),预留了3372个pages。永远不会使用达到了11813-3372=8841个pages。每个page大小为2M,也就是说有接近16.5G的hugepages内存被浪费了(因为hugepages无法swap,所以不能被其它程序所使用)。换句话说:当前系统使用中或者即将被使用的hugepages的总和为HugePages_Total-HugePages_Free+HugePages_Rsvd=13007-11813+3372=4566个pages。
2.2终于找到13G内存
回到先前的云主机,Total是6708,每个page大小为2M,那6708*2M/1024≈13G,哇!终于找到13G内存了!原来是被系统的大页内存占用了,群里的小伙伴也确认了,如图六所示。
图六 小伙伴确认截图
群里的小伙伴们也都学到“HugePages”这一招,群主觉得有必须同大家分享一下,也欢迎大家加入华云的技术群,请关注华云官方公众号,来一起交流学习吧!
三、大页内存扩展学习
在Linux中大页分为两种:Huge pages(标准大页)和Transparent Huge pages(透明大页)。内存是以块即页的方式进行管理的,当前大部分系统默认的页大小为4096bytes即4K。1MB内存等于256页;1GB内存等于256000页。
3.1Huge pages
Huge pages是从Linux Kernel2.6后被引入的,目的是通过使用大页内存来取代传统的4kb内存页面,以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能。
Huge pages有两种格式大小:2MB和1GB,2MB页块大小适合用于GB大小的内存,1GB页块大小适合用于TB级别的内存;2MB是默认的页大小。
3.2Transparent Huge Pages
Transparent Huge Pages缩写THP,这个是RHEL6开始引入的一个功能,在Linux6上透明大页是默认启用的。
由于Huge pages很难手动管理,而且通常需要对代码进行重大的更改才能有效的使用,因此RHEL6开始引入了Transparent Huge Pages(THP),THP是一个抽象层,能够自动创建、管理和使用传统大页。
THP为系统管理员和开发人员减少了很多使用传统大页的复杂性,因为THP的目标是改进性能,因此其它开发人员(来自社区和红帽)已在各种系统、配置、应用程序和负载中对THP进行了测试和优化。这样可让THP的默认设置改进大多数系统配置性能。但是,不建议对数据库工作负载使用THP。
这两者最大的区别在于:标准大页管理是预分配的方式,而透明大页管理则是动态分配的方式。
如果云主机跑的是oracle数据,建议大家还是系统去学习一下oracle的文档,会有相关的说明。
3.3大页内存常用相关指令
查看大页内存使用情况
#grep Huge /proc/meminfo
查看系统numa架构,cpu分配情况
#numactl --hradware
挂载大页,重启后失效
#mkdir -p /mnt/huge
#mount -t hugetlbfs nodev /mnt/huge
永久挂在大页内存
#vim /etc/fstab
#nodev /mnt/huge hugetlbfs defaults 0 0 #挂载2M大页
#nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0 #挂载1G的大页
查看大页内存挂载情况
#cat /proc/mounts
查找正在使用大页的进程
#find /proc/*/smaps | xargs grep -ril "anon_hugepage"
取消挂载
#umount /dev/hugepages
#umount /mnt/huge
四、参考文档:
HugePages on Oracle Linux 64-bit
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/performance_tuning_guide/s-memory-transhuge#s-memory-configure_hugepages
https://blog.csdn.net/g__hk/article/details/44955587