如何對 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。
相關內容
- 已提問 1 年前lg...
- 已提問 1 年前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前