服务器裂开了

上次家里停电,来电的时候服务器没有自动启动。而且启动之后,不知什么原因,BIOS 报告没有可用的启动盘,大概是因为之前自己编译的内核和system boot可能还是没有处理好的原因,最后还需要接上显示器然后进BIOS启动。这趟折腾下来,使用体验实在是不好。家里的电脑,不管其原本是不是很稳定,用作服务器的时候,稳定性还是很重要的,所以2024年度的折腾就提上了日程。

原架构

原架构

原架构是完全基于一台机器构建的。VM里面跑各个Application,单独Backup。VM里面的 extra storage 由 TrueNAS VM 和 OpenMediaVault (OMV) 提供。有一个 GPU VM 专门负责跑 GPU 负载。

Ollama: 自托管LLM的简单方案
这两天心血来潮,看着机箱里面的早就不用来打游戏的显卡,总觉得需要做点什么。碰巧看到Ollama,似乎自托管LLM变得比以往容易了很多。特此尝试一下。文中涉及了Ollama的部署和使用,以及两个UI的使用:Big-AGI和Ollama WebUI。

TrueNAS 和 OMV 作为 VM 时,需要使用独立的 PCI 通道,直通到 VM,基本和直通 GPU 需要的配置差不多。

编译Proxmox内核(暂时)解决IOMMU分组问题
因为仅仅使用PCIE_ASC_OVERRIDE依旧无法成功达成所需的IOMMU分组,故而选择直接编译PVE的内核,暂时解决IOMMU的分组问题。
Proxmox 7.4 GPU Passthrough 显卡直通
近期AI题材火爆,看着家里一堆闲置吃灰的显卡,想想也应该让他们起来干活了,于是想起来组建一个新的PVE服务器,把显卡用上。又因为显卡虚拟化的支持目前应该还是不太稳定的状态(想来老黄是不可能给消费级显卡官方虚拟化的能力的),而且即使服务器端驱动搞定了,License的问题应该还是会成为绊脚石,所以还是选择了更为稳妥的直通方案。计划是直通显卡给一个Ubuntu server,然后在其上通过Docker部署一些简单的应用。

主板上面的 SATA 口主要是留给 Proxmox 用作 backup。 TrueNAS 同时还为 Proxmox 提供额外的 Backup storage。而两个高速的 NVME 组成 ZFS Mirror 为 VM 提供 root storage。

记录一次不严谨的ZVOL虚拟机顺序写入性能的测试
一直以来对于建构在ZVOL上面的虚拟机磁盘性能都不太满意。今天机缘巧合,测试一下,看看如何提高顺序的写入性能。 记录 测试平台 * Host OS: Proxmox VE 7.4 * CPU: i5 7600K * RAM: 64GB DDR4 2400 No-ECC * Motherboard: Gigabyte Z270p-D3 * Host File System: ZFS * 一个非常不入流的SATA转接卡:基于ASMedia asm1061的PCIE 3.0 x1转4口SATA * M.2 NVME: ADATA 850 2T * HDD: 2 x Seagate EXOS 14TB + 1 WD EDGZ 14TB 测试方法非常的粗暴

同时这台机器自然也是要接上 UPS 的。

