在mac上卷曲TCP keepalive

时间:2015-03-03 09:06:09

标签: sockets curl tcp keep-alive

我在负载均衡器下设置了多个服务器,通过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/
  4. 感谢。


    我尝试过:

    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
    

1 个答案:

答案 0 :(得分:1)

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

您需要的是在同一进程中处理多个URL的方法,以便它们可以为多个请求重用相同的TCP连接。使用curl命令行工具无法做到这一点,因为每次运行只能处理一个URL。您必须使用可以在同一进程中处理多个URL的工具。

  

是否可以使用CURL启用TCP Keepalive?如果是这样 - 怎么样?

是的,但这对你的问题没有帮助。

  

我应该使用libcurl中的内容,例如:http://curl.haxx.se/libcurl/c/persistant.html - 我应该怎么做?

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

  

这与我使用mac的事实有关吗? http://sourceforge.net/p/curl/bugs/1214/

不,因为问题本身无法用TCP保持活着。