Share Your AWS re:Post Experience - Quick 3 Question Survey
Help us improve AWS re:Post! We're interested in understanding how you use re:Post and its impact on your AWS journey. Please take a moment to complete our brief 3-question survey.
如何对 Linux 计算机上的 Amazon Kinesis 代理问题进行问题排查?
我正在尝试在 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。

相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 1 年前