使用Node.js作为JavaScript运行时有其优势。然而,它需要大量的维护,以保持它按预期工作。以下是你应该监测Node.js性能测量分析的首要指标。
使用Node.js运行环境的应用编程接口或API是可扩展的。 Node.js是异步和事件驱动的,这意味着应用程序可以在同一时间处理多个连接。这些特点也意味着Node.js免除了基于线程的网络协议。 节省CPU使用率并使应用程序的整体效率更高。
然而,让Node.js应用程序运行得恰到好处是很棘手的。其中一部分原因是 Chrome V8引擎当遇到CPU密集型进程时,它所建立的系统往往会变慢。另一部分原因是JavaScript使用 动态键入,这意味着Node.js为应用程序的每次使用分配了变量类型。这种模式限制了CPU线程的利用率。如果没有常规的 应用性能管理,动态类型可能会导致不可接受的缓慢的Node.js性能和内存泄漏。
Node.js性能测量指标
工具,如 Node.js的Retrace等工具可以自动监测你的应用程序的关键指标。Retrace在一个工具中提供完整的Node.js监控。然而,如果你想要幕后知识,请继续阅读。
这篇文章是关于你应该定期监测的五大Node.js性能指标,即。
- 面向用户的延迟
- 后台服务延迟
- 事件循环阻塞
- 内存使用和泄漏
- 应用程序拓扑结构
面向用户的延迟
任何API的功能都是将信息从一个界面(如移动应用程序)传递到另一个界面。因此,从用户角度来看,确保API的性能符合预期是至关重要的。你要避免在用户互动过程中出现不必要的延迟或延误。测量面向用户的延迟的目的是为了确保API的行为正常。
在你测量应用程序的性能之前,你必须建立一个基线。任何在基线两个标准差内的都是正常的。如果任何Node.js的性能测量超出了这个范围,那么你的API的行为就不正常了。
在建立基线后,你可以通过识别入口点或开始用户事务的互动来开始评估事务性能。对于Node.js API,入口点通常是一个HTTP请求,尽管它可能是一个WebSocket连接或一个服务调用,这取决于基础设施。
在确定入口点后,你现在可以测量整个应用生态系统的性能,以评估它是否在正常参数(基线+2个标准偏差)范围内执行。例如,你发现响应时间超过了该用户交易的平均响应时间的两个标准偏差。过大的偏差表明应用程序方面的异常行为。
面向用户的指标可能会根据测量发生在一天中的时间和一天的时间而发生变化。在这个测量过程中收集到的数据将影响该时间段和一周内的后续基线。这一进展说明了面向用户的应用程序的演变,比你能使用的任何其他指标更能反映用户体验。
在测量面向用户的延迟时,你需要监测用户界面的所有方面,包括。
- 响应时间
- 请求率
- 错误率
- 内容大小
后台服务延迟
所有的应用程序都与某种形式的外部或后端服务互动,这些互动会对你的应用程序的整体性能产生深远影响。外部依赖关系可能是遗留系统、缓存层、数据库、队列服务器或网络服务。
虽然开发人员可能无法控制这些后端服务的代码,但开发人员可以管理这些服务的配置。因此,评估这些后端服务的性能以确定是否需要重新配置是至关重要的。此外,你需要确定应用程序的速度减慢是由于应用程序或外部依赖的问题造成的。
一般来说,APM工具能够自动区分应用程序和外部服务。在某些情况下,你可能需要对监控程序进行调整,以确定外部依赖行为。与面向用户的延迟一样,你需要一个基线来衡量这些外部依赖的性能。
对于Node.js应用程序,尽管是异步接口,但后端服务的延迟会改变性能并影响用户体验。退出调用类型可能是。
- 外部网络服务API
- 内部网络服务
- NoSQL服务器
- SQL数据库
当你测量你的应用程序与外部依赖关系进行通信时的响应时间,你将能够确定问题所在并提高性能。
事件循环阻塞
事件循环是JavaScript的一种构造,它执行同步代码的一个块或勾。该结构执行代码,收集和处理事件,执行队列中的子任务。一般来说,事件循环会完全处理每个消息,然后再转到另一个消息。
来源:developer.mozilla.org/en-US/docs/…
Node.js是非阻塞和单线程的,因此你可以通过回调执行I/O操作。应用程序将在事件队列中拾取下一个tick,以便在后台执行额外的代码。虽然Node.js是非阻塞的,但一些事件仍然可能具有块的特征,例如。
- 来自远程服务器的数据请求
- 数据库查询
- 磁盘上的文件访问
换句话说,Node.js允许同时执行代码块,本质上是将两个或多个事务的代码合并到事件队列中等待。合并代码的问题是,当一个事务(X)的代码阻塞了事件循环时,会拖慢另一个事务(Y)的性能。
这种执行代码的模式可以使交易更快,但它会对事件队列中所有请求的性能产生多米诺效应。因此,监控事件循环在任何Node.js应用程序中都是至关重要的,以确定可能影响整体应用程序性能的事务行为。
内存使用和泄漏
会影响Node.js性能的潜在内存泄漏取决于内存使用的结构。JavaScript应用程序中的数值会进入 堆和栈.
垃圾回收
内存泄漏在Node.js中很常见,因为它在长时间引用对象时将值存储在堆中,即使这些值是不需要的。Node.js可以做到这一点,因为单个进程的最大堆大小是1.5GB。为了释放空间,Node.js使用垃圾收集。
在不激活垃圾收集功能的情况下,进程内存大小的稳定增加表明有内存泄漏,你要防止这种情况,因为要找到根本原因是很困难的。监测垃圾收集之间释放的内存、堆的大小和堆的使用情况,将给你一个早期警告,说明内存泄漏的潜在问题。
不完整的清理
内存泄漏的另一个来源是不完整的清理。Node.js应用程序会自动触发垃圾收集周期,以识别内存的 "死 "区域--由堆中不活跃的对象使用的内存--进行清理。
理想情况下,每次清理都会使堆中没有不活跃的对象。然而,这并不总是发生。一些对象留在堆中,占用内存,甚至可能增长。这些不活跃的对象增加了内存的使用,这基本上将它们归类为内存泄漏。
监测垃圾收集前后的堆使用情况将表明你是否以不活动对象的形式隐藏了潜在的泄漏。如果堆的使用量在几个周期的垃圾收集后仍然继续增长,那么这表明可能存在泄漏。
如果发生这种情况,你可以收集堆数据,以确定倾向于留在堆中的类和对象,这样你就可以制定一个管理计划。然后,你可以执行堆转储来清除它。堆转储对应用程序的税收很大,所以最好是在应用程序不使用时执行。
寻找内存泄漏可能相当棘手,而拥有 正确的工具将帮助你做出 ,进行正确的诊断。
应用程序拓扑结构
你要监控的最后一个Node.js性能测量指标是你的应用程序的关键功能和连接或应用程序拓扑结构的布局。云计算从总体上改变了应用拓扑结构,使其更灵活地适应用户需求。监测你的拓扑结构将表明你的环境规模是否最适合你的需求。
在评估你的应用拓扑结构时,你需要测量你面向用户的负载和容器性能。为了确定你是否有足够的服务器来满足面向用户的需求,你需要参考基线加两个标准差,当高峰期的负载增加时。当应用程序持续变慢时,表明需要增加服务器的数量。
这同样适用于评估容器性能。如果你的任何一个服务器层在操作过程中出现明显的压力,那么你需要为该层增加服务器。基于对一台服务器的评估而采取的行动是不合适的,因为负载可能是由于使用以外的因素造成的,比如垃圾收集。然而,当层级作为一个整体处于胁迫状态时,那么你可以安全地假设它不能处理它收到的负载。
Node.js的性能测量可以预防问题
对应用程序性能的定期监测是主动的。你可以在潜在的问题变成问题之前就发现它们,从而避免相当大的麻烦。Node.js应用程序可以从监测这些性能指标中大大受益。
监控Node.js应用程序的最流行的工具是 追踪,这是一个强大的APM系统,可以帮助你跟踪性能和可用性,找到瓶颈并快速有效地修复错误。
作为一个多合一的APM工具,Retrace不仅可以监控你的Node.js应用程序和服务器,还可以提供集成的代码剖析、错误跟踪、集中式日志、完整的事务跟踪、部署跟踪和真实用户监控。
试用Retrace的14天免费试用版以获得你现在需要的结果!
关于Charris Herrera
- 5大Node.js性能测量指标 - 2021年8月31日
- 如何用C# Web API处理全局异常处理程序 - 2021年8月18日
- 如何使用Visual Studio分析器对性能进行故障诊断- 2021年8月2日
- 顶级Visual Studio剖析工具 - 2021年7月16日
- 对网络服务器进行负载测试的最佳方法 - 2021年7月2日