洋垃圾 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
💡
店家不送 CPU 散热扣具,而此主板的散热器孔位是长方形的(与市面上常见的正方形 2011 专用散热器不兼容),需要自行购买扣具。

0x02 点亮主板

主板到货之后,笔者立刻发现一个尴尬的事实:尽管主板左侧有三个 OCP 接口,但同一店家所售的 OCP 网卡,无论装在哪个上面都不合适。这是因为,第一个接口装不上,会被拦住(下图 1);第二个接口在 IO 挡板上无开口(下图 2);第三个接口可行,然而需要用斜口钳修剪机箱上的对应位置,很不雅观(下图 3)。于是,我们只能退而求其次,使用 PCIe 网卡。这样就把宝贵的两个 PCIe 槽中占用了一个。

💡
双路 CPU 各自需要 12V 供电。如果电源只有一个 CPU 4+4 pin 供电口,可以考虑使用线缆把显卡 6+2 pin 供电口转换为 4+4 pin 给 CPU 供电。

另外,还有一个小插曲。笔者的内存是分批购买的,装机时,发现每条内存都可以单独亮机,但互相搭配时有时无法亮机。排查一番,发现某两根内存条不能与其他内存条一同使用。进一步发现这两条特殊内存的型号是 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,现在我们这套虚拟化环境可以放心投入使用了。最后放一张网卡、傲腾、直通卡的合影:

💡
读者如果不在意多掏点成本,则笔者建议也去了解一下 RD450X。只贵了几百块,但是带双网口,PCIe 也多。