Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js socket.io服务器长延迟_Javascript_Node.js_Websocket_Socket.io - Fatal编程技术网

Javascript node.js socket.io服务器长延迟

Javascript node.js socket.io服务器长延迟,javascript,node.js,websocket,socket.io,Javascript,Node.js,Websocket,Socket.io,我在node.js API上有一个socket.io服务器 当node.js服务器无所事事时,pong事件的延迟通常为5-10毫秒。但是,当node.js服务器处理一些非常复杂的http请求时,延迟会跳到100以上,甚至超过5000,从而导致ping超时 我很好奇是什么影响了延迟 而且,我们的框架需要一个稳定的套接字连接,以便将长http请求的信息发送到发出请求的同一套接字。我们如何在没有很长的pingTimeout和pingInterval的情况下使连接稳定?这实际上取决于“处理一些非常复杂的

我在node.js API上有一个socket.io服务器

当node.js服务器无所事事时,
pong
事件的延迟通常为5-10毫秒。但是,当node.js服务器处理一些非常复杂的http请求时,延迟会跳到100以上,甚至超过5000,从而导致ping超时

我很好奇是什么影响了延迟

而且,我们的框架需要一个稳定的套接字连接,以便将长http请求的信息发送到发出请求的同一套接字。我们如何在没有很长的
pingTimeout
pingInterval

的情况下使连接稳定?这实际上取决于“处理一些非常复杂的http请求”在做什么。js将Javascript作为单个线程运行。这意味着它一次只能做一件事。但是,由于服务器所做的许多事情都与I/O相关(从数据库读取、从文件获取数据、从另一台服务器获取数据等等),并且node.js使用事件驱动的异步I/O,因此它常常会同时处理很多请求

但是,如果您的复杂http请求是CPU密集型的,使用了大量CPU,那么它占用了单个Javascript线程,在占用CPU的同时,其他任何事情都无法完成。这意味着所有传入的HTTP或socket.io请求都必须在队列中等待,直到one node.js Javascript线程空闲,以便它可以从事件队列中抓取下一个事件并开始处理该传入请求

如果我们能看到这个“非常复杂的http请求”的代码,我们才能真正帮助您

在node.js中,解决CPU占用问题的通常方法是将CPU密集型的内容卸载到其他进程。如果问题主要是由这一段代码引起的,则可以启动几个子进程(可能与服务器中的CPU数量相同),然后为它们提供CPU密集型工作,并让main node.js进程自由处理传入(非CPU密集型)请求,延迟非常低

如果您有多个可能占用CPU的操作,那么您要么必须将它们全部分配给子进程(可能通过某种工作队列),要么可以部署集群。集群面临的挑战是,给定的socket.io连接将连接到集群中的一个特定服务器,如果恰好是该进程执行占用CPU的操作,那么分配给该服务器的所有socket.io连接都会有很差的延迟。因此,对于这类问题,常规集群可能不是很好。工作队列和多个专门的子进程来处理CPU密集型工作可能更好,因为这些进程不会有它们负责的任何外部socket.io连接。

这实际上取决于“处理一些非常复杂的http请求”在做什么。js将Javascript作为单个线程运行。这意味着它一次只能做一件事。但是,由于服务器所做的许多事情都与I/O相关(从数据库读取、从文件获取数据、从另一台服务器获取数据等等),并且node.js使用事件驱动的异步I/O,因此它常常会同时处理很多请求

但是,如果您的复杂http请求是CPU密集型的,使用了大量CPU,那么它占用了单个Javascript线程,在占用CPU的同时,其他任何事情都无法完成。这意味着所有传入的HTTP或socket.io请求都必须在队列中等待,直到one node.js Javascript线程空闲,以便它可以从事件队列中抓取下一个事件并开始处理该传入请求

如果我们能看到这个“非常复杂的http请求”的代码,我们才能真正帮助您

在node.js中,解决CPU占用问题的通常方法是将CPU密集型的内容卸载到其他进程。如果问题主要是由这一段代码引起的,则可以启动几个子进程(可能与服务器中的CPU数量相同),然后为它们提供CPU密集型工作,并让main node.js进程自由处理传入(非CPU密集型)请求,延迟非常低


如果您有多个可能占用CPU的操作,那么您要么必须将它们全部分配给子进程(可能通过某种工作队列),要么可以部署集群。集群面临的挑战是,给定的socket.io连接将连接到集群中的一个特定服务器,如果恰好是该进程执行占用CPU的操作,那么分配给该服务器的所有socket.io连接都会有很差的延迟。因此,对于这类问题,常规集群可能不是很好。工作队列和多个专门的子进程来处理CPU密集型工作可能会更好,因为这些进程不会有它们负责的任何外部socket.io连接。

这完全有道理。我的服务一次发送很多数据库请求或http请求。一旦所有承诺都得到解决,整个过程将进入下一步。我将同步进行并行处理并观察延迟。希望我们能确定是哪一部分服务导致了问题。流媒体是否可以是密集型的?我的另一项服务处理千兆字节的数据,并将数百万条记录输出到csv文件。@zhangjingzhou-可能是。这取决于对数据进行了多少处理。处理千兆字节的数据并将数百万条记录输出到一个csv文件听起来好像只需要一堆CPU就可以处理所有的数据转换。您只需在运行时观察CPU利用率即可查看。它还进行了大量的I/O操作,这会占用一些CPU,但是node.js通常在I/O方面非常高效。关键是您只使用asy