gpt4 book ai didi

node.js - JSONStream 期间的无限循环

转载 作者:搜寻专家 更新时间:2023-10-31 23:20:52 26 4
gpt4 key购买 nike

我有一个在生产中卡住的 node.js 服务器,它似乎是由 JSONStream 内部的无限循环引起的。这是从卡住服务器的核心转储中捕获的​​堆栈跟踪:

1: toString [buffer.js:~392] (this=0x1e28fb6d25c9 <a Buffer>#1#,encoding=0x266ee104121 <undefined>,start=0x266ee104121 <undefined>,end=0x266ee104121 <undefined>)
2: arguments adaptor frame: 0->3
3: write [/home/deploy/node_modules/JSONStream/node_modules/jsonparse/jsonparse.js:136] (this=0x32cc8dd5a999 <a Parser>#2#,buffer=0x32cc8dd5aa49 <a Buffer>#3#)
4: /* anonymous */ [/home/deploy/node_modules/JSONStream/index.js:~17] (this=0x32cc8dd5ab11 <a Stream>#4#,chunk=0x32cc8dd5aa49 <a Buffer>#3#)
5: write [/home/deploy/node_modules/JSONStream/node_modules/through/index.js:~24] (this=0x32cc8dd5ab11 <a Stream>#4#,data=0x32cc8dd5aa49 <a Buffer>#3#)
6: write [_stream_readable.js:~582] (this=0x266ee106c91 <JS Global Object>#5#,dest=0x32cc8dd5ab11 <a Stream>#4#,i=0,list=0x266ee104101 <null>)
7: flow [_stream_readable.js:592] (this=0x266ee106c91 <JS Global Object>#5#,src=0x32cc8dd5ac69 <an IncomingMessage>#6#)
8: /* anonymous */ [_stream_readable.js:560] (this=0x266ee106c91 <JS Global Object>#5#)
9: _tickCallback [node.js:415] (this=0x29e7331bb2a1 <a process>#7#)

如何找到这个无限循环的源头?

不幸的是,服务器正在生产环境中运行并且正在处理成千上万的请求,因此很难提供任何额外的上下文。服务器的基本功能是为其他服务发出出站 HTTP 请求。

值得注意的是,我不认为这是由内存泄漏引起的。在这些卡住事件期间,服务器的内存使用率保持不变(并且很低),而 CPU 峰值达到 99%

无限循环结束的另一个证据是事件循环本身似乎已经停止。当我将 console.log 放在 setInterval 中时,服务器将在卡住后立即停止输出。

我们通过将最大连接数设置为 Infinity(禁用它们在 node.js 中的重用)验证了问题不是由过期/损坏的套接字连接引起的

我们使用的是 JSONStream 0.7.1(其中包括默认的 jsonparse 版本 0.0.5)。我们找到了this issue在 JSONStream 存储库上,并尝试 fork JSONParse 并仅更新到最新的 jsonparse 版本。它没有解决问题。

最佳答案

您的问题似乎是由 this line 引起的的 jsonstream@0.0.5 .如果不转储正在通过服务器的内容,我无法最终为您解决问题,但这似乎表明您的缓冲区非常大。

这也可以解释为什么您的服务器正在锁定(正如您在聊天中提到的),为什么事件循环不继续以及为什么您的内存没有上升但您的 CPU 会;这里可能发生的是你试图toString()难以置信的大量字节,您的硬件根本无法完成,它就死了。

请务必报告此线索的任何进一步调查。我觉得您将在开发箱上重现该问题是不可避免的。它可以像向您的缓冲区添加一些健全性检查并确保它不会超过特定大小一样简单。

以上代码段只有在n <= 128时才会被命中。 ,所以如果您使用带符号的字符(例如 Unicode)或带符号的字节,那么您实际上可能会在正常功能中遇到此问题……可能需要考虑!

关于node.js - JSONStream 期间的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32878450/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com