性能调优

编辑

使用任何APM解决方案都会带来权衡,Elastic APM Ruby代理也不例外。检测您的代码、使用计时器、记录上下文数据等都会使用资源,例如:

  • CPU 时间
  • 内存
  • 带宽
  • Elasticsearch 存储

我们投入大量精力以确保 Ruby 代理适用于生产代码,并且其开销保持尽可能低。但是,由于每个应用程序都不同,因此您可以调整一些参数以使代理适应您的特定需求。

事务采样率

编辑

默认情况下,代理会对每个事务进行采样。减少代理开销和存储需求最简单的方法是减少采样事务的数量。为此,请将transaction_sample_rate设置为0.01.0之间的值,即您想要随机采样的事务的百分比。代理仍将记录未采样事务的总时间和结果,但不记录上下文信息、标签或跨度。

收集帧上下文

编辑

代理会自动捕获堆栈跟踪中每个帧位置周围的几行源代码。这使 APM 应用程序能够更深入地了解错误或跨度究竟发生在代码中的哪个位置。这种洞察力确实需要付出代价——就性能而言,堆栈跟踪收集是代理执行的最昂贵操作。

您可以修改一些设置来控制此行为:

  1. 通过将span_frames_min_duration设置为0,禁用对短持续时间跨度的堆栈跟踪帧收集。
  2. 修改收集的源代码行数。这些设置分为应用程序框架(表示您的应用程序代码)和库框架(表示依赖项的代码)。这两个类别进一步细分为单独的错误和跨度设置。

  3. 如果您使用 API 创建自定义跨度,可以使用include_stacktrace参数禁用堆栈跟踪收集。

在正在运行的应用程序中读取源文件可能会导致大量磁盘 I/O,并且为每个帧发送源代码行将产生相当高的网络和存储成本。降低这些限制将防止在 Elasticsearch 中存储过量的数据。

事务队列

编辑

代理不会在事务发生时立即发送每个事务。相反,为了减少 APM 服务器的负载,代理使用队列。队列会定期刷新,或者在达到最大大小时刷新。

虽然这减少了 APM 服务器的负载,但在队列中保留事务数据会使用内存。如果您发现内存使用量大幅增加,请尝试调整以下设置:

  • 使用api_request_time减少单个流式请求的持续时间。如果您持续拥有大量事务,此设置很有用。
  • 使用api_request_size减少单个请求的最大大小。如果您遇到事务峰值(短时间内大量事务),此设置会有所帮助。

请记住,减小任一设置的值都会导致代理向 APM 服务器发送更多 HTTP 请求,这可能会导致更高的负载。

每个事务的跨度

编辑

每个事务的跨度数量会影响代理在每个事务中收集上下文数据所花费的时间以及 Elasticsearch 中所需的存储空间。根据我们的经验,大多数常见事务的跨度应该远低于 100 个。但是,在某些情况下,跨度数量可能会激增,例如:

  • 长时间运行的事务
  • 未优化的代码,例如在循环中执行数百个 SQL 查询

为了避免这些同时使代理和 APM 服务器过载的极端情况,代理将在达到指定限制时停止记录跨度。此限制可以使用transaction_max_spans进行配置。

捕获标头和请求正文

编辑

您可以使用capture_headerscapture_body配置代理以捕获标头和请求正文。默认情况下,会捕获标头,而不会捕获请求正文。

根据 POST 请求的性质,捕获事务的请求正文可能会引入明显的开销,以及增加存储使用量。在大多数情况下,我们建议不要为事务启用请求正文捕获,仅在错误需要时启用。

捕获请求/响应标头比捕获请求正文对代理的开销更小,但可能会影响存储使用量。