由于ipv6(Ubuntu)导致卷曲POST之前的10秒延迟

Dan*_*gan 5 post json curl ipv4 ipv6

注意:我不想删除下面的任何历史记录,但我之前认为这是一个Heroku问题,但事实并非如此.我认为这是我的本地机器通过curl和ruby Net :: HTTP发送帖子的问题

我目前正在开始研究Heroku上的rails应用程序(免费),为了将一些测试数据输入应用程序,我有一个rake任务,它从我的DEV DB中获取测试数据并发布到JSON REST API上. heroku app就像这样:

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)
Run Code Online (Sandbox Code Playgroud)

出于某种原因,每个请求几乎都需要10秒钟.然后我将顶线更改为:

uri = URI.parse("http://localhost:3000")
Run Code Online (Sandbox Code Playgroud)

......请求过程非常快.有人知道Heroku是否在免费版上放慢了POSTS的速度?(这是有意义的,因为他们希望你支付工作人员dyno)我最终会为付费版本付出代价,但是在这之前想要在我的DEV中稍微进一步.而且,如果他们没有故意放慢速度,我会有点犹豫不决,直到我知道为什么帖子花了这么长时间.需要10秒的线路是:

response = http.request(request)
Run Code Online (Sandbox Code Playgroud)

我确信这很明显,但我想我会提到它.

更新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
Run Code Online (Sandbox Code Playgroud)

更新3/15 为了确保它不仅仅是导致块的Net :: HTTP :: Post库,我使用curl做了与上面相同的请求,它也花费了10秒:

curl -X POST -H "Content-type: application/json" -d {"params":{"q":"query"} http://SITENAME.herokuapp.com/users.json
Run Code Online (Sandbox Code Playgroud)

任何人都有一个我可以使用的heroku技巧(除了new_relic)来告诉延迟发生在哪里?

更新3/15#2 刚刚在我的Heroku应用程序上切换到独角兽,并且仍然使用Ruby Net :: HTTP :: Post并使用来自shell的curl获得10秒延迟.切换到localhost,帖子立即回来.

更新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)
Run Code Online (Sandbox Code Playgroud)

更新3/28#2

刚尝试了在线外壳的卷曲:www.compileonline.com/execute_bash_online.php,它立即返回,所以我想这是我的机器.任何人都知道如何解决卷曲被抓住的问题.在线shell中本地但瞬时10秒的请求格式为:

curl -X POST -H "Content-type: application/json" -d '{"user":"payload"}' http://APP.herokuapp.com/users.json
Run Code Online (Sandbox Code Playgroud)

更新3/28#3

我机器上的东西导致延迟.我运行以下命令来获取当前系统时间,然后在详细模式下执行curl,并且在发送curl之前发生10秒延迟:

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

......和输出......

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
Run Code Online (Sandbox Code Playgroud)

您可以看到初始时间戳和connect()调用之间的10秒延迟.我已经尝试通过host APP.herokuapp.com在shell中执行来查看解析主机是否是问题,但是会立即返回.

更新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
Run Code Online (Sandbox Code Playgroud)

我尝试使用步骤在我的机器上禁用ipv6 http://www.upubuntu.com/2011/05/how-to-disable-ipv6-under-ubuntu.html,但它仍然无法正常工作.现在的问题是我想要发出的请求是通过Net :: HTTP和HTTParty,所​​以我想在系统范围内解决IPv6问题,所以这个卷曲上的创可贴不是解决方案.

sor*_*ens 0

Heroku 上的日志表明处理您的请求所用的时间是什么?我在 Heroku 上运行的所有应用程序(包括开发版和生产版)的日志在使用时间方面都是准确的。heroku 日志是否显示每个请求使用 10 秒,或者这是客户端的某种计时机制?

我会尝试暂时删除代码路径的某些部分,看看是否可以缩小可能占用时间的范围。例如,您可能会跳过尝试渲染任何复杂的视图,而是直接从控制器渲染 200。接下来,也许尝试注释掉控制器代码。不断取出各个部件,直到找到消耗时间的部件。