性能调优编辑

使用任何 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 请求的性质,捕获事务的请求正文可能会导致明显的开销,以及存储使用量的增加。在大多数情况下,我们建议不要为事务启用请求正文捕获,并且仅在需要时才为错误启用它。

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