Node.js 跟踪通过clearnet/Cloudflare/Apache的请求,以准确地发现性能问题

Node.js 跟踪通过clearnet/Cloudflare/Apache的请求,以准确地发现性能问题,node.js,apache,rest,proxy,performance-testing,Node.js,Apache,Rest,Proxy,Performance Testing,我正在托管一个RESTful API,我的问题是,与正常的~100ms相比,在一段时间后,每个第一个入站请求都需要大约三秒的时间。 我发现最有趣的是,它总是需要3100到3250毫秒,而不是更多也不是更少。所以我觉得这是故意的。 我已经调试了API,除了一件事之外,其他一切都可以立即运行,那就是在我的API开始接收请求之前的三秒钟延迟。 我最好的猜测是Apache或DNS解析出现了问题,但我不知道到底是什么原因导致了问题(这就是我为什么要问这个问题)。 我使用的Apache ProxyPass如

我正在托管一个RESTful API,我的问题是,与正常的~100ms相比,在一段时间后,每个第一个入站请求都需要大约三秒的时间。
我发现最有趣的是,它总是需要3100到3250毫秒,而不是更多也不是更少。所以我觉得这是故意的。

我已经调试了API,除了一件事之外,其他一切都可以立即运行,那就是在我的API开始接收请求之前的三秒钟延迟。
我最好的猜测是Apache或DNS解析出现了问题,但我不知道到底是什么原因导致了问题(这就是我为什么要问这个问题)。

我使用的Apache ProxyPass如下所示:

ProxyRequests off
Timeout 54
ProxyTimeout 5400
ProxyPass /jokeapi http://localhost:8079
ProxyPassReverse /jokeapi http://localhost:8079
我正在使用Cloudflare/APNIC DNS网关服务器
1.1.1.1
0.0.0

此外,我的所有请求在到达我的网络之前都会通过Cloudflare SSL代理路由。

我甚至部分重写了API,使其以ReadStreams响应,而不是将文件加载到RAM中并立即提供服务,但这并没有解决问题。

我的问题是如何完全调试请求所采用的路由,并准确地看到这3秒延迟的来源

谢谢!


PS:服务器在NodeJS上运行

我认为密钥与网络活动无关,但请注意,在一段空闲活动后,一段时间内对API的第一次响应需要略多于3秒的时间。我假设后续行动回到100毫秒窗口

当您使用localhost时,这不是路由问题。如果您愿意,您可以同样轻松地使用环回127.0.0.1来避免名称解析命中,但对保留主机名的这种命中只需几微秒

我怀疑您的RESTful函数的编译版本已经从系统的缓存中过时了。一段非使用时间后的第一次命中需要重新编译,只要编译后的指令运行一段时间,它们将保留在缓存中,并在100ms范围内继续响应。在系统冷启动(设置初始条件)后的多用户性能测试中,我们经常观察到这种情况。测试用户的爬坡在达到满负荷时间之前,接受公共代码重新编译的冲击


另一个需要回击的问题是,DNS超时和绑定缓存条目往往相当长,通常是一天中相当长的时间,甚至更长。即使如此,对已过期的绑定缓存项进行DNS查找也不会使您的初始连接时间增加三秒。

谢谢!我该如何着手解决这个问题?我可以告诉缓存永远不要清除它吗?您还没有提到restful调用的语言/体系结构,所以我将假设涉及Java(正如您提到的Apache,但不是IIS,这意味着.Net)。查看JVM启动时的代码缓存调优参数。可能发生的情况是,编译后的代码作为最近使用/访问最少的代码的一部分正在老化。扩展缓存的大小可能会导致您的代码不必被清除。我使用NodeJS,我不认为这是问题所在,因为我已经说过,我对它进行了彻底的调试,没有发现任何瓶颈。我会首先使用诸如seave、apache bench或wrk之类的工具,发送缓慢的恒定数量的请求,比如每秒4-5次,如果你的正常反应是100毫秒。获得频率感,如果它发生在一个一致的时间将有助于阐明。DNS错误可能是node.js的一个问题,因为DNS调用使用节点的线程池,默认情况下是4。