2014-02-05 66 views
1

我正在運行一個簡單的Web應用程序,它爲每個請求使用一些Web服務,並且我發現我們的服務器使某些時間超時的請求(合成599錯誤),即使其他服務在任何時候都有響應(我已經證實了這一點)。Tornado AsyncHTTPClient在中等負載下請求超時

這些都是那種,我得到錯誤信息:

HTTP 599: Connection timed out after 7005 milliseconds 

(超時而連接)

HTTP 599: Operation timed out after 5049 milliseconds with 0 out of -1 bytes received 

HTTP 599: Operation timed out after 10005 milliseconds with 11197 out of 13047 bytes received 

((接收數據前超時)超時部分傳輸數據)

我已經能夠在兩個不同的環境中,在Amazon EC2迷你實例和我的Macbook Pro(i7)中重現這一點。在EC2實例中,超時開始發生時只有2個併發客戶端發出請求,Macbook持續到8個併發客戶端,然後它也開始顯示超時。

我已經嘗試了一些東西,如更新Tornado版本(2.2,2.3.1,2.4.1和3.1.1,如果我沒記錯的話),將基礎AsyncHTTPClient實現從默認簡單的更改爲基於pycurl並增加異步客戶端的數量(至200),但錯誤仍在發生。

我不知道我有什麼可可能做錯了,因爲這看起來並不像所承諾的可擴展性龍捲風應該提供在所有...

任何提示?

更新

只是備案,我們在異步回調使用memcache,但庫不是異步本身。我將其替換爲:https://github.com/dpnova/tornado-memcache/

這是我認爲的最大問題,雖然我們仍然不時得到599。

回答

1

這聽起來像你的代碼可能阻塞事件循環某處(對於整數秒 - 你有任何調用time.sleep()?)。嘗試使用IOLoop.set_blocking_log_threshold查找事件循環被阻止的位置。

+0

不睡覺,但我會嘗試'IOLoop.set_blocking_log_threshold' ...謝謝! :) – fortran

+0

不幸的是,堆棧跟蹤看起來很隨機,就像沒有一個地方阻塞計算正在執行:(有時它是在一段代碼中操縱一些json響應使其更友好,其他時間在模板中render ... – fortran

+0

你使用的是什麼閾值?如果你看到所有的堆棧跟蹤信息都表明你正在做*某事*在非阻塞服務器中使用太慢了。 –