为Home Server配置UPS(一):配置NUT服务监控UPS - Setup NUT Primary Node
最近刚刚把 Proxmox 主机上面的 NUT server 搞定,趁着热乎赶紧水一篇,过几天可能就又忘了。NUT 服务是 C/S 架构的,主要考虑的应用场景是,UPS给多台电脑供电,而其中一台主机为主,它负责与UPS的通信,同时也成为NUT中的服务器。其他的主机则运行客户端,经由NUT server获取UPS的情况数据以及决定是否需要关机等操作。 首先是server主机,需要负责与UPS的通信链接,并需要配置一些服务端的信息。 * Step 1: Install NUT * apt install nut * 这一步应该也会创建一个 nut 的用户(会有一个单独的group: nut) * Step 2: Use nut-scanner to find the connected UPS device $ nut-scaner # Output SNMP library
为Home Server配置UPS(二): 配置NUT服务的Web UI - Setup NUT - Web UI
UPS 本文紧接之前的Primary Node。没有搞定主机和UPS通信的朋友请想看链接的这个文章。 配置NUT服务监控UPS: Setup NUT - Primary Node最近刚刚把 Proxmox 主机上面的 NUT server 搞定,趁着热乎赶紧水一篇,过几天可能就又忘了。NUT 服务是 C/S架构的,主要考虑的应用场景是,UPS给多台电脑供电,而其中一台主机为主,它负责与UPS的通信,同时也成为NUT中的服务器。其他的主机则运行客户端,经由NUTserver获取UPS的情况数据以及决定是否需要关机等操作。 首先是server主机,需要负责与UPS的通信链接,并需要配置一些服务端的信息。 * Step 1: Install NUT * apt install nut * 这一步应该也会创建一个nut的用户(会有一个单独的group: nu…Dako’s BlogDako 因为这里的主机是Proxmox VE,所以最干净简洁的办法就是直接创建一个新的LXC,在其中安装配置GUI。LXC的overhead基本可以忽略不计,而相比于在Host上面直接配置GUI,使用LXC

128 GB 的内存保证了无论是运行 TrueNAS,还是 Proxmox 本身的 ZFS,还是 Application的需求,甚至在CPU上面跑不特别大的LLM,内存都是够用的。4C8T的CPU确实有点捉襟见肘。Jellyfin如果不使用iGPU的Quick Sync加速,就没办法搞定4K transcoding。

这套系统其实目前来看,运行的还是不错的。

  • VM 里面的数据基本上都有 4 份以上
    • Proxmox ZFS mirror (2 copies) + TrueNAS ZFS Mirror (2 copies) + Proxmox storage (2 disks, 1 copy per disk) = 6 copies.
  • Jellyfin 通过 LXC 运行,可以使用 iGPU,达成硬件加速。
  • 所有的 Application 入口都用 OPNSense 防火墙做隔离,只是可惜性能不够,无法长期打开 IDS/IPS。

问题

问题就是这个架构的扩展性不行:

  • 最重要的 Storage 服务是通过虚拟机提供的。如果Promox挂掉,则连最基本的 Storage 都没有了。虽然理论上 Proxmox 不应该经常挂,但是由于 human factor 过重,各种毛病都是人类错误导致的,所以实际使用中,Storage 的稳定性就比较难堪。
  • CPU 性能受限。4T8C意味着无法稳定运行 IDS/IPS 以及 CPU 负责的 transcoding。虽然 LXC 也可以搞定 Jellyfin 的 transcode。但是牺牲了 mobility,并且还要忍受 LXC 上面跑 docker 跑不掉的 VFS。
  • 不方便未来的升级路线。Storage 和 Compute 以及 Networking 实际上很难同时兼顾。
    • Compute 实际上需要的大量和CPU性能,对空间的需求并不是特别高,没有不需要很多的 SATA 口。实际上最近大量流行的 mini PC 实际上很合适做 compute node。一定程度上来讲,小型计算的需求和大厂推广的 Edge Computing 是非常吻合的。这也印证了为什么前两年 AsRock 的 ITX server motherboard 和 Intel Xeon D-1500 在 DIY server 领域有一定的流行。不过这两年都被大量的 mini-PC 取代了。
    • Storage 节点实际上最大的需求是 Storage ports。包括 SATA, SAS,或者 m.2, U.2。不过对于 m.2/U.2 实际上在 Compute 节点上面更合适,毕竟 VM 里面的 IO 性能很多时候更关键。而 Storage 节点很多时候只是存 bulk data,或者 VM backup。
    • Networking 的需求大多集中在 Ethernet port的数量,1G vs 2.5 vs 10G 网速上面。而对于纯粹的 Compute performance 和 Storage 都不是很在意。当然以上假设,如果网络升级到 10G 以上,或者 VM 通过 iSCSI 挂载 storage node 上面的存储空间,那么各个节点的各方面要求都会提高。如果这时还要考虑 All-in-one,只会更加复杂。

实际上这次的改动就是把 Compute node 和 Storage node 分离开。如果未来需要升级,则完全可以分开升级,各自的升级都会很方便,不会涉及把 VM 的数据挪到 Bare metal 的问题。

新架构

新架构

新架构就是把一个原先闲置的机器(3700x+RTX3090)拿出来做计算节点。因为是个 ITX 的小板子,所以内存只能到 64 GB。但是对于实际使用来讲,应该也是没有问题的。

计算节点

  • 单NVME盘跑 VM,用 ZFS 来提高一下 data integrity,顺便获得 ZFS 的snapshot 功能。
  • HDD 用来存 backup data。
  • OPNSense 用来管理所有 Applications 的网络。
  • GPU 用来跑 GPU 负载。
  • 可以尝试使用 iSCSI 挂载 存储节点的磁盘。之前这么做不稳定因为 TrueNAS 是在 VM 里面,Proxmox 如果依赖 TrueNAS 这个 VM,需要把 Hooks 设定好。而且即使如此,还有有概率出问题。
  • Proxmox 挂载 Storage 节点的空间做额外备份。
  • 3700X 8C16T 的性能可以直接搞定 Jellyfin 4K 软解。不用再为 hardware transcoding 影响稳定性头疼。而且仅依赖 CPU,未来如果有第二台 Proxmox 的服务器,就可以尝试 migrate instance了。对于不太想入坑 Kubernets 的人来说,可能是更方便的方案。

存储节点

  • 直接跑 TrueNAS。告别VM 。方便使用 TrueNAS 上面的各种功能,包括 UPS 的支持,VM 之类,以及 TrueNAS上面奇怪的给予 K3S 的单节点 Kubernetes .
  • NFS, SAMBA 和 TrueNAS 上面跑的基础 Application 不至于受到计算节点的影响。
  • 使用 TrueNAS 机器直接做备份更加容易,不需要提前设定很多 PCI Pass Through。现在只需要 插上,mount,rsync,umount,拔下就可以了。
  • 不用担心折腾计算节点上面的网络,影响到存储节点。
  • 主板上面和扩展卡的所有 SATA 接口都可以用来跑存储。大大提高了未来数据的扩展空间。

总结

新的架构分离了计算节点和存储节点。提高了可靠性,也为未来的可玩性留足了空间。

这次开始使用 AMD 的 CPU 跑 Proxmox,之后有时间记录一下有什么坑。同时也借这个机会,从头记录一下 set up 一个 Proxmox 机器的过程。