上海先道智觉科技有限责任公司 · 作者 芦浩然 项目地址:GitHub – LuHaoran1981/taskhealth: Linux user-space thread health monitor (client-daemon) · GitHub
一、背景:为什么进程级监控不够用
在 Linux 上做服务守护,大家的第一反应是 systemd。它确实能把进程拉起来、看住、挂了再拉起。但 systemd 的粒度止步于进程——它对进程内部单个线程的生死、卡死、等锁,其实一无所知。
而现实里,大量故障恰恰发生在线程级:
- 某个工作线程悄悄 pthread_exit 了,进程还活着,业务却已经半瘫;
- 两个线程各自持有对方要的锁,futex 上死锁,整个服务慢慢耗尽连接;
- 一个线程等一把锁等了十几秒,请求超时雪崩。
这些是 systemd 看不到、也管不了的盲区。QNX 上有 HAM(High Availability Manager) 专门干这事,但 Linux 生态里,这个「线程级健康监控」的坑一直没人填。
TaskHealth 就是来填这个坑的。
二、TaskHealth 是什么
TaskHealth 是一个 Linux 用户态的线程级健康监控框架,灵感来自 QNX HAM。它把「监控故障并响应」这一思路搬到 Linux,但粒度细化到线程,并且支持跨进程监控。
它能检测三类故障:
| 线程异常退出 | 注册过的线程在没注销的情况下消失 |
| futex 死锁 | 线程阻塞在 futex 上,且能解析出锁的模块与名字 |
| 等锁超时 | 线程等待一把锁超过设定的阈值 |
| OS | QNX Neutrino | Linux |
| 粒度 | 进程/服务 | 线程 |
| 范围 | 节点/集群 | 单机、跨进程 |
| 检测 | 进程崩溃/挂起 | 线程退出、死锁、等锁超时 |
| 响应 | 重启/故障转移 | 告警(syslog / 日志 / 脚本) |
三、架构:客户端-守护进程
TaskHealth 是经典的 C/S 架构,通过 Unix 域套接字(SOCK_SEQPACKET) 通信:
┌─────────────────────────────┐ ┌──────────────────────────────┐
│ 业务进程 A │ │ taskhealthd │
│ ┌─────────┐ ┌─────────┐ │ IPC │ ┌─────────────────────────┐ │
│ │ 线程1 │ │ 线程2 │ │ ──────▶ │ │ registry(注册表) │ │
│ │ register│ │ register│ │ │ ├─────────────────────────┤ │
│ └─────────┘ └─────────┘ │ │ │ watchdog(心跳/检测引擎) │ │
│ libtaskhealth(客户端库) │ │ ├─────────────────────────┤ │
└─────────────────────────────┘ │ │ probe(/proc 探针) │ │
▲ 业务进程 B / C … │ ├─────────────────────────┤ │
└─────────────────────────────▶│ │ alert(分级告警) │ │
│ └─────────────────────────┘ │
└──────────────────────────────┘
- 客户端库 libtaskhealth(MIT):链接进业务进程,负责发送注册 / 心跳 / 注销消息。
- 守护进程 taskhealthd(GPL):统一执行心跳检测、/proc 探针和告警。
守护进程不主动重启业务,只负责「检测 + 告警」,把处置权留给运维或上层编排(systemd / supervisord),避免误杀业务进程。
四、核心能力与亮点
告警长这样:
2026-11-01 10:00:00 [CRIT] [DEADLOCK] thread 'worker' pid=1234 tid=1236 blocked on futex wchan=futex_wait_queue_me futex=0x7f1234abcd module=db lock=conn-pool
五、快速上手
git clone https://github.com/LuHaoran1981/taskhealth
cd taskhealth
make # libtaskhealth.a/.so + taskhealthd
make demo # 业务示例程序
./taskhealthd # 终端1:启动守护进程
./demo/demo # 终端2:跑 demo(含退出/死锁/等锁超时场景)
业务代码里接入客户端库,三行起步:
#include <taskhealth.h>
taskhealth_init(NULL); // 连接守护进程
taskhealth_register("worker", 5000, 100); // 注册线程:心跳 5s、等锁阈值 100ms
/* … 业务逻辑 … */
taskhealth_heartbeat(); // 关键节点发一次心跳
taskhealth_unregister(); // 线程退出前注销
taskhealth_shutdown();
如果有锁,用 mutex 封装自动上报等锁/死锁:
#include <taskhealth_mutex.h>
struct taskhealth_mutex m;
taskhealth_mutex_init(&m, "db-connection-pool");
taskhealth_mutex_lock(&m); // 自动上报 LOCK_WAIT / LOCK_ACQUIRED
/* … 临界区 … */
taskhealth_mutex_unlock(&m);
六、典型应用场景
- 后端服务 / 中间件:数据库连接池、线程池、任务队列的线程健康度监控。
- 嵌入式 / 工业软件:对「线程卡死」敏感、要求快速定位故障点的场景(QNX HAM 的 Linux 替代)。
- 高可用改造:作为告警层接入现有告警体系,配合 systemd 做重启编排。
七、开源与多发行版
- 许可证:客户端库 MIT(方便大家接入),守护进程 GPL-2.0-or-later(保护核心)。
- 打包进展:Debian(申请中)、Fedora(spec 就绪)、Arch AUR(PKGBUILD 就绪)、Yocto(recipe 就绪),Open Build Service 规划中。
欢迎 star、试用、提 issue。如果你也在做 Linux 高可用或线程级监控,非常期待交流。
GitHub:GitHub – LuHaoran1981/taskhealth: Linux user-space thread health monitor (client-daemon) · GitHub
网硕互联帮助中心






评论前必须登录!
注册