起因

买了一台2核2G的服务器,但是开机后发现htop命令显示内存只有1690m:

我觉得很神奇,因为我另一台的2核2G的机器,开机之后可用为1987m。难不成是新的机器缩水了???

求解

抱着求真务实的心态,我进行了探索:

首先使用

dmidecode |grep -A16 "Memory Device$"

来查看一下主板上内存的信息,发现是2GB,没有缩水。

root@ez4leon:/home/clash# dmidecode |grep -A16 "Memory Device$"
Memory Device
        Array Handle: 0x1000
        Error Information Handle: Not Provided
        Total Width: Unknown
        Data Width: Unknown
        Size: 2 GB
        Form Factor: DIMM
        Set: None
        Locator: DIMM 0
        Bank Locator: Not Specified
        Type: RAM
        Type Detail: Other
        Speed: Unknown
        Manufacturer: Alibaba Cloud
        Serial Number: Not Specified
        Asset Tag: Not Specified
        Part Number: Not Specified

那神奇了,内存去哪了?经过上网查询,发现可能是Linux内核错误转储的kdump空间的预留导致的,因此查看grub的配置文件:

sudo vim /etc/default/grub

发现其中Linux启动的命令行参数为:

GRUB_CMDLINE_LINUX=" vga=792 console=tty0 console=ttyS0,115200n8 net.ifnames=0 noibrs iommu=pt crashkernel=0M-1G:0M,1G-4G:192M,4G-128G:384M,128G-:512M nvme_core.io_timeout=4294967295 nvme_core.admin_timeout=4294967295"

注意最后的 crashkernel=0M-1G:0M,1G-4G:192M,4G-128G:384M,128G-:512M 参数,表示系统内存在1G~4G之间的时候,kdump使用192M内存!再看看我2G的那台机器,发现并没有启用kdump。噢,原来相差的内存在这里啊!

什么是kdump? kdump是Linux内核的一个功能,可在发生内核错误时创建核心转储。当被触发时,kdump会导出一个内存映像(也称为vmcore),该映像可用于调试和确定崩溃的原因。 主内存的转储映像作为可执行与可链接格式(ELF)对象导出,可以在处理内核崩溃时通过/proc/vmcore直接访问,也可以自动保存到本地可访问的文件系统、 裸设备或通过网络访问的远程系统。

那我能不能把kdump预留的内存调小一点呢?使用以下命令能够查看内核dump所需的内存页面数量:

sudo makedumpfile --mem-usage /proc/kcore

kdump是为了出错后方便分析错误。那我们干脆不分析了吧!那直接关掉kdump功能即可!

于是乎,直接修改/etc/default/grub文件,把crashkernel参数删掉,关掉kdump.然后使用以下命令,更新grub参数:

sudo grub-mkconfig -o /boot/grub/grub.cfg

接着重启服务器即可生效

文章作者: 狗哥
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小破站
Linux
喜欢就支持一下吧