在 mac 上卷曲 TCP keepalive

Curl TCP keepalives on mac

我在负载均衡器下设置了多台服务器,通过 TCP 连接向它们分发请求。换句话说 - 如果我在浏览器中发出许多请求,所有这些请求都将被发送到在打开 TCP 连接时处于负载平衡器下的服务器之一。

然而,当我通过 curl 发出请求时,TCP 连接似乎没有被重用,并且负载平衡器将每个请求发送到新服务器(循环算法)。


问题:

  1. 是否可以使用 CURL 启用 TCP keepalive?如果是 - 如何?
  2. 我应该使用 libcurl 中的某些东西,例如:http://curl.haxx.se/libcurl/c/persistant.html - 我应该怎么做?
  3. 和我用mac有关系吗? http://sourceforge.net/p/curl/bugs/1214/

谢谢。


我尝试过的:

for i in {1..100}; do curl --keepalive --keepalive-time 50 -s -D - http:URL -o /dev/null; done

循环时我 运行 看到每次都使用新端口:

lsof -i -n -P | grep curl

这不是你想象的那样。由于您正在为每个 URL 创建一个新的 curl 进程,这将导致一个新的 TCP 连接,该连接将以进程关闭结束。因此,即使 curl 本身会使用 TCP keep-alive 也没关系,因为它只会在进程完成之前处于活动状态。只要这些请求在同一个进程中(就像重定向一样),Curl 本身就会尝试为多个请求重新使用同一个连接。

您需要的是一种在同一进程内处理多个 URL 的方法,以便它们可以为多个请求重用同一 TCP 连接。这对于 curl 命令行工具是不可能的,因为它只能处理每个 运行 的单个 URL。您必须改用可以在同一进程中处理多个 URL 的工具。

Is it possible to enable TCP keepalives with CURL? If so - how?

是的,这是可能的,但这对您的问题没有帮助。

Should I use something from libcurl, like : http://curl.haxx.se/libcurl/c/persistant.html - how should I do it?

是的,这可能会有所帮助,因为您可以在同一个进程中以这种方式执行多个请求。绑定可用于不同的编程语言。您也可以改用各种脚本语言的本机和舒适的 HTTP 处理,例如 python、perl、ruby...

Is it related to the fact that I use mac? http://sourceforge.net/p/curl/bugs/1214/

不行,因为问题本身根本无法用TCP keep alive来处理。