《服务器硬件基础(三)——内存详解》

4 阅读5分钟

前言

大家好,我是JACK,本篇是服务器硬件基础系列第三篇,上一篇我们详细讲了CPU,这篇我们聊内存,结合实际测试经验来讲。


一、内存是什么

内存(RAM,Random Access Memory)是服务器运行时临时存放数据的地方,CPU处理任务时所需的数据都先加载到内存里,速度极快,但断电后数据消失。

服务器内存和普通PC内存相比:

  • 容量更大,通常从64GB起步,高配可达TB级别
  • 支持**ECC(错误纠正码)**功能,自动检测并纠正内存数据错误,保障数据准确性
  • 支持多通道,提升内存带宽
  • 更注重稳定性和长时间运行可靠性

二、内存关键参数

拿到服务器先用dmidecode确认内存规格:

[root@localhost ~]# dmidecode -t memory
Memory Device
        Locator: DIMM_A1
        Bank Locator: Node0_Channel0
        Type: DDR4
        Speed: 3200 MT/s
        Manufacturer: Samsung
        Serial Number: 12AB34CD
        Size: 32 GB
        Configured Memory Speed: 3200 MT/s

Memory Device
        Locator: DIMM_A2
        Bank Locator: Node0_Channel1
        Type: DDR4
        Speed: 3200 MT/s
        Manufacturer: Samsung
        Serial Number: 12AB34CE
        Size: 32 GB
        Configured Memory Speed: 3200 MT/s

重点核对以下信息:

字段说明
Size单条容量,确认是否符合规格
Speed内存频率,确认是否达到标称值
Type内存类型,DDR4/DDR5
Locator槽位信息,确认内存安装位置正确
Manufacturer品牌,确认是否符合BOM要求

也可以用free命令快速查看总内存:

[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:          503Gi        12Gi       478Gi       234Mi        12Gi       488Gi
Swap:            0B          0B          0B


三、内存测试方法

内存测试主要分两类:功能验证压力测试

1. 功能验证 — 读写速率

使用STREAM测试内存读写带宽,验证内存性能是否达标:

[root@localhost ~]# gcc -O3 -fopenmp stream.c -o stream
[root@localhost ~]# ./stream
-------------------------------------------------------------
STREAM version $Revision: 5.10 $
-------------------------------------------------------------
Number of Threads requested = 128
-------------------------------------------------------------
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:          185432.3     0.008658     0.008628     0.008702
Scale:         179856.7     0.008912     0.008896     0.008934
Add:           196324.5     0.012198     0.012224     0.012187
Triad:         198756.2     0.012065     0.012074     0.012059
-------------------------------------------------------------

重点关注Triad综合带宽,如果跑分明显偏低,检查:

  • 内存通道是否插满
  • 内存是否按推荐槽位对称安装
  • 内存频率是否正确配置

2. 压力测试

memtest — 专业内存检测工具,逐一检测每个内存单元是否存在故障:

# 安装memtest
yum install memtest86+

# 运行memtest(通常在开机引导阶段运行)
memtest86+

memtest会对内存进行多轮读写校验,发现错误会直接报告出错的内存地址,适合深度检测内存硬件问题。

stress/stress-ng — 对内存施加持续压力,验证稳定性:

# stress对内存加压,占用80%内存跑1小时
stress --vm 4 --vm-bytes 80% --timeout 3600

# stress-ng更精细的内存压力模式
stress-ng --vm 4 --vm-bytes 80% --vm-method all --timeout 3600

压测期间同步监控内存使用情况:

[root@localhost ~]# watch -n 2 free -h
              total        used        free      shared  buff/cache   available
Mem:          503Gi       398Gi        92Gi       234Mi        12Gi       102Gi
Swap:            0B          0B          0B
# 确认内存压力真正跑上去


四、压测时温度和功耗监控

内存压测期间同步监控温度:

# 查看内存相关温度传感器
[root@localhost ~]# ipmitool sensor list | grep -i mem
DIMM_A1_Temp     | 42.000     | degrees C | ok
DIMM_A2_Temp     | 41.000     | degrees C | ok
DIMM_B1_Temp     | 43.000     | degrees C | ok
DIMM_B2_Temp     | 42.000     | degrees C | ok

# 持续采集内存温度日志
watch -n 5 'ipmitool sensor list | grep -i mem' >> mem_temp_log.txt


五、常见问题及排查

内存压力告警导致测试中断

这是内存压测中最常见的问题,压力跑到一半系统触发告警甚至中断测试。

可能原因和排查方法:

1. 内存温度过高

  • 查看ipmitool温度传感器,确认内存温度是否超过阈值
  • 正常内存工作温度一般不超过85℃
  • 如果温度异常高,检查机房环境温度和服务器风道是否畅通

2. 内存出现硬件错误

  • 查看系统日志有无内存报错:
[root@localhost ~]# dmesg | grep -i memory
[  123.456789] EDAC MC0: 1 CE memory read error on CPU_SrcID#0_MC#0_Chan#0_DIMM#0
# CE表示可纠正错误,UE表示不可纠正错误,UE需要立即更换内存条

3. 内存容量不足

  • 压测占用内存过大导致系统OOM(内存溢出)
  • 适当调低压测内存占用比例:
# 改为占用60%内存
stress --vm 4 --vm-bytes 60% --timeout 3600

4. ECC错误触发

  • 服务器ECC机制检测到内存错误自动告警
  • 查看BMC Web端的系统事件日志(SEL),确认告警类型
  • 也可以用命令查看:
[root@localhost ~]# ipmitool sel list
   1 | 03/02/2025 | Memory | Correctable ECC | Asserted
# 出现ECC告警需记录并评估是否需要更换内存


六、测试时需要记录的数据

指标说明
总内存容量是否和规格一致
内存频率是否达到标称值
STREAM Triad内存综合带宽跑分
内存最高温度压测期间峰值温度,正常不超过85℃
ECC错误次数压测期间是否有ECC告警
压测时长建议至少跑2小时以上

七、总结

内存测试核心关注三点:读写速率达标、压力稳定、无ECC报错。遇到压力告警中断,优先查温度和系统日志,定位是温度问题还是硬件错误。

下一篇我们聊存储详解,包括HDD、SSD、NVMe的测试方法和实操经验,敬请期待!

欢迎关注JACK的服务器笔记