Node.js 如何调整NodeJS垃圾收集器以安排更少的清道夫循环?

Node.js 如何调整NodeJS垃圾收集器以安排更少的清道夫循环?,node.js,garbage-collection,real-time,latency,Node.js,Garbage Collection,Real Time,Latency,我在NodeJS中有一个实时应用程序,它监听多个websocket,并通过放置HTTPS请求对其事件作出反应;它连续运行。我注意到,在执行过程中的许多时候,响应时间远远高于预期的网络延迟,这导致我调查了这个问题。事实证明,垃圾收集器连续运行多次,给运行时间增加了显著的延迟(5秒,最多30秒) 这个问题似乎与由于分配失败而频繁安排清道夫回合以释放资源有关。虽然每一轮的执行时间不到100毫秒,但一行执行数千次的时间加起来确实是很多秒。我唯一的猜测是,在我的应用程序中的某个时刻,分配的堆接近其极限,并

我在NodeJS中有一个实时应用程序,它监听多个websocket,并通过放置HTTPS请求对其事件作出反应;它连续运行。我注意到,在执行过程中的许多时候,响应时间远远高于预期的网络延迟,这导致我调查了这个问题。事实证明,垃圾收集器连续运行多次,给运行时间增加了显著的延迟(5秒,最多30秒)

这个问题似乎与由于分配失败而频繁安排清道夫回合以释放资源有关。虽然每一轮的执行时间不到100毫秒,但一行执行数千次的时间加起来确实是很多秒。我唯一的猜测是,在我的应用程序中的某个时刻,分配的堆接近其极限,并且在每次GC循环中实际上释放的内存很少,这会在一个长循环中不断触发GC。应用程序似乎没有泄漏内存,因为内存分配从未真正失败。它似乎正处于触发GC疯狂的边缘


有知识/经验的人能否就如何使用V8提供的GC选项来克服这种情况给出一些提示?我已经尝试过
--max\u old\u space\u size
--nouse idle notification
(正如解决此问题的几篇文章所建议的那样),但我并不完全理解节点GC实现的内部结构和可用选项的效果。我希望能够更好地控制清道夫回合的运行时间,或者至少增加连续回合之间的间隔,以便提高效率。

您可能还希望在不同的级别上优化内容,以便获得更多可用内存,或者使用更少的小对象,然后进行GCD。注意:如果你知道什么时候是进行GC的好时机,那么你可以手动调用GC,这可能会有所帮助,但不一定会阻止它在其他时间进行GC。谢谢你的建议@jfriend00。我试图手动调用GC,但它似乎只调用Mark Sweep收集器,而不是清道夫。拾荒者无论如何都会踢进来。我相信下面的一些选项可能会在新的空间提供更好的控制,您是否有使用这些选项的经验
--半空间增长系数
--实验性新空间增长启发性
--快速推广新空间
只需加上我的50美分。我不知道如何设置GC选项,但是如果您用C++/Rust等编写性能关键的代码,并编译到没有GC运行时的WASM,您可能会避免这个问题,如果您有可能的话。