性能调优
编辑性能调优
编辑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 使用率)就越低,而值越高,在吞吐量暂时激增的情况下丢失事件的可能性就越小。