我似乎不明白为什么我的可用内存比安装的内存少。我在 Lenovo x230 上运行 64 位 Centos 7,具有 1 个 4096MB RAM 模块。有关机器的一些信息:
$ free -m
total used free shared buff/cache available
Mem: 2439 1129 172 124 1137 857
Swap: 2087 41 2046
$ cat /etc/centos-release
CentOS Linux release 7.2.1511 (Core)
$ uname -m
x86_64
$ dmidecode -t memory | grep -i size
Size: 4096 MB
Size: No Module Installed
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 2
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 58
Model name: Intel(R) Core(TM) i7-3520M CPU @ 2.90GHz
Stepping: 9
CPU MHz: 1639.519
BogoMIPS: 5786.51
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 4096K
NUMA node0 CPU(s): 0-3
BIOS 显示要安装 4096MB RAM。
$ dmesg | grep -C 3 -i mtrr
[ 0.000000] e820: remove [mem 0x000a0000-0x000fffff] usable
[ 0.000000] AGP: No AGP bridge found
[ 0.000000] e820: last_pfn = 0x11e600 max_arch_pfn = 0x400000000
[ 0.000000] MTRR default type: uncachable
[ 0.000000] MTRR fixed ranges enabled:
[ 0.000000] 00000-9FFFF write-back
[ 0.000000] A0000-BFFFF uncachable
[ 0.000000] C0000-FFFFF write-protect
[ 0.000000] MTRR variable ranges enabled:
[ 0.000000] 0 base 0FFC00000 mask FFFC00000 write-protect
[ 0.000000] 1 base 000000000 mask F80000000 write-back
[ 0.000000] 2 base 080000000 mask FC0000000 write-back
$ dmesg | grep -C 3 -i e820
[ 0.000000] Initializing cgroup subsys cpuacct
[ 0.000000] Linux version 3.10.0-327.13.1.el7.x86_64 ([email protected]) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Thu Mar 31 16:04:38 UTC 2016
[ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.10.0-327.13.1.el7.x86_64 root=/dev/mapper/centos00-root ro crashkernel=auto rd.lvm.lv=centos00/root rd.lvm.lv=centos00/swap rhgb quiet LANG=en_ZA.UTF-8
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d7ff] usable
[ 0.000000] BIOS-e820: [mem 0x000000000009d800-0x000000000009ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000001fffffff] usable
[ 0.000000] BIOS-e820: [mem 0x0000000020000000-0x00000000201fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000020200000-0x0000000040003fff] usable
[ 0.000000] BIOS-e820: [mem 0x0000000040004000-0x0000000040004fff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000040005000-0x000000008c0a0fff] usable
[ 0.000000] BIOS-e820: [mem 0x000000008c0a1000-0x00000000dae9efff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000dae9f000-0x00000000daf9efff] ACPI NVS
[ 0.000000] BIOS-e820: [mem 0x00000000daf9f000-0x00000000daffefff] ACPI data
[ 0.000000] BIOS-e820: [mem 0x00000000dafff000-0x00000000df9fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000f8000000-0x00000000fbffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fed08000-0x00000000fed08fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fed10000-0x00000000fed19fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fed1c000-0x00000000fed1ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000ffc00000-0x00000000ffffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000100000000-0x000000011e5fffff] usable
[ 0.000000] NX (Execute Disable) protection: active
[ 0.000000] SMBIOS 2.7 present.
[ 0.000000] DMI: LENOVO 2325SRQ/2325SRQ, BIOS G2ETA5WW (2.65 ) 09/17/2015
[ 0.000000] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved
[ 0.000000] e820: remove [mem 0x000a0000-0x000fffff] usable
[ 0.000000] AGP: No AGP bridge found
[ 0.000000] e820: last_pfn = 0x11e600 max_arch_pfn = 0x400000000
[ 0.000000] MTRR default type: uncachable
[ 0.000000] MTRR fixed ranges enabled:
[ 0.000000] 00000-9FFFF write-back
--
[ 0.000000] 8 base 11E800000 mask FFF800000 uncachable
[ 0.000000] 9 base 11E600000 mask FFFE00000 uncachable
[ 0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x7010600070106
[ 0.000000] e820: last_pfn = 0x8c0a1 max_arch_pfn = 0x400000000
[ 0.000000] found SMP MP-table at [mem 0x000f0100-0x000f010f] mapped at [ffff8800000f0100]
[ 0.000000] Base memory trampoline at [ffff880000097000] 97000 size 24576
[ 0.000000] init_memory_mapping: [mem 0x00000000-0x000fffff]
--
[ 0.000000] PM: Registered nosave memory: [mem 0xfee00000-0xfee00fff]
[ 0.000000] PM: Registered nosave memory: [mem 0xfee01000-0xffbfffff]
[ 0.000000] PM: Registered nosave memory: [mem 0xffc00000-0xffffffff]
[ 0.000000] e820: [mem 0xdfa00000-0xf7ffffff] available for PCI devices
[ 0.000000] Booting paravirtualized kernel on bare hardware
[ 0.000000] setup_percpu: NR_CPUS:5120 nr_cpumask_bits:8 nr_cpu_ids:8 nr_node_ids:1
[ 0.000000] PERCPU: Embedded 31 pages/cpu @ffff88011e200000 s87168 r8192 d31616 u262144
--
[ 0.078755] ACPI: bus type PCI registered
[ 0.078756] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5
[ 0.078931] PCI: MMCONFIG for domain 0000 [bus 00-3f] at [mem 0xf8000000-0xfbffffff] (base 0xf8000000)
[ 0.078933] PCI: MMCONFIG at [mem 0xf8000000-0xfbffffff] reserved in E820
[ 0.079010] PCI: Using configuration type 1 for base access
[ 0.079718] ACPI: Added _OSI(Module Device)
[ 0.079720] ACPI: Added _OSI(Processor Device)
--
[ 0.116705] usbcore: registered new device driver usb
[ 0.116763] PCI: Using ACPI for IRQ routing
[ 0.118451] PCI: pci_cache_line_size set to 64 bytes
[ 0.118883] e820: reserve RAM buffer [mem 0x0009d800-0x0009ffff]
[ 0.118884] e820: reserve RAM buffer [mem 0x40004000-0x43ffffff]
[ 0.118885] e820: reserve RAM buffer [mem 0x8c0a1000-0x8fffffff]
[ 0.118886] e820: reserve RAM buffer [mem 0x11e600000-0x11fffffff]
[ 0.118961] NetLabel: Initializing
[ 0.118962] NetLabel: domain hash size = 128
[ 0.118963] NetLabel: protocols = UNLABELED CIPSOv4
$ lspci -vnn | grep VGA -A 12
00:02.0 VGA compatible controller [0300]: Intel Corporation 3rd Gen Core processor Graphics Controller [8086:0166] (rev 09) (prog-if 00 [VGA controller])
Subsystem: Lenovo Device [17aa:21fa]
Flags: bus master, fast devsel, latency 0, IRQ 27
Memory at f0000000 (64-bit, non-prefetchable) [size=4M]
Memory at e0000000 (64-bit, prefetchable) [size=256M]
I/O ports at 6000 [size=64]
Expansion ROM at <unassigned> [disabled]
Capabilities: [90] MSI: Enable+ Count=1/1 Maskable- 64bit-
Capabilities: [d0] Power Management version 2
Capabilities: [a4] PCI Advanced Features
Kernel driver in use: i915
00:14.0 USB controller [0c03]: Intel Corporation 7 Series/C210 Series Chipset Family USB xHCI Host Controller [8086:1e31] (rev 04) (prog-if 30 [XHCI])
检查 free -m 是否没有错误:
mount -t tmpfs -o size=80% none /tempRam
dd if=/dev/zero of=/tempRam/testFile bs=1M count=3096
输出:
dd: error writing ‘/tempRam/testFile’: No space left on device
1952+0 records in
1951+0 records out
2046541824 bytes (2.0 GB) copied, 4.74288 s, 431 MB/s
知道为什么我只有 2.4GB 可用 RAM 以及如何才能使用所有 4GB 内存吗?
答案1
可能的原因有很多,在不完全监控系统的情况下从这里调查问题有点不可能/不可行。
但在这里我将列出三个可能的原因:
第一的
原因可能会因系统上的任务和正在执行的操作而有所不同,如果您使用任何虚拟化、任何与执行快照相关的进程以及通过 COW 内存分配(右侧复制)、分区规则,情况可能会有所不同。正在运行、内存映射文件 I/O、旨在由可执行文件和进一步的共享对象文件共享的共享对象、动态链接(后期绑定)等。
此外,请注意,您并不总能通过将所有正在运行的进程正在使用的内存相加来找到真正的总内存。由于共享对象和其他 RAM 相关概念,许多应用程序使用的内存似乎比机器上实际存在的内存多。
此外,空闲内存都是关于没有映射到它的逻辑数据的物理内存。是的,我们应该意识到未使用的内存部分有一些映射到它的数据,但不处于活动状态并由正在运行的进程使用。
顺便说一句,请注意,类 Unix 系统想要拥有并显示尽可能少的可用内存,而不是全部可用内存!所以你可能已经猜到了,他们使用的内存不是积极地映射到运行机器中的进程,用于各种 IO 传输操作的缓冲区和缓存。
第二
你的 BIOS 可能有问题,但由于它显示了确切的 RAM 量,我们可以说 BIOS 没有任何问题,问题是内核没有使用它。
最后
我要列出的最后一件事是任何人首先想到的,那就是为 GPU 相关的东西保留 RAM,特别是如果您有板载 GPU。但由于你的输出dmesg | grep -C 3 -i e820
没有显示任何错误,所以,这不是你的问题。
很难说出您的问题是什么,因为我们对您的服务器没有深入的了解,但您在问题和评论中提到了所有内容,我认为我们从这里无能为力。
我推荐你⟼做一些测试,例如memtest86+
通过运行下载yum install memtest86+
并尝试测试您的内存并查看退出代码是什么。并使用vmstat -a
、vmstat -s
、cat /proc/meminfo
、top
、htop
等命令监视系统内存一段时间sar -r
,看看是否发现任何奇怪的东西。
如果上述建议没有帮助↴
另外两个最终选择:首先,重新安装你的内存,这联想支持可能会帮助你。其次,重建并安装新内核。
我希望这能有所帮助。
答案2
你可能会发现这页面非常有帮助。
TL;DR:笔记本电脑的配置可能指定的配置少于实际可用的配置。这可以在 中更改/boot/grub/grub.conf
。
答案3
在尝试使用内核执行某些操作之前,您需要知道如何重新编译内核。
- 进入linux内核目录(一般是“/usr/src/linux”)
- 运行 make menuconfig (或者 make xconfig、gconfig 等...)
- 转到 -> 处理器类型和功能
- 转到 -> 高内存支持
- 然后选择适合您机器的选项(选项“关闭”启用仅支持小于4GB)
- 重新编译内核 make && makemodules && makemodules_install
- 不要忘记重新配置您的引导加载程序
答案4
对于 GRUB,修改位于 /boot/grub/grub.conf 的 GRUB 配置文件(并确保内核版本正确)
# NOTICE: You have a /boot partition. This means that
# all kernel paths are relative to /boot/
default=0
timeout=30
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Enterprise Linux (2.6.9-5.EL)
root (hd0,0)
kernel /vmlinuz-2.6.9-5.EL ro root=/dev/hda3 mem=**128M**
并更新 grub,
sudo yum update-grub
由于 CentOS 7 使用自动生成的 GRUB2 和/etc/default/grub
文件来使用命令grub2-mkconfig
使用 grub 命令行指定安装的内存来进行 grub 配置,
sudo nano /etc/default/grub
并在 eof 处添加这一行,
GRUB_CMDLINE_LINUX="mem=8192m" (for 8GB)
sudo grub2-mkconfig
重新启动系统以使更改生效。 use,cat /proc/meminfo
查看系统完整的内存使用情况。