#内存 #linux-process #daemon #场景 #杀手 #pid #

app bustd

轻量级进程杀手守护程序,用于处理内存不足场景

1 个不稳定版本

0.1.1 2022年2月24日

#2247命令行实用工具

MIT 许可证

42KB
883

bustd:可用内存或崩溃!

bustd 是 Linux 下用于内存不足场景的轻量级进程杀手守护程序!

功能

小内存使用!

bustd 似乎比一些其他轻量级守护程序(如 earlyoom)使用更少的内存。

$ ps -F -C bustd
UID          PID    PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
vrmiguel  353609  187407  5   151     8   2 01:20 pts/2    00:00:00 target/x86_64-unknown-linux-musl/release/bustd -V -n

$ ps -F -C earlyoom
UID          PID    PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
vrmiguel  350497    9498  0   597   688   6 01:12 pts/1    00:00:00 ./earlyoom/

¹: RSS 代表常驻集大小,表示进程占用的 RAM 部分。

²: 与 bustd 在 此提交 和 earlyoom 在 此提交 时的比较。bustd 使用 musl libc 编译,而 earlyoom 使用 glibc 通过 GCC 11.1 编译。不同的配置可能会改变这些数字。

小 CPU 使用率

earlyoomnohang 类似,bustd 在内存轮询期间使用自适应睡眠时间。然而,与这两者不同,bustd 不从 /proc/meminfo 读取,而是选择使用 sysinfo 系统调用。

这种方法有其优缺点。`sysinfo` 读取的空闲 RAM 数量不考虑缓存内存,而 `/proc/meminfo` 中的 `MemAvailable` 则考虑。

`sysinfo` 系统调用快一个数量级,至少根据 这个内核补丁 (2015 年) 来说。

由于 bustd 不能仅仅依赖 `sysinfo` 的空闲 RAM 读取,我们通过 压力停滞信息 来检查内存压力。

bustd 将尝试锁定其地址空间中映射的所有页面

类似于 earlyoombustd 使用 mlockall 来避免被发送到交换空间,这使得守护进程即使在系统内存负载高且易受 抖动 的情况下也能保持响应。

检查压力停滞信息

从 4.20 版本开始,Linux 内核(如果构建时带有 CONFIG_PSI=y),提供了内存、CPU 和 I/O 的标准压力度量。用 Facebook Incubator 的话说:

PSI stats are like barometers that provide fair warning of impending resource 
shortages, enabling you to take more proactive, granular, and nuanced steps 
when resources start becoming scarce.

更具体地说,bustd 检查在过去 10 秒内进程停滞了多长时间,以微秒为单位。默认情况下,如果过去 10 秒内有进程停滞了 25 微秒,bustd 将会杀死该进程。

构建

要求

  • Rust 工具链
  • 任何 C 编译器
  • Linux 4.20+,构建时带有 CONFIG_PSI=y
git clone https://github.com/vrmiguel/bustd
cd bustd && cargo run --release

-n, --no-daemon 标志对于通过 init 系统如 systemd 运行 bustd 很有用。

预构建的二进制文件

通过 GitHub Actions 在每次提交时生成二进制文件。

待办事项

  • 允许自定义关键场景(PSI 截止值)
  • 命令行参数用于禁用守护进程化(对于作为 systemd 服务运行 bustd 很有用)
  • 命令行参数用于启用杀死整个进程组,而不仅仅是所选进程本身
  • 允许用户设置 bustd 绝对不能杀死的软件列表
  • 发送通知和一般通知自定义设置

依赖关系

~0.5–1.3MB
~28K SLoC