如何对 Linux 计算机上的 Amazon Kinesis 代理问题进行问题排查?

上次更新日期:2022 年 5 月 5 日

我正在尝试在 Linux 计算机上使用 Amazon Kinesis 代理。但是,我遇到了问题。如何解决此问题?

简短描述

本文涵盖以下问题:

  • Kinesis 代理正在发送重复的事件。
  • Kinesis 代理导致我的 Amazon Kinesis 流出现写入限制和失败的记录。
  • Kinesis 代理无法读取或流式传输日志文件。
  • 由于 Java 堆大小不足,我的 Amazon Elastic Computing(Amazon EC2)服务器一直出现故障。
  • 我的 Amazon EC2 CPU 利用率非常高。

解决方法

Kinesis 代理正在发送重复的事件

如果每次从 Kinesis 代理发送日志时都收到重复项,则在匹配模式未正确限定的地方,可能存在文件轮换。每当您发送日志时,Kinesis 代理都会检查与文件模式匹配的每个文件的 latestUpdateTimestamp。默认情况下,Kinesis 代理会选择最近更新的文件,以标识与轮换模式匹配的活动文件。如果同时更新了多个文件,Kinesis 代理将无法确定要跟踪的活动文件。因此,Kinesis 代理从一开始就开始跟踪更新后的文件,从而导致多个重复项。

要避免此问题,请为每个单独的文件创建不同的文件流,确保您的文件模式会跟踪轮换。

注意:如果您正在跟踪轮换,则最佳实践是使用创建重命名日志轮换设置,而不是使用 copytruncate

例如,您可以使用与此文件流类似的文件流:

"flows": [
        {
            "filePattern": "/tmp/app1.log*",
            "kinesisStream": "yourkinesisstream1"
        },
        {
            "filePattern": "/tmp/app2.log*",
            "kinesisStream": "yourkinesisstream2"
        }
    ]

Kinesis 代理还会重试在出现间歇性网络问题时未能发回的所有记录。如果 Kinesis 代理无法接收服务器端确认,则会重试,以创建重复项。在此示例中,下游应用程序必须删除重复数据。

当检查点文件被调整或删除时,也可能出现重复项。如果检查点文件存储在 /var/run/aws-kinesis-agent 中,则该文件可能会在重新安装或实例重启期间被清理。再次运行 Kinesis 代理时,只要读取文件,应用程序就会失败,从而导致重复。因此,请将检查点保留在主代理目录中,并使用新位置更新 Kinesis 代理配置。

例如:

"checkpointFile": "/aws-kinesis-agent-checkpoints/checkpoints"

Kinesis 代理导致我的 Amazon Kinesis 数据流出现写入限制和失败的记录

默认情况下,Kinesis 代理会尝试尽快发送日志文件,从而突破 Kinesis 的吞吐量阈值。但是,失败的记录将被重新列队,并不断重试以防止任何数据丢失。当队列已满时,Kinesis 代理会停止跟踪该文件,这可能会导致应用程序滞后。

例如,如果队列已满,则您的日志如下所示:

com.amazon.kinesis.streaming.agent.Agent [WARN] Agent: Tailing is 745.005859 MB (781195567 bytes) behind.

注意:队列大小由 publishQueueCapacity 参数(默认值设置为“100”)决定。

要调查 Kinesis 数据流中的任何失败记录或性能问题,请尝试以下操作:

  • 在 Amazon CloudWatch 中监控 RecordSendErrors 指标。
  • 查看您的 Kinesis 代理日志以检查是否出现任何滞后。ProvisionedThroughputExceededException 条目仅在 DEBUG 日志水平下可见。在此期间,如果大部分 CPU 用于解析和转换数据,Kinesis 代理的记录发送速度可能会变慢。
  • 如果您发现 Kinesis 代理滞后了,请考虑纵向扩展您的 Amazon Kinesis 传输流。

Kinesis 代理无法读取或流式传输日志文件

确保您的 Kinesis 代理运行所在的 Amazon EC2 实例具有访问目标 Kinesis 传输流的适当权限。如果 Kinesis 代理无法读取日志文件,请检查 Kinesis 代理是否具有该文件的读取权限。对于与此模式匹配的所有文件,必须向 aws-kinesis-agent-user 授予读取权限。对于包含这些文件的目录,还必须向 aws-kinesis-agent-user 授予读取和执行权限。否则,您会收到拒绝访问错误或 Java 运行时异常。

由于 Java 堆大小不足,我的 Amazon EC2 服务器一直出现故障

如果您的 Amazon EC2 服务器因为 Java 堆大小不足而持续出现故障,请增加分配给 Amazon Kinesis 代理的堆大小。要配置 Kinesis 代理的可用内存量,请更新“start-aws-kinesis-agent”文件。增加以下参数的设定值:

  • JAVA_START_HEAP
  • JAVA_MAX_HEAP

注意:在 Linux 上,“start-aws-kinesis-agent”的文件路径为“/usr/bin/start-aws-kinesis-agent”。

我的 Amazon EC2 CPU 利用率非常高

如果 Kinesis 代理正在执行次优化的正则表达式模式匹配和日志转换,CPU 利用率可能会激增。如果您已经配置了 Kinesis 代理,请尝试删除所有正则表达式(regex)模式匹配和转换。然后,检查您是否仍然遇到 CPU 问题。

如果您仍然遇到 CPU 问题,请考虑调整内存中缓冲的线程和记录。或者,更新 /etc/aws-kinesis/agent.json 配置设置文件中的一些默认参数。您还可以降低 Kinesis 代理配置文件中的几个参数。

以下是您可以尝试降低的常规配置参数:

  • sendingThreadsMaxQueueSize:用于将数据发送到目标的 threadPool 的 workQueue。默认值为 100。
  • maxSendingThreads:用于向目标发送数据的线程数。最小值为 2。默认值是计算机内核数的 12 倍。
  • maxSendingThreadsPerCore:每个内核用于向目标发送数据的线程数。默认值为 12。
以下是您可以尝试降低的流配置参数:
  • publishQueueCapacity:记录在发送到目标之前可以列队的最大缓冲区数。默认值为 100。
  • minTimeBetweenFilePollsMillis:轮询被跟踪的文件和新数据开始解析时的时间间隔。默认值为 100。

这篇文章对您有帮助吗?


您是否需要账单或技术支持?