#linux-kernel #linux-process #process-id #creation #cpu #scheduling #system

execsnoop

使用execsnoop-bpfcc在Linux内核中监视进程ID的创建

1个不稳定版本

0.2.0 2023年4月25日

#754 in Unix API

MPL-2.0 许可证

5KB
76 代码行,不包括注释

System76 Scheduler

Scheduling服务优化Linux的CPU调度程序,并自动分配进程优先级以提高桌面响应性。在AC状态下,将自动激活低延迟CPU调度,电池设置默认调度延迟。进程将定期扫描,并根据配置文件分配进程优先级。当与pop-shell结合使用时,前台进程及其子进程将获得更高的进程优先级。

这些更改使得应用程序和游戏的体验平滑性和性能得到显著提升。应用程序响应速度的提高在老式硬件的系统上最为明显,而游戏将受益于更高的帧率和更低的抖动。这是因为背景应用程序和服务在活动进程在CPU上使用时间最长后,将获得更少的剩余CPU预算。

安装

需要依赖项,如debian/control文件中定义的

  • cargo & rustc
  • clang
  • just
  • libclang-dev
  • libpipewire-0.3-dev
  • pkg-config

然后可以使用包含的justfile来构建和安装

just execsnoop=$(which execsnoop-bpfcc) build-release
sudo just sysconfdir=/usr/share install

DBus

  • 接口: com.system76.Scheduler
  • 路径: /com/system76/Scheduler

可以使用SetForegroundProcess(u32)方法来更改活动前台进程。

调度器配置

配置文件存储在以下位置

  • 系统: /etc/system76-scheduler/config.kdl
  • 发行版: /usr/share/system76-scheduler/config.kdl

系统配置的存在将覆盖发行版配置。默认配置的文档可以在此处找到

注意:如果已定义了 backgroundforeground 分配配置文件,则将启用前台进程管理。同样,如果定义了 pipewire 配置文件,则将启用 pipewire 进程监控。

进程优先级分配

除了 config.kdl 之外,额外的进程调度配置文件存储在

  • 用户配置:/etc/system76-scheduler/process-scheduler/
  • 发行版:/usr/share/system76-scheduler/process-scheduler/

这里提供了一个示例配置。它将以与主配置中的分配和异常节点相同的方式解析,并且配置文件可以继承同名之前的分配的值。

配置文件

assignments {
    {{profile-name}} {{profile-properties}}
}

profile-name 可以参考您选择的任何名称。如果名称与之前的分配匹配,它将继承该分配的值,以及分配的任何其他配置文件属性。

profile-properties 可能包含以下任何一项:

  • 优先级,定义为 nice=-20nice=19

  • 以下之一的调度策略定义:

    • sched="batch"
    • sched="idle",
    • sched="other"
    • sched=(fifo)1sched=(fifo)99
    • sched=(rr)1sched=(rr)99

实时调度策略分配一个介于 1 和 99 之间的优先级。较高的值具有更高的优先级。建议不要设置高于硬件中断的优先级(>49)

  • 以下之一的 I/O 优先级定义:
    • io="idle"
    • io=(best-effort)0io=(best-effort)7
    • io=(realtime)0io=(realtime)7

尽力而为和实时类别具有 0 至 7 之间的优先级,其中 7 优先级最低,0 是最高优先级

分配

配置文件的每个子元素定义了要分配到配置文件的进程。

{{profile-name}} {{profile-properties}} {
    "/match/by/cmdline" {{profile-properties}}
    match-by-name {{profile-properties}}
    * {{condition-properties}} {{profile-properties}}
}
  • / 开头的节点名称是通过命令行路径进行匹配
  • 否则,节点名称是通过进程名称进行匹配
  • * 匹配所有进程,与额外的 condition-properties 一起使用
    • 属性是 wild-match'd
    • 属性可以以 ! 开头以排除匹配条件的结果
    • cgroup="cgroup-path" 通过 cgroup 匹配进程
    • parent="name" 通过父进程的进程名进行进程匹配

CPU调度延迟配置

默认

Linux内核对CFS的默认设置。在增加输入延迟的情况下,实现CPU密集型任务的高吞吐量。此设置对服务器和电池供电的笔记本电脑来说非常理想,因为低延迟的调度牺牲了一些能效以提高响应速度。

latency: 6ns
minimum_granularity: 0.75ms
wakeup_granularity: 1.0ms
bandwidth_size: 5us

响应式

略微减少CPU密集型任务的时间,为其他进程(尤其是等待和响应用户输入的进程)提供更多时间。这可以在一定程度上提高桌面响应速度,但会牺牲CPU密集型任务的吞吐量。

latency: 4ns
minimum_granularity: 0.4ms
wakeup_granularity: 0.5ms
bandwidth_size: 3us

许可证

根据Mozilla公共许可证2.0许可。此版权共享许可证的许可条件是提供受许可文件及其修改的源代码(在某些情况下,是GNU许可证之一)。必须保留版权和许可通知。贡献者提供专利权的明确许可。但是,使用受许可作品的大作品可以以不同的条款分发,且不包含大作品中添加的文件源代码。

贡献

您提交给作品中的任何有意贡献都应根据Mozilla公共许可证2.0(MPL-2.0)许可。必须在每个文件的顶部添加版权声明模板。

// Copyright {year} {person OR org} <{email}>
// SPDX-License-Identifier: MPL-2.0

lib.rs:

启动execsnoop-bpfcc应用程序以监视进程执行。

依赖项

~3–4.5MB
~66K SLoC