Linux操作系统的核心(kernel)是不断迭代精进的,包含正式改版或若干程度的修补(patch,对岸称为补丁)等,而在正式迭代前会先有人提交,提交后需要再评估确认,有些会舍弃,有些会纳入后续正式的迭代。
最近64位Arm架构的Linux核心程序,有一家自由软件顾问公司Igalia尝试在树莓派上模拟NUMA(Non-Uniform Memory Access,翻译成非统一内存存取,但使用不普遍),如此可以让第五代树莓派(RPi 5)增速6%~18%,这作法已经在Linux核心清单的相关讨论中,由账号Tvrtko Ursulin所提出。
本文引用地址:
图一:第五代树莓派单板计算机(图片来源:Amazon)
NUMA简述
在这里要先说明一下何谓NUMA,这其实是一种计算机硬件架构,1990年代UNIX高阶服务器飞速发展时,系统内CPU数目的增加、RAM容量的增加,但要让多颗CPU跟过往一样,都存取同一块RAM内存空间,这一段存取变成了效能瓶颈,故系统商开始提倡NUMA。
NUMA把内存分切、配发给CPU,CPU平常多数时间只存取自己所属的内存,必要时才与其他内存快进行数据同步或交换,另外NUMA也可能将内存分层,分成CPU专属层、一个群中的共享层、整体系统的共享等等。
虽然有这些空间切分、数据同步机制,但这些都以硬件方式实现,是在背地里无形中运作,软件执行上感受不到差异,运作上仍然以为是一个整体连续的内存空间。Linux核心在2.5版后也支持NUMA。
效能提升6%~18%
虽然Linux核心支持NUMA,但如果系统硬件设计上本身就没有NUMA,Linux核心的NUMA功能一样无法发挥,RPi 5即是如此,主要是RPi 5的主控芯片BMC2712没有。
不过,前述的Igalia公司提出一个核心修补程序,让树莓派系统跑一个NUMA仿真软件(Emulator),以软件方式实现NUMA(可能搭配运用上BMC2712内的GPU),这个修补程序其实才约100行,主要的C语言程序代码也不到60行。
#include
#include "numa_emulation.h"
static unsigned int emu_nodes;
int __init numa_emu_cmdline(char *str)
{
int ret;
ret = kstrtouint(str, 10, &emu_nodes);
if (ret)
return ret;
if (emu_nodes > MAX_NUMNODES) {
pr_notice("numa=fake=%u too large, reducing to %un",
emu_nodes, MAX_NUMNODES);
emu_nodes = MAX_NUMNODES;
}
return 0;
}
int __init numa_emu_init(void)
{
phys_addr_t start, end;
unsigned long size;
unsigned int i;
int ret;
if (!emu_nodes)
return -EINVAL;
start = memblock_start_of_DRAM();
end = memblock_end_of_DRAM() - 1;
size = DIV_ROUND_DOWN_ULL(end - start + 1, emu_nodes);
size = PAGE_ALIGN_DOWN(size);
for (i = 0; i < emu_nodes; i++) {
u64 s, e;
s = start + i * size;
e = s + size - 1;
if (i == (emu_nodes - 1) && e != end)
e = end;
pr_info("Faking a node at [mem %pap-%pap]n", &s, &e);
ret = numa_add_memblk(i, s, e + 1);
if (ret) {
pr_err("Failed to add fake NUMA node %d!n", i);
break;
}
return ret;
修补程序相关的C语言程序代码,一起头即放入Linux内存区块的含括档memblock.h及NUMA模拟的含括档numa_emulation.h(数据源:CNX Software)
相关配套修改也包含在操作系统上要使用一个NUMA_EMULATION的新Kconfig选项,核心启动参数要加入numa=fake=,然后搭配命令行numactl –interleave=all COMMAND等,如此可以改变BMC2712内存储器控制器的存取方式,另外也要透过systemd命令来重新配置系统范围政策(system-wide policy)。
既然NUMA是为了让整体系统更具效能的,那就需要测试看看NUMA仿真软件是否真的有效果,对此用效能基准程序Geekbench 6来测试,发现有无安装修补程序确实有效能差异。
测试的结果显示,安装修补程序后的单核效能提升约6%,多核(RPi 5有4个核心)则提升到18%,这样的提升形同把2.4GHz的RPi 5超频到2.83GHz。
仍待观望
虽然测试结果不错,但目前还有两个问题,一是真的在一般运用上能得到加速感受吗?有时基准检验的跑分不错,实际上没有帮助,类似纸上成绩不错,实际表现不佳,因此信息业界有时也会强调所谓的real application performance,而不是看benchmark。
另一个问题是:这个修补程序提交出去了,但是否能正式列入成Linux核心修补还需要一段时间,且估计时间冗长。目前提交上的相关讨论似乎有不乐意的声音出现,认为这有点变通取巧不正规,不应该正式列入,一旦正式列入就需要后续一连串的相关维护等。
结语
最后笔者觉得,无论提交能否纳入正式核心修补,这一尝试肯定是正向的,过往的树莓派其实在I/O方面已经出现瓶颈(芯片内的Interconnect带宽不足),硬件规格数字虽已与过往PC相仿,效能却仍有落差,估计这是新一代树莓派要额外提出RP1附属搭配芯片的原因。
既然有人提出NUMA仿真软件,这表示开始有人尝试提升树莓派的内存存取效率,会引起各方关注此一环节的效能提升,是真的起用仿真软件来零成本提升效能,还是考虑在下一代的树莓派主控芯片上改善此一环节的硬件设计,对用户而言都是好消息。
“掌”握科技鲜闻 (微信搜索techsina或扫描左侧二维码关注)