洋垃圾 RD452X 装机记录
0x00 装机
笔者近期因实验和工作需要,装了一些机器。与读书时装机只为玩 NAS、跑模糊测试不同,上班之后的装机有了一些明确目的:办公、DevOps、实验等等。比较值得讨论的有:
- 零刻 EQ14 小主机(N150,需要配备笔记本 DDR4 内存条)。虽然 4 小核性能孱弱,但是足够轻办公使用;且自带双网卡、内置电源适配器。缺点在于只能插单条内存、第二个 M2 口是 PCIe 3.0 x1。它的唯二用途大概就是文档类办公或者当软路由,稍复杂一点的需求就会超过它的能力。最初笔者给它搭配 8G 内存条(高中时的笔记本上拆下来的),后来发现不够用,重新买了一条 16G 内存。这样算下来,其实性价比不算突出(以目前的价格,N150 准系统 699 CNY,但 A520 + 5600G 板 U 只要 1050 CNY,性能、稳定性、扩展性都远胜 N150),只在比较窄的应用场景下成为优选。
- 联想 M715q 小主机(搭配 R5-2400GE,笔记本 DDR4 内存条),它代替 5600G 担任了家里的 NAS,主要优势是省电(9 W,每天 0.2 度电)。准系统 + 电源 + CPU 的价格是 408 CNY,性价比很高,跑 win10 + Hyper-V 无压力。不过它的扩展性太差,不宜做 all-in-one 机器。
- 两台单路 X99 机器(使用 E5-2680 V4,配 DDR4 REGECC 内存),用于虚拟化。X99 算是最典型的“洋垃圾”,前几年市场上的主板大多搭载 B85 等芯片组,但现在主流的 X99 主板普遍是原生 C612 芯片组。笔者这几个月用了精粤 X99M GAMING D4 主板(279 CNY)、科脑 X99 D4M4 主板(182 CNY),都很稳定。PVE 虚拟化场景下,一般 CPU 不会跑到满功率,二十块钱的 4pin 散热器就足够了。笔者装机时使用的是利民 AX120R SE(LGA2011 专用),后来发现没有必要。
- 华硕 X99-E WS/USB3.1 机器,用于跑 LLM。E5 V4 本身只有 40 条 PCIe lane,想正常操作 4 张 PCIe x16 显卡就需要 PLX 芯片帮忙。这块主板自带两块 PLX 8747 芯片,可以插 4 张双槽宽度显卡,其中 GPU0、GPU1 挂在同一颗 PLX 下,GPU2、3 挂在另一颗 PLX 下,跑
p2pBandwidthLatencyTest
可以发现 GPU0 $\leftrightarrow$ GPU1 的通讯速率比 GPU0 $\leftrightarrow$ GPU3 快。不过折腾半天,感觉本地 LLM 的水平实在是不堪入目,只能为了遵循数据传输合规性而捏着鼻子用。
以上装机过程,与装台家用机并无多少区别。不过,笔者最近装了两台 RD452X 机器,与这块主板斗智斗勇的旅途十分有趣,因此今天写一篇文章与读者分享。
0x01 购买组件
当时,笔者的原始需求是:装一台双路的、256G 内存的塔式主机用于虚拟化,在符合要求的前提下尽量压缩成本。笔者最初考虑科脑(275 CNY)和华南(528 CNY)的主板,准备下单之时,鬼使神差地看到了一段 B 站视频介绍 RD452X。这块主板引出了 8 个内存通道(每通道 2 插槽)、自带 IPMI 管理口,而且价格只需 129 CNY。笔者身为垃圾佬,岂有不买的道理。
这块主板叫做联想 RD452X,实为英业达代工,在英业达那里称为 K800G3,据说是阿里巴巴在北美的服务器淘汰下来的。主板照片如下:
主板搭载一颗 AST2400 芯片,兼具 IPMI 和 VGA 两种用途;PCIe 插槽只有两条 x16,且分别连接到不同的 CPU;提供了两个 SATA 口和两个 SFF8643 接口(注意只能转 SATA,主板上没有 SAS 控制器);没有 M2 接口。最引人注目的是三个 OCP 接口,这个接口上面走的仍然是 PCIe 协议,可以连接千兆/万兆网卡、直通卡。
值得注意的是,虽然主板上自带一个网口,但那是 IPMI 管理口,不能当作业务口使用。所以,我们想要使用这块主板,还得额外加一张网卡。相关配置单:
组件 | 型号 | 价格 |
---|---|---|
主板 | RD452X | 129 |
CPU | E5-2680 V4 | 60 每颗 |
内存 | DDR4 REGECC | 174 每 32G(近期波动剧烈) |
网卡 | PCIe 千兆单口螃蟹卡 | 40 |
网卡 | OCP 双口千兆 Intel | 45 |
直通卡 | 2308 直通卡(PCIe) | 55 |
直通卡 | 2308 直通卡(OCP) | 20 |
散热 | 超频3 红海mini | 33 每个 |
电源 | 尘雨 玄武400K | 100 |
机箱 | 标准 E-ATX 机箱 | 90 |
0x02 点亮主板
主板到货之后,笔者立刻发现一个尴尬的事实:尽管主板左侧有三个 OCP 接口,但同一店家所售的 OCP 网卡,无论装在哪个上面都不合适。这是因为,第一个接口装不上,会被拦住(下图 1);第二个接口在 IO 挡板上无开口(下图 2);第三个接口可行,然而需要用斜口钳修剪机箱上的对应位置,很不雅观(下图 3)。于是,我们只能退而求其次,使用 PCIe 网卡。这样就把宝贵的两个 PCIe 槽中占用了一个。
另外,还有一个小插曲。笔者的内存是分批购买的,装机时,发现每条内存都可以单独亮机,但互相搭配时有时无法亮机。排查一番,发现某两根内存条不能与其他内存条一同使用。进一步发现这两条特殊内存的型号是 PC4-2666V-LB1,而其他内存条是 PC4-2666V-RB2。查阅资料,得知内存条分为 LRDIMM 和 RDIMM,这两种是不能混用的。于是把 LRDIMM 条换货成 RDIMM,果然成功点亮 8 × 32G 内存,在 SATA SSD 上安装 PVE,工作正常:
0x03 配置 IPMI
前文提到,服务器上有 IPMI 口,但这块主板是从阿里巴巴淘汰的,我们不知道 IPMI 密码。这没有关系,我们使用 ipmitool 重置之:
apt install ipmitool
# 列出用户
ipmitool user list 1
# ID Name Callin Link Auth IPMI Msg Channel Priv Limit
# 1 false false true ADMINISTRATOR
# 2 admin true true true ADMINISTRATOR
# 3 taobao true true true ADMINISTRATOR
# 4 true false false NO ACCESS
# 5 true false false NO ACCESS
# 6 taobao true true true ADMINISTRATOR
# 7 alibaba true true true ADMINISTRATOR
# 8 true false false NO ACCESS
# 9 true false false NO ACCESS
# 10 true false false NO ACCESS
# 重置密码
ipmitool user set password 2 **********
去 BIOS 里指定 IPMI 的 IP 地址(默认是 DHCP 分配):
成功登入 IPMI:
web 端功能还挺多,但是使用远程控制功能需要 jnlp。笔者也没有进一步研究 IPMI 的 web 端,毕竟大部分操作都可以用 ipmitool 在命令行内完成。
0x04 给 SAS2308 刷入 IT 固件
店家有卖 OCP 接口的 SAS2308 阵列卡,仅售 20 CNY,简直白送,但卖家不会帮忙刷 IT 固件,所以我们得自己把阵列卡从 IR 模式刷成 IT 模式。
开机之后进入阵列卡配置菜单,可见当前固件是 15.00.00.00-IR:
阅读博通的官方指引,我们得知,想要把 IR 固件刷成 IT 固件,需要使用 DOS 版的 sas2flsh 工具。在此处下载 9207-8i 固件,解压之后看到:
我们需要使用三个文件:IT 固件 Firmware/HBA_9207_8i_IT/9207-8.bin
、DOS 刷写工具 sas2flash_dos_rel/sas2flsh.exe
、BIOS 文件 sasbios_rel/mptsas2.rom
。先用 rufus 把 U 盘刷成 FreeDOS 启动盘,将上述 3 个文件复制到 U 盘根目录:
用 U 盘启动,进入 FreeDOS。我们先备份当前版本的固件:
sas2flsh.exe -o -uflash bak.bin
大约 10min 的等待之后,提示备份成功。接下来执行以下指令:
# 擦除旧固件
sas2flsh.exe -o -e 6
# 刷入新固件和 BIOS 文件
sas2flsh.exe -o -f 9207-8.bin -b mptsas2.rom
# 写回 SAS 地址(16 位字符串,可以从直通卡的白色贴纸上读到)
sas2flsh.exe -o -sasadd 500A.........E20
# 验证已烧入 IT 固件
sas2flsh.exe -o -listall
重启,按 Ctrl+C,我们看到固件已经刷成 IT:
0x05 格式化硬盘
可能读者会疑惑“格式化硬盘”为什么值得单列一章;笔者在接触到这块二手 SAS 硬盘之前,也没想到格式化硬盘有如此麻烦。事情是这样的:这几个月硬盘价格一直居高不下,往年 200 CNY 可以买到 4T 的二手 SATA 硬盘,现在纯属做梦。笔者于是从浦东服务器买了一块 3T 二手 SAS 硬盘(这也是需要安装阵列卡/直通卡的原因),是 IBM 的货,150 CNY,还算合理。然而,当笔者像往常一样执行 fdisk /dev/sdb
的时候,意外出现了:
root@BareMetal:/home/neko# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
fdisk: cannot open /dev/sdb: Input/output error
root@BareMetal:/home/neko#
笔者把 Gemini 2.5 Pro 请来排查,找到以下关键信息:
# dmesg
sd 0:0:0:0: [sdb] tag#... FAILED Result: hostbyte=DID_ABORT driverbyte=DRIVER_OK
sd 0:0:0:0: [sdb] tag#... Add. Sense: Logical block reference tag check failed
protection error, dev sdb, sector 0 op 0x0:(READ) flags ...
Buffer I/O error on dev sdb, logical block 0, async page read
# smartctl -a /dev/sdb
smartctl 7.3 2022-02-28 r5338 [x86_64-linux-6.1.0-32-amd64] (local build)
Copyright (C) 2002-22, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Vendor: IBM-ESXS
Product: HUS723030ALS64
Revision: J26C
Compliance: SPC-4
User Capacity: 3,000,592,982,016 bytes [3.00 TB]
Logical block size: 512 bytes
Formatted with type 2 protection
...
注意这里的 Formatted with type 2 protection
,提示这硬盘不是坏了,只是处于一种保护模式。它曾经在存储阵列上工作,每个扇区由 512 字节的数据和 8 字节的元数据组成,而我们现在如果想要使用它,则需要将其格式化成标准的每扇区 512 字节的格式。这个步骤需要用 sg3-utils 执行,我们先 dry run 一遍:
# apt install sg3-utils
# sg_format --format --fmtpinfo=0 --size=512 --dry-run --verbose /dev/sdb
IBM-ESXS HUS723030ALS64 J26C peripheral_type: disk [0x0]
PROTECT=1
<< supports protection information>>
Unit serial number: YVJ7DSXD
LU name: 5000cca03e7e3630
mode sense(10) cdb: [5a 00 01 00 00 00 00 00 fc 00]
Mode Sense (block descriptor) data, prior to changes:
block count maxed out, set <<longlba>>
mode sense(10) cdb: [5a 10 01 00 00 00 00 00 fc 00]
<<< longlba flag set (64 bit lba) >>>
Number of blocks=5860533168 [0x15d50a3b0]
Block size=512 [0x200]
A FORMAT UNIT will commence in 15 seconds
ALL data on /dev/sdb will be DESTROYED
Press control-C to abort
A FORMAT UNIT will commence in 10 seconds
ALL data on /dev/sdb will be DESTROYED
Press control-C to abort
A FORMAT UNIT will commence in 5 seconds
ALL data on /dev/sdb will be DESTROYED
Press control-C to abort
Due to --dry-run option bypassing FORMAT UNIT command
Format unit would have received parameter list: 00 02 00 00 00 00 00 00 00 00 00 00
Format unit cdb fields: fmtpinfo=0x0, longlist=0, fmtdata=1, cmplst=1, ffmt=0 [timeout=20 secs]
Format unit command launched without error
No point in polling for progress, so exit
可以正常执行。我们去掉 --dry-run
标签,进入漫长的低级格式化过程。睡了一觉,次日早晨发现硬盘格式化完毕。
0x06 ZFS 性能测试
我们有海量的内存,但 SSD 空间紧缺,不得不用 SAS 机械硬盘存放虚拟机。这种情况下,使用 ZFS 就成为了最优选择:它会疯狂使用我们的内存作为磁盘缓存,从而大幅提升机械硬盘的使用体验。我们创建 ZFS:
在它上面放置虚拟机,然后我们观察虚拟机中的磁盘 IO 性能。先创建测试文件:
# 在 pve 主机执行
arcstat 1
# 以下在虚拟机中执行
# 创建测试文件
fio --name=prepare-seq --filename=seq-testfile --size=8G --rw=write --bs=1M
我们注意到,创建测试文件的前 60% 都很快,然后就慢了下来。这是因为,在命令开始时,ZFS 并未立即把每个数据块都写入 HDD,而是先写进内存。当内存中的待写入数据达到阈值(默认是内存总量的 10%),ZFS 便开始批量写入 HDD。此时,创建测试文件的速度就慢了下来,最终定格在 72 MB/s。
执行顺序读取测试:
fio --name=seq-read-cold --filename=seq-testfile --size=8G \
--rw=read --bs=1M --direct=1 \
--ioengine=libaio --iodepth=16 --group_reporting --runtime=60
这一次,读取速度达到了 4308 MB/s,是典型的内存速度:
下面执行顺序写入测试:
fio --name=seq-write --filename=seq-testfile --size=8G \
--rw=write --bs=1M \
--ioengine=libaio --iodepth=16 --group_reporting --runtime=60
IO 表现与创建测试文件时一致,先是很快,然后变慢:
再来测 4K 随机读取:
fio --name=rand-read --filename=seq-testfile --size=8G \
--rw=randread --bs=4k --direct=1 \
--ioengine=libaio --iodepth=16 --group_reporting --runtime=60
4K 随机读取的 iops 达到了惊人的 104k,平均延迟 143.14 us,可见这 8G 的文件完全被缓存了。接下来执行 4K 随机写入测试:
fio --name=seq-sync-write --filename=seq-testfile --size=8G \
--rw=write --bs=4k --sync=1 \
--ioengine=libaio --iodepth=16 --group_reporting --runtime=60
4K 随机写入的 iops 降低到 10.3k,不过仍然在可以接受的范围内。最后,我们来测 4K 顺序同步写入(发出写入请求后,等待设备执行完毕,再发下一个):
fio --name=sync-write \
--filename=seq-testfile \
--rw=write \
--bs=4k \
--size=1G \
--sync=1 \
--group_reporting --runtime=60
这次结果是灾难性的,仅有 53 iops。这说明,每次写入都需要等待 HDD 执行完毕。
0x07 使用傲腾作为 slog
既然 ZFS 需要保证断电不丢数据,那么,当我们发出同步写入请求时,ZFS 除了把数据写进硬盘之外别无他法。软件层面是无法优化的,但我们可以做硬件层面的优化——给 ZFS 一块读写飞快的 SSD,将它作为 HDD 的缓存。由于 SSD 掉电不会像内存一样丢数据,故我们断电重启之后,可以恢复状态。
笔者采购了一块 16G 傲腾,用 PCIe 转 M2 的转接器插在主板上。接下来,我们需要让 ZFS 用上它,但 PVE 不能在 web gui 中给已经创建了的 zfs 添加 slog 设备。要在 shell 中执行以下命令:
# 列出硬盘
root@lab:~# ls -l /dev/disk/by-id/
# ...
lrwxrwxrwx 1 root root 13 Jun 22 23:20 nvme-eui.5cd2e44bc5c40100 -> ../../nvme0n1
lrwxrwxrwx 1 root root 13 Jun 22 23:20 nvme-INTEL_MEMPEK1J016GAL_PHBT9095039K016N -> ../../nvme0n1
lrwxrwxrwx 1 root root 13 Jun 22 23:20 nvme-INTEL_MEMPEK1J016GAL_PHBT9095039K016N_1 -> ../../nvme0n1
# ...
# 观察当前状态
root@lab:~# zpool status hdd-3t-ibm
pool: hdd-3t-ibm
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
hdd-3t-ibm ONLINE 0 0 0
scsi-35000cca03e7e3630 ONLINE 0 0 0
errors: No known data errors
# 添加 slog 设备
root@lab:~# zpool add hdd-3t-ibm log /dev/disk/by-id/nvme-INTEL_MEMPEK1J016GAL_PHBT9095039K016N
# 观察新状态
root@lab:~# zpool status hdd-3t-ibm
pool: hdd-3t-ibm
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
hdd-3t-ibm ONLINE 0 0 0
scsi-35000cca03e7e3630 ONLINE 0 0 0
logs
nvme-INTEL_MEMPEK1J016GAL_PHBT9095039K016N ONLINE 0 0 0
errors: No known data errors
至此,我们成功创建了 slog。再测一次 4K 同步连续写入:
傲腾 slog 的效果可谓立竿见影,iops 涨到 3512,现在我们这套虚拟化环境可以放心投入使用了。最后放一张网卡、傲腾、直通卡的合影: