2013-03-12 70 views
5

注意:我不想刪除下面的任何歷史記錄,但是我認爲這是之前的Heroku問題,但事實並非如此。我認爲這是一個問題,我的本地機通過curl和ruby發送帖子:: HTTP由於ipv6(Ubuntu)在Curl POST之前10秒延遲

我目前開始在Heroku上的Rails應用程序(免費)和爲了獲得一些測試數據到應用程序我有一個rake任務,從我的DEV DB和崗位需要的測試數據,以一個JSON REST API的應用程序的Heroku像這樣:

uri = URI.parse("http://SITENAME.herokuapp.com") 
http = Net::HTTP.new(uri.host, uri.port) 
request = Net::HTTP::Post.new("/users.json") 
request.add_field('Content-Type', 'application/json') 
request.body = {'user' => User.first.to_hash }.to_json 
response = http.request(request) 

出於某種原因,每個請求都需要整10秒。然後,我將頂線改爲:

uri = URI.parse("http://localhost:3000") 

...並且請求處理速度非常快。有沒有人知道Heroku是否會減慢免費版本的POSTS? (這是有道理的,因爲他們希望你爲工人代幣支付費用)我最終會爲付費版本小馬,但是在這之前我想在DEV中進一步瞭解一下。另外,如果他們不是故意放慢速度,我會有點猶豫,直到我知道爲什麼這些帖子需要這麼長時間。需要10秒的線路是:

response = http.request(request) 

我確信這很明顯,但我想我會提到它。

UPDATE 3/12 只是想從我今天發佈一些日誌。所有的請求都用10秒鐘:

1400 
Before: 2013-03-12 21:30:33 UTC 
After: 2013-03-12 21:30:43 UTC 
1401 
Before: 2013-03-12 21:30:43 UTC 
After: 2013-03-12 21:30:54 UTC 
1402 
Before: 2013-03-12 21:30:54 UTC 
After: 2013-03-12 21:31:04 UTC 
1403 
Before: 2013-03-12 21:31:04 UTC 
After: 2013-03-12 21:31:14 UTC 
1404 
Before: 2013-03-12 21:31:14 UTC 
After: 2013-03-12 21:31:24 UTC 
1405 
Before: 2013-03-12 21:31:24 UTC 
After: 2013-03-12 21:31:34 UTC 

UPDATE 3/15 ,以確保它不只是網:: HTTP ::郵政庫導致塊我提出同樣的要求如上與捲曲而且還花了10秒:

