发布时间

2024-03-10

4.28. 6.8

4.28.1. 大特性

4.28.1.1. Deadline Server

这个是解决实时任务独占的问题的。按RT类任务的系统承诺,这些东西只要在,就可以占光所有的CPU时间,这很容易把一些关键任务饿死。之前Linux的手段是设置一个门限,只让RT任务占95%的时间。但这样如果没有其他任务,剩下那5%的时间可能就是在Idle,有人又建议如果是Idle,就不要切换过去好了。但这也不好,因为有些几乎Idle,不那么重要的任务进去也不对。这个Deadline Server的方案似乎是创建一个特定优先级,Deadline Class的任务,用它来卡那5%的时间。

我最近在考虑未来穿插大量的AI运算的算力应该怎么调度,我把这些考量也放在这个上下文一起想一想。现在这些算法很多都用异构核(GPU,TPU,NPU等)来解决,最大的问题是有建立时间,一旦有建立时间,短时间的计算跨核调度又不值得,所以更好是作为协处理器放在本CPU内部。但放在本CPU内部利用率又不足。所以硬件无论如何都是做成CPU内部有轻量级的协处理器,重量级的拉到异构核上去算。这就给OS调度器造成压力了:首先是CPU必然是大小核的,因为不值得给每个CPU都配这些协处理器,然则调度器必须根据任务的计算特征选定不同的核进行调度,而且一旦遇到核不合适,就要触发异常,然后切换回具有这种计算特征的核上。这样的结果是什么呢?我认为是最终我们的CPU上会支持更多的线程,然后把这些协处理共享给多个线程共享使用,这样调度的工作就不是OS的了,而是硬件的。等线程足够多了,我觉得一定量的实时线程,就由它去吧,反正数量不要太多,占不光所有的CPU就行。这样一想,我觉得Linux解决的问题太多也不见得好。嵌入式或者安全性要求高的系统,就不要来参合Linux了。

4.28.1.2. Multi-Size透明大页

这个文档:Large folios for anonymous memory,定性folios的优势在于

让页的基础大小变得不那么重要。

对我来说,这个信息是最重要的。其他的算法问题,都是细节问题(很重要,但对不是写这个代码的人来说不重要),得个“知”字吧。

补丁的作者是ARM的Ryan Roberts。

4.28.1.3. Mount增加了两个系统调用

这个也是得个知字,我们就把接口列出来看一下就好了:

struct __mount_arg {
    __u64 mnt_id;
    __u64 request_mask;
};

int listmount(const struct __mount_arg *req, u64 *buf, size_t bufsize,
                unsigned int flags);

struct statmnt {
    __u32 size;               /* Total size, including strings */
    __u32 __spare1;
    __u64 mask;               /* What results were written */
    __u32 sb_dev_major;       /* Device ID */
    __u32 sb_dev_minor;
    __u64 sb_magic;           /* ..._SUPER_MAGIC */
    __u32 sb_flags;           /* MS_{RDONLY,SYNCHRONOUS,DIRSYNC,LAZYTIME} */
    __u32 fs_type;            /* [str] Filesystem type */
    __u64 mnt_id;             /* Unique ID of mount */
    __u64 mnt_parent_id;      /* Unique ID of parent (for root == mnt_id) */
    __u32 mnt_id_old; /* Reused IDs used in proc/.../mountinfo */
    __u32 mnt_parent_id_old;
    __u64 mnt_attr;           /* MOUNT_ATTR_... */
    __u64 mnt_propagation;    /* MS_{SHARED,SLAVE,PRIVATE,UNBINDABLE} */
    __u64 mnt_peer_group;     /* ID of shared peer group */
    __u64 mnt_master; /* Mount receives propagation from this ID */
    __u64 propagate_from;     /* Propagation from in current namespace */
    __u32 mnt_root;           /* [str] Root of mount relative to root of fs */
    __u32 mnt_point;  /* [str] Mountpoint relative to current root */
    __u64 __spare2[50];
    char str[];               /* Variable size part containing strings */
};
int statmount(const struct __mount_arg *req, struct statmnt *buf,
                size_t bufsize, unsigned int flags);

两个调用是配合的,前者先查有哪些mount的,每个用一个id标识,然后再用id查每个mount的详细信息。

就是把原来从sysfs或者procfs的信息换到系统调用上,我觉得这个东西很适合我们的系统调用块方案,我希望多搞。

4.28.1.4. perf的Data-type profiling功能

很有趣的perf调试功能。用起来是这样的:

先用:

perf mem record     ; 部分可以分开读写的平台可以加-t store参数

跟踪。然后这样看结果::

perf annotate --data-type=callchain_list

这样你会看到每个变量被访问的热点,像这样:

../_images/Data-type-profiling.png

它的原理是在捕获到读写操作的时候,根据DWARF信息去获知具体是什么变量然后做的记录。

4.28.2. 其他有趣的东西

  1. 这个版本增加了一个配置能力:禁止裸写入已经mount的分区。但这是一个总结性的说法,修改是改在不同的文件系统的不同配置上的,只能说是在走这个方向。

  2. LSM(安全子系统)增加了三个系统调用:lsm_list_modules(), lsm_get_self_attr(), lsm_set_self_attr()。我不搞这个子系统,不细看了。

  3. 增加了一个Intel \(X^e\)驱动,这是个独显,中文好像叫锐炫,有针对台式机和笔记本的不同版本。显存(DDR6)从4GB到16GB不等,主频900M到1.6G不等。但这里:Intel Core Ultra7显示我的Thinkpad Gen12上也集成了这个东西(有8个\(X^e\)核)。所以这个应该是个架构的品牌。而且,它的主频是2.25G,和集成的NPU的1.4GHz是不同的。这些厂家就是不把你的思路搞乱不罢休。

    修改只涉及一个补丁,但涉及的文件很多,应该是内部开发后的第一个版本。

  4. 字节跳动提了一组用maple tree提升fork性能的补丁。

  5. /proc/sysrq-trigger现在可以一次输入多个请求,但前面要加一个下划线,比如::

    echo _tsu > /proc/sysrq-trigger
    

    这相当于顺序写入t, s和u,没有下划线的话,就相当于只写了第一个。

  6. 龙芯在合入和rust/kvm有关的一些补丁。

  7. 海思鲲鹏修改了hccs和zip的驱动,都是小维护而已。