本期为服务器操作系统常见问题第七篇,介绍在系统下查看CPU核心数量与硬件规格不一致的问题。
【问题描述】
服务器中配置了2颗AMD EPYC 9654 处理器,从AMD官网查看单颗处理器核心数量为96,那么配置2颗CPU,在系统下查看CPU核心数量应为192。
图1 CPU规格信息
然而,在系统下执行lscpu命令以检索当前系统下的CPU核心信息时,发现仅显示了128个核心,系统可能未完全识别或激活所有可用的CPU核心:
图2 系统下lscpu信息
【过程分析】
(1)对系统启动过程进行深入分析,通过检查dmesg日志文件,观察到在内核初始化阶段,CPU信息的识别过程中,系统确实仅识别了128个处理器核心:
[ 1.141827] smpboot: CPU0: AMD EPYC 9654 96-Core Processor (fam: 19, model: 11, stepping: 01)
[ 1.246473] smpboot: Booting Node 0, Processors #1 #2 #3 #4 #5 #6 #7 #8 #9 #10 #11 #12 #13 #14 #15 #16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31 #32 #33 #34 #35 #36 #37 #38 #39 #40 #41 #42 #43 #44 #45 #46 #47 #48 #49 #50 #51 #52 #53 #54 #55 #56 #57 #58 #59 #60 #61 #62 #63 OK
[ 1.398382] smpboot: Booting Node 1, Processors #64 #65 #66 #67 #68 #69 #70 #71 #72 #73 #74 #75 #76 #77 #78 #79 #80 #81 #82 #83 #84 #85 #86 #87 #88 #89 #90 #91 #92 #93 #94 #95 #96 #97 #98 #99 #100 #101 #102 #103 #104 #105 #106 #107 #108 #109 #110 #111 #112 #113 #114 #115 #116 #117 #118 #119 #120 #121 #122 #123 #124 #125 #126 #127
[ 1.633732] Brought up 128 CPUs
[ 1.633734] smpboot: Max logical packages: 8
[ 1.633740] smpboot: Total of 128 processors activated (614403.45 BogoMIPS)
(2)除了分析dmesg日志外,还检查了 /proc/cpuinfo 文件和 /sys/devices/system/cpu/ 目录, /proc/cpuinfo文件列出了系统中每个CPU核心的详细信息,而 /sys/devices/system/cpu/ 目录则包含了CPU的在线状态和其它属性。在这两个目录看到也只有128个处理器核心是在线状态:
# cat /proc/cpuinfo | grep “processor:”| wc –l
128
# cat /sys/devices/system/cpu/present
0-127
# cat /sys/devices/system/cpu/online
0-127
(3)以上信息说明,操作系统确实只识别到了128个CPU核心,需要进一步检查硬件或BIOS方面的情况。
ACPI表是高级配置和电源接口规范的一部分,是一组定义在ACPI规范中的数据结构,它们提供了操作系统与硬件之间关于系统配置、电源管理、事件处理、热插拔设备支持等关键信息的传递机制。
ACPI表在系统启动时由BIOS初始化,为操作系统提供必要的硬件配置信息、电源管理能力、中断管理、错误处理机制等,是ACPI架构中的核心组成部分,帮助操作系统识别和管理硬件资源,执行电源状态转换,响应系统事件,以及进行性能和热管理。
以下是一些对于操作系统的启动和运行至关重要的ACPI表:
Table | 描述 | 说明 |
---|---|---|
FADT | Fixed ACPI Description Table | 提供系统电源管理的关键信息,包括ACPI硬件的物理地址、电源状态转换、定时器频率等 |
DSDT | Differentiated System Description Table | 包含AML代码,定义了系统的硬件特性和配置,是操作系统理解和配置硬件所必需的 |
MADT | Multiple APIC Description Table | 描述了系统中的多个APICs,包括CPU本地APIC和I/O APIC,对于多处理器系统中的中断管理至关重要 |
RSDT | Root System Description Table | 提供了系统中所有其他ACPI表的索引,是操作系统查找和解析其他ACPI表的起点 |
XSDT | Extended System Description Table | 是RSDT的64位版本,用于64位系统架构,提供了对更多ACPI表的索引 |
FACS | Firmware ACPI Control Structure | 提供了ACPI固件控制结构,包含系统控制状态和全局控制字段 |
SSDT | Secondary System Description Table | 允许系统或硬件供应商添加额外的AML代码,以扩展或修改DSDT中定义的行为 |
HEST | Hardware Error Source Table | 提供了硬件错误报告的结构化方法,对于系统稳定性和错误恢复非常重要 |
操作系统中可用的CPU信息,来源自内核在启动过程中解析的MADT(Multiple APIC Description Table)。每个被系统识别的处理器都必须在MADT中对应一个本地APIC条目,其中“Enabled”属性是关键指标,用以表明硬件是否允许该处理器在操作系统中被启用。
图3 ACPI Specification 6.5
因此,若系统仅识别出128个处理器核心,可以优先检查下MADT中的相应记录,是否未完全启用或存在配置不当,在对硬件设置或BIOS固件进行检查前,先从系统下检查MADT的数据。
(4)将APIC Table(Multiple APIC Description Table (MADT))反汇编为可查看的AML代码形式的dsl文件
系统下的ACPI表存储于 /sys/firmware/acpi/tables 目录下,可以通过acpica-tools套件工具提供的iasl命令进行反编译查看:
图4 解析APIC Table
图5 查看APIC Table解析结果
(5)通过对APIC.dsl文件的检查,对可用CPU核心数量的统计分析,结果确认仅有128个核心被标记为已启用(即Processor Enabled),这表明,BIOS填充并传递给操作系统的APIC表中仅声明了128个可用的处理器核心。
因此,操作系统在启动和硬件探测阶段,相应地只能识别并初始化128个CPU处理器核心的信息,说明系统硬件配置与操作系统识别之间可能存在同步或配置差异,需要进一步检查BIOS设置或硬件配置:
图6 检查Processor Enabled数量
(6)在对BIOS配置进行检查时,注意到针对CPU核心数量限制的特定设置项"CCD Control",可以用于调整实际使用的CCD数量,经对照BIOS用户手册,发现该选项的默认值是“Auto”,但当前被设定为"4 CCDS"。
图7 BIOS中CCD Control参数
由于单个AMD EPYC 9654 CPU设计上有96个核心,这些核心按照12个CCX(每个CCX包含8个核心)以及6个CCD(每个CCD由2个CCX组成,即16个核心)的架构组成。
图8 AMD CPU核心,CCX及CCD的关系
由于当前配置下缺少2个CCD,故CPU核心数量相应减少了2*16=32个,因此,每颗CPU实际可用的核心数量将降至64个,两颗CPU合计则为128个核心,对应了操作系统所识别到的CPU核心数量,说明操作系统层面观察到的问题现象与BIOS这个设置之间存在直接关联。
(7)经过确认,该服务器先前进行了涉及CPU超频及散热系统性能的相关测试,修改过限制CPU核心数量的配置,偏离了原始的默认设置,需要将其调整回标准默认状态,将BIOS中"CCD Control"选项重新配置设定为"Auto"模式后,重启进入操作系统后,CPU核心数量恢复至预期的192个核心,说明每颗AMD EPYC 9654处理器的完整核心配置得到了系统的正确识别和初始化:
图9 BIOS中CCD Control设置
图10 正确的lscpu信息
【问题根因】
系统下识别的CPU核心数,来源于BIOS提供给操作系统的多处理器描述表MADT(Multiple APIC Description Table),在本次系统问题诊断中,我们发现操作系统识别到的CPU核心数量异常,不符合硬件规格,经过深入分析,确定问题根源在于BIOS提供的高级配置和电源接口(ACPI)中的多处理器描述表(MADT)。在操作系统下,通过使用acpica-tools工具集内的iasl命令对MADT数据进行反编译,检查了表中CPU核心启用状态的配置信息,发现其中只有128个处理器核心被标记为启用状态。
根据AMD EPYC 9654处理器的设计规格,每颗CPU应具备96个核心,两颗CPU合计应有192个核心,对应6个CCD(每个CCD包含16个核心)。然而,由于BIOS中的"CCD Control"选项设置为"4 CCDS",导致限制了CPU核心数量,故操作系统仅能识别出128个核心。
【解决方案】
在BIOS中将"CCD Control"选项调整为默认值"Auto"后,重启系统,操作系统成功识别并加载了全部192个CPU核心,恢复了符合硬件规格的CPU核心数量信息。
在现代服务器架构中,BIOS扮演着至关重要的角色,负责在系统启动过程中向操作系统提供详尽的硬件配置信息。这些信息通过ACPI(高级配置和电源接口)表进行传递,操作系统依赖这些ACPI表的信息来识别和配置硬件资源。例如,MADT中的“Processor Enabled”字段指示了哪些CPU核心能够在操作系统中启用。
在系统管理中,对ACPI表的精确解读和配置是确保硬件资源正确识别并使用的关键,BIOS和操作系统之间的交互依赖于这些表中的数据。因此,当遇到硬件识别问题时,可以优先从ACPI表入手,有针对性的检查对应的BIOS设置,以确保BIOS提供给操作系统的硬件信息是准确无误的。这要求系统管理员不仅要熟悉操作系统的硬件识别过程,还要对BIOS的各种设置选项有透彻的了解,这一过程也体现了系统管理中对硬件和软件协同工作机制的深刻理解,以及在面对复杂问题时采取综合诊断方法的重要性。