某客户对一套VMware上的Linux主机进行内存扩容,但在VMware端操作完成后,系统内无法完整识别新增加的内存,容量缺失一部分。
Client版本:redhat7.6
一、故障描述
一台redhat7.6客户机因业务需要,对原有内存进行扩容,在VMware端扩容后内存容量增加至128G:
但是在redhat系统内查询到的内存容量不足128G:
二、故障分析
要处理这个问题,我们就要了解Linux系统是如何做到实现内存热插拔的。
内存热插拔在这里分成了两个阶段:
1、物理内存热插拔阶段
2、逻辑内存热插拔阶段
在本次问题处理中,相对于Linux操作系统来说,物理内存热插拔阶段由VMware和内核来共同完成,这里不做详细说明,主要关注逻辑内存的热插拔阶段。
逻辑热插拔状态主要是完成内存状态的改变,以完成系统内新增内存容量的可用性。
在系统中,内存被划分为大小相同的块,块的大小由/sys/devices/system/memory/block_size_bytes 来指定。所有的内存按照块的大小被划分成多个文件,以 /sys/devices/system/memory/memoryXXX 的形式存放,而逻辑内存热插拔就是通过对这些块文件进行online/offline操作来实现的。
三、故障处理
1、依据上述原理,首先查看/sys/devices/system/memory/block_size_bytes,确定内存块大小为1G:
(图中40000000即为内存块的大小,以16进制表示,换算后为1G)
2、使用命令grep line /sys/devices/system/memory/*/state查看内存块的online状况,确认128个内存块中有部分内存块状态为offline,导致系统中无法正常识别到完整容量:
3、使用
echo online >/sys/devices/system/memory/memory[number]/state
对相应的offline内存块进行上线操作,完成后内存容量恢复正常。
四、经验总结
1、此次故障因为涉及到虚拟化,看起来问题相对复杂,涉及到VMware,redhat,物理内存三个层面的内容,但是只要仔细分析排查即可发现,物理内存方面容量充足,虚拟化部分和内核的对接正常,问题不出现在这两部分,只需要对操作系统内的内存操作进行分析检查,定位到相应的文件配置,进行适当的修改操作,即可顺利解决。
2、Linux中众所周知一句话“万物基于文件”,Linux世界中一切东西都可以通过文件的方式访问、管理。本次案例中,Linux操作系统中就是以文件形式对逻辑内存块进行管理,以达到物理内存调用管理。因为操作系统中内存块状态为offline,导致VMware分配内存后,无法达到预期的扩容效果,需要修改一定参数方能进行识别。
如欲了解更多,请登录十大靠谱网赌软件官方网站:cosb.xoases.net