.. Kenneth Lee 版权所有 2023
:Authors: Kenneth Lee :Version: 0.1 :Date: 2023-08-02 :Status: Draft
.. list-table::
6.3
这个特性涉及rseq系统调用,我还没有听说过这个系统调用,所以先调查一下这是什么功 能。
rseq在我的Ubuntu上连手册都查不到,改查Libc手册可以找到这个:
https://www.gnu.org/software/libc/manual/html_node/Restartable-Sequences.html
按这里的说明,它属于librseq,但又说它是libc的一部分。信息还比较错乱, Ubuntu22.04上反正装不了用户态支持,不过它就是个简单的系统调用,所以也不用担心 用不了。
整体思路可以参考这个文档:
https://www.efficios.com/blog/2019/02/08/linux-restartable-sequences/
思路就是仿照ARM的ldex/stex指令,只是换成了函数,rseq指定了三个回调:
rseq作用在每个线程上,如果你读了数据然后处理,中间没有其他线程来访问过这个数据, 就直接提交,否则就abort。这样能保证锁住的时间不会很长。rseq的系统调用是这样的:
.. code-block:: c
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的结构如下:
.. figure:: _static/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似乎是一个外包公司,提供多核优化服务的。
这个版本把netlink的上层协议用yaml进行标准化定义。netlink是一个用于支持内核和用 户态通讯的socket接口,Domain是AF_NETLINK,主要用SOCK_DGRAM形式通讯(包方式,而 不是流方式),Family用于区分内核的模块,比如NETLINK_FIREWALL,NETLINK_CRYPTO等。
所以它是个很自由的二进制接口,你喜欢让那个包是什么私有格式都可以。(但它本身使 用一个统一的头。)定义成yaml只是用一种标准化的方法说明每个包的二进制域的组成是 什么样的而已。
.. code-block:: c
struct nlmsghdr { u32 nlmsg_len; / Length of message including header / u16 nlmsg_type; / Type of message content / u16 nlmsg_flags; / Additional flags / u32 nlmsg_seq; / Sequence number / __u32 nlmsg_pid; / Sender port ID / };
定义的描述在Documentments/usersapce-api/netlink/目录下,配套定义有一组工具在 tools/net/yml/目录下,可以根据所述yaml文件生成代码。老实说,我个人最讨厌这样的 方案了,这样生成的代码,后面再维护就回不去了,这让我很不爽。所以,就看到这里吧。
BTRFS和eBPF性能优化在KernelNewbies中都被认为是大特性,不过对我都没有什么好 跟踪的,就在这里加一个记录吧。
memfd支持MD_NOEXEC_SEAL属性,不让memfd的内存执行。
IPv4支持Big TCP(64KB以上的TSO帧)
支持AMD两个新QoS特性:
这个版本NFS的PRCSEC GSS Kerberos 5安全机制默认不用DES和SHA1加密,改为 AES-SHA2算法。
BFQ IO调度器增加针对磁盘多ARM(不知道怎么翻译,就是磁盘磁头那个臂)设计的算 法优化。
rust, nolibc(在\ :doc:5.19
\ 中跟踪过),BTRFS,Folios,perf/ftrace等特性
加入了不少小改进。
这个版本增加了一下script/gdb的mm结构的支持,我原来不知道Kernel有这个脚本, 看了一下介绍。这东西的文档在 Documentations/dev-tools/gdb-kernel-debugging.rst中介绍,通过make scripts_gdb可以在编译的结果目录中产生vmlinux-gdb.py。这样,你在这个目录下运 行gdb vmlinux的时候就能加载这个模块解释部分内核特有的数据结构了。
io_uring提供一个新的flag支持:IORING_MSG_RING_FLAGS_PASS。没有看细节,表面 说法是支持跨ring传递参数。
Documentations/admin-guide中增加了一个workload-tracing.rst文档,初步讲了一 下Linux性能压力分析的原理。这个文档推荐使用perf bench, stress-ng和paxtest 给系统制造压力。比如:stress-ng --netdev 1 -t 60 --metrics,或者paxtest kiddie,不过后者只是一个内存泄漏检查工具,比较实用的还是stress-ng。
龙芯增加了一组基本设施的支持。但其实这个平台的发展很慢。之前有人告诉我说这 个平台的开源和闭源部分是分开的,所以用闭源方案不能编译内核可以考虑装开源发 行版,但实际上,相关的开源方案都只能用来玩,没有一个可以用作工作环境的,这 个平台还只能说是个玩具。