【问题标题】:10 Second Delay Before Curl POST due to ipv6 (Ubuntu)由于 ipv6 (Ubuntu),Curl POST 前延迟 10 秒
【发布时间】:2013-02-28 09:57:57
【问题描述】:

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

我目前开始在 Heroku(免费)上开发 Rails 应用程序,为了将一些测试数据输入应用程序,我有一个 rake 任务,它从我的 DEV DB 获取测试数据并发布到 JSON REST heroku 应用程序上的 API 如下所示:

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)

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

更新 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

更新 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

谁有我可以使用的 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)

更新 3/28 #2

刚刚从在线 shell 中尝试了 curl:www.compileonline.com/execute_bash_online.php 并立即返回,所以我猜这与我的机器有关。任何人都知道我可以如何解决卷曲被抓住的地方。本地 10 秒但在线 shell 中瞬时的请求格式为:

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

更新 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

...和输出...

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 来查看是否解决了主机问题,但它会立即返回。

更新 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 问题,所以这个 curl 上的创可贴不是解决方案。

【问题讨论】:

  • 我在 Heroku 上有一个应用程序,它处理 POST 的速度非常快,所以我想他们正在减慢对单个测功机的编程请求,所以你不能通过 ping 它来保持它加载到内存中
  • Heroku 没有速率限制。您在处理 POST 时是否在进行任何类型的处理或数据库查询?您可能想添加类似 New Relic 之类的内容来弄清楚发生了什么:addons.heroku.com/newrelic
  • 是的,POST 做了一个简单的数据库插入,但是这在我的 PC 上发生了大约 20 毫秒,所以我无法想象在 Heroku 服务器上需要更长的时间。我刚刚检查了 heroku 日志以确认这一点 - 它很快返回我今天做了 1400 条这样的帖子,所有这些帖子都花了 10 秒 - 请参阅上面编辑过的帖子以获取一些日志条目。
  • 相当奇怪的结果。您是否尝试过使用 New Relic 查看请求的哪些部分需要这么长时间?
  • 尝试切换到独角兽来为您的应用程序提供服务(无论您是否遇到问题,都建议这样做)。如果这不起作用,请尝试暂时升级到双测功机系统,看看是否有不同(您按秒付费,因此无需支付太多或任何钱即可运行测试应该不会太难)。无论哪种方式,New Relic 的结果只是表明请求在到达您的应用程序代码之前被延迟,从而缩小了问题范围。

标签: json post curl ipv6 ipv4


【解决方案1】:

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

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

【讨论】:

  • 我看到的 10 秒记录在我的客户端 rake 任务的日志中,该任务将 POST 发送到我的 heroku 站点(并且还看到使用 curl 和 through 执行 POST 的相同的 10 秒一致延迟ruby 的 Net::HTTP)。 New Relic 和 heroku 日志都在我的 Heroku 实例上显示了非常快的响应时间。我要去和heroku支持谈谈。
  • 听起来你的 rake 任务有一个代码路径正在用完那个时间,而不是与你的服务代码相关的东西。我会更深入地了解您的 rake 任务正在做什么。没有多大帮助,我知道。祝你好运。
  • 这不是 rake 任务,因为 curl 请求和 Net::HTTP 请求的行为方式与我在 rake 任务中调用时的行为方式相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 2012-01-08
相关资源
最近更新 更多