性能调优
编辑性能调优编辑
Node.js APM 代理提供了各种配置选项,其中一些选项可能会对性能产生重大影响。APM 代理开销可能出现的区域包括:CPU、内存、网络、延迟和存储。本文档讨论了对 APM 代理进行性能调优最重要的选项。
采样率编辑
“采样率”是指记录并发送到 APM 服务器的传入请求的百分比。这由transactionSampleRate
配置选项控制。默认情况下,将跟踪“所有”请求(transactionSampleRate: 1.0
)。
APM 代理需要完成的工作量通常与跟踪的请求数量成线性比例关系。因此,采样率会影响 CPU、内存、网络和存储开销。
请求率高和/或每个传入请求的跨度多的应用程序可能需要降低采样率。例如,请参阅下面的示例,以跟踪 20% 的传入请求。请注意,作为分布式跟踪一部分的传入 HTTP 请求已经做出了采样决定,traceparent
标头包含一个采样标志。在这些情况下,transactionSampleRate
设置将不适用。
require('elastic-apm-node').start({ transactionSampleRate: 0.2 // sample 20% of incoming requests })
堆栈跟踪编辑
当 APM 代理捕获错误时,它会记录其堆栈跟踪,以便以后分析和查看。或者,APM 代理还可以记录捕获的跨度的堆栈跟踪。堆栈跟踪可能会对代理的 CPU 和内存使用量产生重大影响。有几个设置可以调整它们的使用方式。
跨度堆栈跟踪编辑
spanStackTraceMinDuration
配置选项控制是永远不捕获跨度的堆栈跟踪(默认值),还是始终捕获跨度的堆栈跟踪,或者仅捕获持续时间超过给定时间的跨度的堆栈跟踪。在复杂的应用程序中,跟踪的请求可能会捕获许多跨度。捕获并发送每个跨度的堆栈跟踪可能会导致大量的 CPU 和内存使用量。
正是由于这种 CPU 开销的可能性,APM 代理默认情况下禁用了“跨度”的堆栈跟踪收集。不幸的是,即使是在跨度创建时捕获原始堆栈跟踪数据,然后将其丢弃以用于快速跨度,也会对负载较重的应用程序造成巨大的 CPU 开销。因此,在使用spanStackTraceMinDuration
之前必须小心。
堆栈跟踪源代码行编辑
如果要保持启用跨度堆栈跟踪以获取上下文,则接下来要尝试的是调整为每个堆栈跟踪报告的源代码行数。捕获堆栈跟踪时,代理还会捕获堆栈跟踪中每个堆栈帧位置周围的几行源代码。
有四个不同的设置来控制此行为
源代码行设置分为表示应用程序代码的应用程序帧和表示依赖项代码的库帧。应用程序和库类别都分为错误和跨度组。默认情况下,跨度不捕获源代码行。默认情况下,错误将捕获每个堆栈帧周围的五行代码。
源代码行缓存在进程中。在内存受限的环境中,源代码行缓存使用的内存可能超过预期。降低限制将有助于防止过度使用内存。
堆栈帧限制编辑
stackTraceLimit
配置选项控制在生成任何类型的Error
实例时捕获的堆栈帧数。较大的值可能会影响代理的 CPU 和内存开销。
错误日志堆栈跟踪编辑
代理记录的大多数堆栈跟踪都指向错误实例化的位置,而不是使用captureError
识别错误并将其报告给代理的位置。因此,代理还具有captureErrorLogStackTraces
设置,用于启用捕获指向将错误报告给代理的位置的附加堆栈跟踪。默认情况下,它只会在使用字符串消息调用captureError
时捕获到报告点的堆栈跟踪。
将其设置为always
将增加内存和带宽使用量,因此它有助于考虑应用程序捕获错误的频率。
跨度编辑
transactionMaxSpans
设置限制在单个事务中记录的跨度数量,超过此数量后,剩余的跨度将被丢弃。
跨度可能包含许多内容,例如堆栈跟踪和上下文数据。限制可以记录的跨度数量将减少内存使用量。
如果设置得太低,则减少最大跨度数量可能会导致丢失有关请求中发生的情况的有用数据。
限制最大跨度数量的另一种方法是删除持续时间非常短的跨度,因为这些跨度可能不太相关。
但是,这既减少了在 Elasticsearch 中存储跨度所需的存储空间,也减少了将数据从检测到的应用程序传输到 APM 服务器所需的带宽。
这可以通过提供跨度过滤器来实现
agent.addSpanFilter(payload => { return payload.duration < 10 ? null : payload })
使用跨度过滤器不会减少在应用程序中记录跨度的负载,而只是在将跨度发送到 APM 服务器之前将其过滤掉。
最大队列大小编辑
APM 代理使用持久性传出 HTTP 请求(定期刷新)将数据流式传输到 APM 服务器。如果 APM 代理无法跟上来自应用程序的事件(事务、跨度、错误和指标集),或者如果 APM 服务器速度慢或没有响应,则代理将缓冲事件。如果缓冲区超过maxQueueSize
,则会丢弃事件以限制代理的内存使用量。
maxQueueSize
的值越低,代理的堆开销(以及可能的 CPU 使用率)就越低,而值越高,在吞吐量暂时激增的情况下丢失事件的可能性就越小。