发布时间

2023-04-23

4.23. 6.3

4.23.1. 大特性

4.23.1.1. rseq系统调用支持新ID

这个特性涉及rseq系统调用,我还没有听说过这个系统调用,所以先调查一下这是什么功能。

rseq在我的Ubuntu上连手册都查不到,改查Libc手册可以找到这个:

按这里的说明,它属于librseq,但又说它是libc的一部分。信息还比较错乱,Ubuntu22.04上反正装不了用户态支持,不过它就是个简单的系统调用,所以也不用担心用不了。

整体思路可以参考这个文档:

思路就是仿照ARM的ldex/stex指令,只是换成了函数,rseq指定了三个回调:

  • start_ip:相当于ldex,表示开始执行

  • post_commit_ip:相当于stex成功,表示可以提交数据

  • abort_ip:相当于stex失败,表示你需要再做一次原来的操作

rseq作用在每个线程上,如果你读了数据然后处理,中间没有其他线程来访问过这个数据,就直接提交,否则就abort。这样能保证锁住的时间不会很长。rseq的系统调用是这样的:

static int sys_rseq(volatile struct rseq *rseq_abi, uint32_t rseq_len,
                     int flags, uint32_t sig)
{
    return syscall(__NR_rseq, rseq_abi, rseq_len, flags, sig);
}

其中rseq_abi的结构如下:

../_images/restartable-sequences-diagram.png

这次修改就是调整这里的cpu_id,除了可以用cpu作用区分实体的ID,还可以用NUMA Node ID,Per-Memory map concurrency ID,和NUMA-aware concurrency ID。这个效果等我有时间去拿真设备去验一下再说。

整个修改包含21个补丁,来自Mathieu Desnoyers <mathieu.desnoyers@efficios.com>。这个Effici OS似乎是一个外包公司,提供多核优化服务的。

4.23.2. 其他有趣的东西

  1. BTRFS和eBPF性能优化在KernelNewbies中都被认为是大特性,不过对我都没有什么好跟踪的,就在这里加一个记录吧。

  2. memfd支持MD_NOEXEC_SEAL属性,不让memfd的内存执行。

  3. IPv4支持Big TCP(64KB以上的TSO帧)

  4. 支持AMD两个新QoS特性:

    • Slow Memory Bandwidth Allocation (SMBA),这主要用来支持CXL连接的内存。

    • Bandwidth Monitoring Event Configuration (BMEC),这是PMU事件。

  5. 这个版本NFS的PRCSEC GSS Kerberos 5安全机制默认不用DES和SHA1加密,改为AES-SHA2算法。

  6. BFQ IO调度器增加针对磁盘多ARM(不知道怎么翻译,就是磁盘磁头那个臂)设计的算法优化。

  7. rust, nolibc(在5.19中跟踪过),BTRFS,Folios,perf/ftrace等特性加入了不少小改进。

  8. 这个版本增加了一下script/gdb的mm结构的支持,我原来不知道Kernel有这个脚本,看了一下介绍。这东西的文档在Documentations/dev-tools/gdb-kernel-debugging.rst中介绍,通过make scripts_gdb可以在编译的结果目录中产生vmlinux-gdb.py。这样,你在这个目录下运行gdb vmlinux的时候就能加载这个模块解释部分内核特有的数据结构了。

  9. io_uring提供一个新的flag支持:IORING_MSG_RING_FLAGS_PASS。没有看细节,表面说法是支持跨ring传递参数。

  10. Documentations/admin-guide中增加了一个workload-tracing.rst文档,初步讲了一下Linux性能压力分析的原理。这个文档推荐使用perf bench, stress-ng和paxtest给系统制造压力。比如:stress-ng --netdev 1 -t 60 --metrics,或者paxtest kiddie,不过后者只是一个内存泄漏检查工具,比较实用的还是stress-ng。

  11. 龙芯增加了一组基本设施的支持。但其实这个平台的发展很慢。之前有人告诉我说这个平台的开源和闭源部分是分开的,所以用闭源方案不能编译内核可以考虑装开源发行版,但实际上,相关的开源方案都只能用来玩,没有一个可以用作工作环境的,这个平台还只能说是个玩具。