libuv工作线程或工作队列健康检查?

7
在libuv中,如果工作量过大或者有错误代码,会导致工作线程过载。是否有一种简单的函数可以检查工作线程或线程队列的健康状况?它不必是100%确定的,毕竟无法确定工作线程是否在慢速代码或无限循环中挂起。
因此,以下任何一种启发式方法都是好的:
- 尚未处理的排队项目数量。如果这个数字过大,可能意味着工作线程正在忙于处理或挂起。 - libuv是否有任何线程终止机制,在工作线程n秒钟内没有进行回报时就会被终止?

你是作为 Node.js 应用程序的一部分使用 Libuv 还是独立使用? - Laurent Perrin
2个回答

2

那个函数在libuv本身中不存在,我也不知道任何提供类似功能的OSS。

就终止机制而言,libuv中没有内置的终止机制,但http://nikhilm.github.io/uvbook/threads.html#core-thread-operations建议:

一个设计良好的程序应该有一种方法来终止已经开始执行的长时间运行的工作线程。这样的工作者可以定期检查只有主进程设置的变量以信号终止。


-1
如果这是针对nodejs的,那么一个简单的监视线程怎么样?我不知道如何获取有关事件队列内部的信息,但您可以将跟踪器注入到事件队列中以监视线程是否按时运行。(这通过衡量线程是否按时运行来测量负载,而不是尚未运行的线程数量。有点类似的东西。)
监视线程可以重新排队并检查它是否每10毫秒(或允许的最大累积阻塞ms)至少被调用一次。由于nodej循环运行线程,如果监视线程按时运行,则告诉我们所有其他线程在同一10毫秒窗口内都有机会运行。类似以下内容(在node中):
// like Date.now(), but with higher precision
// the extra precision is needed to be able to track small delays
function dateNow() {
    var t = process.hrtime();
    return (t[0] + t[1] * 1e-9) * 1000;
}

var _lastTimestamp = dateNow();   // when healthMonitor ran last, in ms
var _maxAllowedDelay = 10.0;      // max ms delay we allow for our task to run
function healthMonitor() {
    var now = dateNow();
    var delay = now - _lastTimestamp;
    if (delaly > _maxAllowedDelay) {
        console.log("healthMonitor was late:", delay, " > ", _maxAllowedDelay);
    }
    _lastTimestamp = now;
    setTimeout(healthMonitor, 1);
}

// launch the health monitor and run it forever
// note: the node process will never exit, it will have to be killed
healthMonitor();

调节警报消息并支持干净的关闭是留给读者的练习。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接