Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何對 Linux 機器上的 Amazon Kinesis 代理程式問題進行疑難排解?
我正在嘗試在 Linux 機器上使用 Amazon Kinesis 代理程式。但遇到了一個問題。如何解決此錯誤?
簡短描述
本文涵蓋下列問題:
- Kinesis 代理程式正在傳送重複的事件。
- Kinesis 代理程式在我的 Amazon Kinesis 串流上造成寫入調節和失敗記錄。
- Kinesis 代理程式無法讀取或串流日誌檔案。
- 我的 Amazon Elastic Computing (Amazon EC2) 伺服器由於 Java 堆積大小不足而一直失敗。
- 我的 Amazon EC2 CPU 使用率非常高。
解決方案
Kinesis 代理程式正在傳送重複的事件
如果您每次從 Kinesis Agent 傳送日誌時都會收到重複資料,則可能會出現檔案輪換,因為比對模式未正確限定。每次傳送日誌時,Kinesis 代理程式都會檢查符合檔案模式的每個檔案的 latestUpdateTimestamp。依預設,Kinesis 代理程式會選擇最近更新的檔案,識別符合輪換模式的作用中檔案。如果同時更新多個檔案,Kinesis Agent 則無法判斷要追蹤的作用中檔案。因此,Kinesis 代理程式會從一開始就開始追蹤更新的檔案,導致多個重複項目。
若要避免此問題,請為每個個別檔案建立不同的檔案流程,以確保檔案模式會改為追蹤輪換。
**注意:**如果您正在追蹤輪換,最佳實務是使用 create (建立) 或 rename (重新命名) 日誌輪換設定,而不是 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 代理程式日誌,以檢查是否發生任何延遲。只有在 DEBUG 日誌層級下,才會顯示 ProvisionedThroughputExceededException 項目。在此期間,如果大部分 CPU 用於剖析和轉換資料,Kinesis Agent 的記錄傳送速度可能會較慢。
- 如果您發現 Kinesis 代理程式落後,請考慮為您的 Amazon Kinesis 交付串流擴充規模。
Kinesis 代理程式無法讀取或串流日誌檔案
請確定執行 Kinesis 代理程式所在的 Amazon EC2 執行個體具有適當許可,以存取目的地 Kinesis 交付串流。如果 Kinesis 代理程式無法讀取日誌檔案,請檢查 Kinesis 代理程式是否具有該檔案的讀取許可。對於符合此模式的所有檔案,讀取許可必須授予 aws-kinesis-agent-user。對於包含檔案的目錄,讀取和執行許可也必須授予 aws-kinesis-agent-user。否則,您會收到「拒絕存取」錯誤或 Java 執行時間例外狀況。
我的 Amazon EC2 伺服器由於 Java 堆積大小不足而一直失敗
如果您的 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 代理程式正在執行次最佳化的 Regex 模式比對和記錄轉換,則 CPU 使用率可能會增加。如果您已設定 Kinesis 代理程式,請嘗試移除所有規則運算式 (regex) 模式相符項目和轉換。然後,檢查您是否仍然遇到 CPU 問題。
如果您仍然遇到 CPU 問題,請考慮調校記憶體中緩衝的執行緒和記錄。或者,更新 /etc/aws-kinesis/agent.json 組態設定檔案中的一些預設參數。您還可以在 Kinesis 代理程式組態檔案中降低若干參數。
以下是您可以嘗試降低的一般組態參數:
- sendingThreadsMaxQueueSize︰threadPool 將資料傳送至目的地的 workQueue 大小。預設值為 100。
- maxSendingThreads︰傳送資料至目的地的執行緒數目。最小值為 2。預設值是您電腦核心數目的 12 倍。
- maxSendingThreadsPerCore:︰傳送資料至目的地的每核心執行緒數目。預設值為 12。
以下是您可以嘗試降低的流程組態參數:
- publishQueueCapacity︰在傳送至目的地之前,可排入佇列的記錄緩衝區數目上限。預設值為 100。
- minTimeBetweenFilePollsMillis︰在輪詢追蹤檔案並開始剖析新資料的時間間隔。預設值為 100。
- 語言
- 中文 (繁體)

相關內容
- 已提問 2 年前
AWS 官方已更新 2 年前