ECS内存使用常见问题

网友投稿 1251 2022-05-29

【问题背景】

在ECS的使用中会出现一些关于内存的使用问题,例如:

1、我的ECS实际可以使用的总内存(MemTotal)与购买的规格不一致

2、free查到的服务器内存已使用数量跟top显示的进程使用内存不一致

上述问题中通常为系统设置产生,该文档对以上问题场景进行分析和处理。

【问题分析与处理】

问题一:

我的ECS实际可以使用的总内存(MemTotal)与购买的规格不一致

问题现象

从free和/proc/meminfo中看到的总内存小于购买的规格内存(实际ECS规格为2G)

问题分析

1、可以通过dmesg查看系统启动时内存分配情况

# dmesg | grep Memory

如上图所示,实际总内存为2096440KB,其中可用内存为1860840KB,absent 392KB,reserved 235408KB。

kdump使用kexec引导到第二个内核(捕获内核),第二个内核位于第一 个内核无法访问的系统内存的reserved部分中,第二个内核捕获崩溃的内核内存的内容(崩溃转储)并保存,且reserved 内存属于第二内核,并且永远不会被释放或交换。

系统可用内存的计算方式为:

available = 物理内存 – absent – reserved

确认是否配置crashkernel,可以通过查看/proc/cmd

# cat /proc/cmdline

如上图所示可以确认crashkernel已开启,crashkernel中内存包含在reserved中。

确认不需要kdump可以释放该部分内存。释放crashkernel使用的内存会导致kdump无法使用。

ECS内存使用常见问题

操作步骤

1、修改grub配置,删除crashkernel配置项。

# cp /etc/default/grub /etc/default/grub.bak

打开/etc/default/grub找到GRUB_CMDLINE_LINUX行,将crashkernel=auto(crashkernel的值可能为具体的值或者范围,以实际参数设置为准)参数删除。

2、使用grub2-mkconfig 命令重新生成cfg文件

# grub2-mkconfig -o /boot/grub2/grub.cfg

3、重启服务器

说明

步骤2中如果出现:error: environment block too small

则运行以下命令后:

# mv /boot/grub2/grubenv /grubenv.bak

# grub2-mkconfig -o /boot/grub2/grub.cfg

问题二:

free查到的服务器内存已使用数量跟top显示的进程使用内存不一致

问题现象

在4U8G的linux弹性云服务器,执行free –lh 命令后发现显示已使用内存5.9G,使用率将近78%,top查询的内存使用率只有不到10%,与free –lh的结果不匹配。

问题分析

在某些场景和应用中需要在系统内配置hugepage(大页内存)和共享内存,而大页内存和共享内存体现在free的结果中的used但是不会计算在进程的使用内存中,针对此类问题可以从这个方向进行定位。

我们可以通过atop命令在MEM行可以看到内存的分配详情,如下图标记处可以看到hptot(hugepage total)项为4.9G。

这部分内存,即被“大内存页”占用的这些存储器永远不会被交换出内存。它会一直保留除非修改了配置。

大页内存的详情可以通过/proc/meminfo查看

# cat /proc/meminfo |grep Huge

可以看到开启了Huge,每个大页内存的大小是2048kB,大页内存的数据是2520个,加起来一共使用了5G内存。free –lh显示的5.9G的内存使用量,减去大页内存5G,实际使用的是0.9G.使用率跟top查询的结果相匹配。

大页内存在某些应用是必要的配置,是否取消大页内存需要根据实际场景进行决定。大页内存的设置可以通过内核参数vm.nr_hugepages进行设置。

说明:

1、HugePages 是 Linux 操作系统的一个内核特性,让操作系统可以支持现代硬件架构的大页面容量功能。通过启用 HugePages 并使用大页面,可以用一个页表条目代表一个大页面,而不是使用许多条目代表较小的页面,从而可以管理更多内存,减少操作系统对页面状态的维护并提高 TLB 缓存命中率。在 Linux 中,Hugepage默认大小为 2 MB。

2、共享内存是多个进程间共同地使用同一段物理内存空间,它是通过将同一段物理内存映射到不同进程的 虚拟空间来实现的。由于映射到不同进程的虚拟空间中,不同进程可以直接使用,不需要像消息队列那样进行复制,所以共享内存的效率很高。

列出共享内存的使用

# ipcs –m

共享内存的设置可以通过内核参数kernel.shmall进行设置

Linux 弹性云服务器 ECS

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:华为云在线教育解决方案
下一篇:当JNI遇到多线程--java对象如何被C++中的多个线程访问?
相关文章