[英]Apache Storm issue with Dynamic redirection of tuples (baffling impact on end-to-end latency)
在下面,我包含解釋我在Storm中面臨的問題的文本。 無論如何,我知道這是一篇很長的文章(請多加注意),任何評論/指示都值得歡迎。 描述如下:
我已經在一台服務器上安裝了Storm 0.9.4和ZooKeeper 3.4.6(2個插槽,裝有Intel Xeon 8核芯片,運行CentOS的96 GB內存),並且已經設置了一個偽分布式的單節點Storm運行時。 我的配置包括1個Zookeeper服務器,1個nimbus進程,1個主管進程和1個工作進程(提交拓撲時),它們都在同一台計算機上運行。 我的實驗的目的是查看輸入負載在執行程序線程之間動態分配時,Storm在單節點設置上的行為。
出於實驗目的,我輸入了由1個long和1個整數組成的元組。 輸入數據來自兩個從磁盤文件讀取元組的噴嘴,我控制輸入速率以遵循該模式:前24秒(時間0-24秒)為200元/秒,接下來的12秒為800元/秒( 24-36秒)200個元組/秒,持續6秒(時間36-42秒)。回到我的拓撲結構,我有兩種類型的螺栓:a)一個分派器螺栓,它接收來自兩個噴嘴的輸入,以及(b)一個消費者螺栓,它在元組上執行操作並保持一些元組為狀態。 Dispatcher的並行性提示是一個(1個執行程序/線程),因為我已經檢查過它永遠不會達到其容量的10%。 對於Consumer螺栓,我有兩個並行提示(該螺栓有2個執行程序/線程)。 選擇了我前面提到的輸入速率,以便我可以使用Consumer螺栓上的適當數量的執行器來監視不到10毫秒的端到端延遲。 詳細地說,我使用一個Consumer執行程序運行了相同的拓撲,它可以處理200個元組/秒的輸入速率,端到端延遲<10毫秒。 同樣,如果我再添加一個消費者執行器(總共2個執行器),則拓撲可以消耗800個元組/秒,端到端延遲小於10毫秒。 在這一點上,我不得不說,如果我使用1個消費者執行器以800個元組/秒的速度運行,則端到端延遲將達到2秒。 順便說一句,我不得不提到,我使用螺栓的ack()函數來測量端到端的延遲,並查看從發送拓撲中的元組到完全確認其元組樹之間需要花費多少時間。
到現在為止,您的目標是通過模擬另一個Consumer執行器的添加來查看我是否可以將輸入尖峰的端到端延遲保持在<10毫秒以內,以便模擬為輸入添加處理資源峰值,我使用直接分組,在峰值之前,我僅將元組發送給兩個消費者執行器之一。 當在Dispatcher上檢測到峰值時,它也開始將元組發送到另一個Consumer,以便在兩個線程之間平衡輸入負載。 因此,我希望當我開始將元組發送到附加的Consumer線程時,端到端的延遲將降至其可接受的值。 但是,以前沒有發生。
為了驗證我的假設,即兩個Consumer執行器能夠在峰值期間保持小於10毫秒的延遲,我執行了相同的實驗,但是這次,我在整個實驗過程中將元組發送給兩個執行器(線程)。 在這種情況下,端到端延遲保持穩定並處於可接受的水平。 因此,我不知道模擬中真正發生了什么。 在將輸入負載重定向到附加的Consumer執行程序的情況下,我無法真正找出導致端到端延遲惡化的原因。
為了進一步了解Storm的機制,我在較小的計算機上進行了相同的設置並進行了性能分析。 我看到大部分時間都花在了lmax干擾器的BlockingWaitStrategy中,它支配着CPU。 我的實際處理功能(在Consumer螺栓中)僅占lmax BlockingWaitStrategy的一小部分。 因此,我認為這是隊列之間的I / O問題,而不是與Consumer中元組的處理有關。
關於出什么問題的任何想法,我都會得到這種激進/令人困惑的行為?
謝謝。
首先,感謝您提出的詳細而有條理的問題! 我這邊有很多評論(不確定是否已經是答案...):
希望這可以幫助。 如果您還有其他問題和/或信息,我可以稍后再完善我的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.