我正在努力診斷我在系統性能日誌中看到的奇怪症狀,偶爾寫入DynamoDB的操作需要幾秒鐘才能完成。與AWS DynamoDB通信時發生整秒延遲
要查看關於基礎設施的一些背景:
- 這是AWS(華東地區)
- 的ELB覆蓋兩個EC2實例(c3.2xlarge)
- 單DynamoDB表託管的Web應用程序配置爲 每秒讀寫1000次
我有一個運行在EC2實例上的PHP web服務,它從連接中收到一個小請求ser,向dynamo寫入記錄,並返回一個空的響應。傳輸的數據量遠低於1kb。 ELB的流量每天都有所不同,但範圍從每秒幾個請求到超過100個。此處重要的一點是,我直接爲我需要的dynamo操作編寫了一個小型CURL客戶端,因爲AWS SDK引入了70ms在我們的處理時間之上的開銷。
我使用的唯一選項是:
CURLOPT_POST
CURLOPT_RETURNTRANSFER
CURLOPT_TCP_NODELAY
開,我看到的行爲: 99%的病例,由ELB記錄的響應時間30毫秒下這是我們的目標。但是,如果我改變圖表以顯示同一範圍內的最大值,我會看到一幅截然不同的圖片(graph),其中時間落在幾乎整秒的時間間隔內。該圖與負載無關,因爲即使在流量最小的深夜也會發生此情況。這些趨勢促使我深入挖掘,並能夠將延遲隔離到與DynamoDB的連接。
這些看起來像程序化的閾值,而不是一般的噪音。我的第一個想法是,它是指數回退,但我沒有看到來自發電機Web服務的反應(這將表明這(全部200年代))的現象,而且我們的吞吐量現在是我們提供的10%,即使在峯值。再次,即使在流量最小的深夜,我們也會看到這種性能趨勢。如果它沒有回退,那麼它肯定感覺像是某種節流。想法?
使用curl的詳細輸出爲我迪納摩API調用,我看到這樣的條目:
Line 151190: 2014-03-12T16:48:35-04:00 - INFO - Time: 1.001436, (Start Transfer: 1.001416, DNS: 2.6E-5, Connect: 0.998141, Pre-Transfer: 0.998199)
Line 196871: 2014-03-12T16:48:42-04:00 - INFO - Time: 1.001528, (Start Transfer: 1.001488, DNS: 3.1E-5, Connect: 0.99694, Pre-Transfer: 0.996981)
Line 430508: 2014-03-12T16:49:19-04:00 - INFO - Time: 1.002823, (Start Transfer: 1.002807, DNS: 3.2E-5, Connect: 0.998972, Pre-Transfer: 0.999009)
Line 870236: 2014-03-12T16:50:31-04:00 - INFO - Time: 1.000663, (Start Transfer: 1.000642, DNS: 3.0E-5, Connect: 0.001506, Pre-Transfer: 0.001537)
Line 950109: 2014-03-12T16:50:43-04:00 - INFO - Time: 1.010762, (Start Transfer: 1.010737, DNS: 3.3E-5, Connect: 0.001357, Pre-Transfer: 0.001394)
的關鍵發現這裏是好像在50%的病例是連接時間,而對於其他50% ,目前還不清楚花費的時間。看起來這裏有另一個組成部分可能有助於端到端的時間,但我正在努力查明可能的結果。
任何幫助將不勝感激!
Dynamo DB在哪個區域?它與EC2實例相同嗎? – Ray
它可能是DNS嗎?正在使用地址或IP?我發現使用ip可以加快速度並且不能確定當前的AWS設置,但可以使用內部地址嗎? –
@Ray - 是的,一切都在同一地區 – Jeff