1 个不稳定版本
0.1.1 | 2022年2月24日 |
---|
#2247 在 命令行实用工具
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 使用率
与 earlyoom
和 nohang
类似,bustd
在内存轮询期间使用自适应睡眠时间。然而,与这两者不同,bustd
不从 /proc/meminfo
读取,而是选择使用 sysinfo
系统调用。
这种方法有其优缺点。`sysinfo` 读取的空闲 RAM 数量不考虑缓存内存,而 `/proc/meminfo` 中的 `MemAvailable` 则考虑。
`sysinfo` 系统调用快一个数量级,至少根据 这个内核补丁 (2015 年) 来说。
由于 bustd
不能仅仅依赖 `sysinfo` 的空闲 RAM 读取,我们通过 压力停滞信息 来检查内存压力。
bustd
将尝试锁定其地址空间中映射的所有页面
类似于 earlyoom
,bustd
使用 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