2013-03-12 66 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