curl -X POST -H "Content-type: application/json" -d {"params":{"q":"query"} http://SITENAME.herokuapp.com/users.json 

人有一個Heroku的把戲我可以使用(比new_relic等)告知其中延遲是怎麼回事?

UPDATE 3/15#2 只需切換到麒麟我的Heroku的應用程序,並仍然得到兩者的Ruby的Net :: HTTP ::後10秒延遲和使用curl從shell。切換到本地主機,該帖子立即回來。

UPDATE 3/28

每最近評論,發佈Heroku的日誌用極快的響應時間:

2013-03-29T03:22:06+00:00 app[web.1]: Started POST "/user.json" for IP 
2013-03-29T03:22:06+00:00 app[web.1]: Parameters: {"user"=>{data}} 
2013-03-29T03:22:06+00:00 app[web.1]: Processing by UserController#create as JSON 
2013-03-29T03:22:06+00:00 app[web.1]: User Load (2.2ms) <<<SQL>>> 
2013-03-29T03:22:06+00:00 app[web.1]: Completed 200 OK in 3ms (Views: 0.1ms | ActiveRecord: 2.2ms) 
2013-03-29T03:22:06+00:00 heroku[router]: at=info method=POST path=/users.json host=HOST.herokuapp.com fwd="66.31.201.99" dyno=web.1 connect=2ms service=33ms status=200 bytes=16 
2013-03-29T03:22:16+00:00 app[web.1]: Started POST "/users.json" for 66.31.201.99 at 2013-03-29 03:22:16 +0000 
2013-03-29T03:22:16+00:00 app[web.1]: Processing by UserController#create as JSON 
2013-03-29T03:22:16+00:00 heroku[router]: at=info method=POST path=/users.json host=HOST.herokuapp.com fwd="66.31.201.99" dyno=web.1 connect=8ms service=19ms status=200 bytes=16 
2013-03-29T03:22:16+00:00 app[web.1]: Parameters: Parameters: {"user"=>{data}} 
2013-03-29T03:22:16+00:00 app[web.1]: User Load (2.0ms) SQL 
2013-03-29T03:22:16+00:00 app[web.1]: Completed 200 OK in 3ms (Views: 0.1ms | ActiveRecord: 2.0ms) 

UPDATE 3/28#2

剛試過的curl從一個在線shell:www.compileonline.com/execute_bash_online.php,它立即返回,所以我想這是我的機器。任何人都知道如何解決捲曲發生的位置。這是10秒,但局部瞬間在網上殼要求的格式爲:

curl -X POST -H "Content-type: application/json" -d '{"user":"payload"}' http://APP.herokuapp.com/users.json 

UPDATE 3/28#3

東西在我的機器上造成了延誤。我跑到下面來獲取當前系統時間,然後在詳細模式下進行卷曲和10秒延遲發生之前的捲曲甚至派:

date +"%T" && curl -X POST -H "Content-type: application/json" -d '{"user":"payload"}' http://APP.herokuapp.com/users.json -v --trace-time -S 

...和輸出...

00:44:16 [start time from date +"%T"] 
00:44:26.653510 * About to connect() to APP.herokuapp.com port 80 (#0) 
00:44:26.653632 * Trying 184.72.248.52... connected 
00:44:26.675676 > POST /users.json HTTP/1.1 
00:44:26.675676 > User-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 
00:44:26.675676 > Host: APP.herokuapp.com 
00:44:26.675676 > Accept: */* 
00:44:26.675676 > Content-type: application/json 
00:44:26.675676 > Content-Length: 653 
00:44:26.675676 > 
00:44:26.675954 * upload completely sent off: 653out of 653 bytes 
00:44:26.717286 < HTTP/1.1 200 OK 
00:44:26.717380 < Cache-Control: max-age=0, private, must-revalidate 
00:44:26.717518 < Content-Type: application/json; charset=utf-8 
00:44:26.717552 < Date: Fri, 29 Mar 2013 04:44:33 GMT 
00:44:26.717584 < Etag: "7363e85fe9edee6f053a4b319588c086" 
00:44:26.717616 < Status: 200 OK 
00:44:26.717647 < X-Rack-Cache: invalidate, pass 
00:44:26.717678 < X-Request-Id: 19ff002048e4e2d5e17a8203576a4194 
00:44:26.717708 < X-Runtime: 0.008901 
00:44:26.717739 < X-Ua-Compatible: IE=Edge,chrome=1 
00:44:26.717771 < transfer-encoding: chunked 
00:44:26.717802 < Connection: keep-alive 
00:44:26.717832 < 
00:44:26.717925 * Connection #0 to host APP.herokuapp.com left intact 
00:44:26.717998 * Closing connection #0 

您可以看到初始時間戳和connect()調用之間的10秒延遲。我已經嘗試通過在shell中執行host APP.herokuapp.com解決主機問題,但是立即返回。

UPDATE 3/28#4

我已經更新上面的例子包括-4標誌,以便它強制使用IPv4和它自己的計算機上立即返回:

date +"%T" && curl -4 -X POST -H "Content-type: application/json" -d '{"user":"payload"}' http://APP.herokuapp.com/users.json -v --trace-time -S 

我嘗試使用http://www.upubuntu.com/2011/05/how-to-disable-ipv6-under-ubuntu.html上的步驟禁用我的機器上的ipv6,但它仍然無法工作。現在的問題是,我想要的請求是通過Net :: HTTP和HTTParty,所​​以我想修復系統範圍內的IPv6問題,所以這種捲曲幫助不是解決方案。

+1

我在Heroku上有一個應用程序,它處理POSTs的速度非常快,所以我可以想象它們正在減慢編程請求到單個測試程序,所以你不能通過ping它來將它加載到內存中 – AJcodez 2013-03-12 20:48:27

+0

沒有速率限制Heroku的。處理POST時是否正在進行任何類型的處理或數據庫查詢?你可能想添加一些像New Relic的東西來弄清楚發生了什麼事情:https://addons.heroku.com/newrelic – friism 2013-03-12 21:32:52

+0

是的,POST做了一個簡單的數據庫插入,但是這發生在我的PC上的20ms內,所以我無法想象在Heroku服務器上需要更長的時間。我剛剛檢查了heroku日誌以確認這一點 - 它很快返回,我今天完成了這些POSTS的1400個,所有這些都準確地花了10秒 - 請參閱上面編輯過的一些日誌條目。 – 2013-03-13 01:56:34

回答

0

Heroku上的日誌表明用於處理請求的時間是什麼?日誌對於我在Heroku上運行的所有應用程序(包括開發和生產)在使用時間方面都是準確的。 heroku日誌顯示每個請求使用10秒還是客戶端的某種計時機制?

我會嘗試暫時刪除代碼路徑的一部分,以查看是否可以縮小可能佔用時間的範圍。例如,你可以跳過試圖渲染任何複雜的視圖,而是從控制器向右渲染200。接下來,也許嘗試註釋掉控制器代碼。繼續拿出各種零件,直到找到耗費時間的東西。

+0

我看到的10秒鐘是在我的客戶端rake任務的日誌中發送POST到我的heroku站點(也可以看到用curl和ruby的Net :: HTTP做POST的相同的10秒一致的延遲)。 New Relic和heroku日誌在我的Heroku實例中都顯示出非常快的響應時間。我要去談談對Heroku的支持。 – 2013-03-29 03:20:52

+0

它聽起來像你的耙子任務有一個代碼路徑,這是用盡了時間,而不是有關你的服務代碼。我會更深入地看待你的耙子任務正在做什麼。我知道沒什麼幫助。祝你好運。 – sorens 2013-04-01 22:08:02

+0

這不是rake任務,因爲curl請求和Net :: HTTP請求的行爲與我在rake任務中調用時的行爲相同。 – 2013-04-07 21:04:27