优化Linux套接字

时间:2011-10-28 10:47:14

标签: c++ multithreading performance sockets boost

我想问一些关于优化linux socket的问题。 我尝试使用boost和简单的linux套接字来制作多线程负载均衡器。 负载均衡器的工作原理与这些步骤一样简单:

  1. 请求进来,tcp监听器将接受套接字,只需说明 clientSocket 并创建新线程
  2. 当线程启动时,它会创建一个后端套接字,只需将它说成 serverSocket 到后端服务器(服务)
  3. serverSocket 建立之后,我会生成一个新线程,以便从 serverSocket 中读取并将数据/响应发送到 clientSocket
  4. 对于主线程,我调用的函数将从 clientSocket 读取并发送到 serverSocket
  5. 当这两个套接字中的一个无效时,工作人员将关闭两个套接字并死掉
  6. 我也使用来自使用epoll的ting库的Waitset来使recv方法处于阻塞模式,这样它就会等到发生事件然后从套接字中读取数据。

    问题是当我用AB测试负载均衡器时,-n 10000 -c 100 -k,结果非常令人失望。我只有~1600 tps。我试着记录每个请求的请求时间,但结果很好。每次往返得到< 1000微升/ 1毫升。

    但是当我记录传入的请求间隔时,下一个请求处理了关于>收到当前请求5000微秒/ 5毫秒。也许任何人都可以建议一个更好的解决方案来优化套接字操作?谢谢。

2 个答案:

答案 0 :(得分:6)

你使这个过于复杂。每个连接的线程不会超出简单的示例,请阅读C10K problem以获取更多详细信息。

我建议您阅读有关负载均衡器的Boost.Asio库。它在Linux系统上使用epoll(4)进行异步事件多路分解,并且比每个连接的线程更好地扩展。

答案 1 :(得分:2)

嗯,问题在于你是为每个连接创建一个线程。这不会很好地扩展。那么为什么不创建一个只监视传入连接请求和epoll的in /​​ out / hup事件的线程。该线程不做其他事情使其简单有效。当数据可用时,将其传递给执行工作的线程工作者。您可以通过输入/输出队列加入事件线程和线程工作者(初始化时创建的线程池)。

好吧,如果你有很多连接时效率不高,你就可以平衡多进程中的连接。然后,模型变为在初始化期间分叉多个子进程,并将服务器套接字传递给它们中的每一个。当连接请求进入时,每个子进程都有机会接受。真正的负载均衡与多进程。

根据上面的模型,一台服务器中的20,000多个连接不是问题。希望能帮助你:)