我想问一些关于优化linux socket的问题。 我尝试使用boost和简单的linux套接字来制作多线程负载均衡器。 负载均衡器的工作原理与这些步骤一样简单:
我也使用来自使用epoll的ting库的Waitset来使recv方法处于阻塞模式,这样它就会等到发生事件然后从套接字中读取数据。
问题是当我用AB测试负载均衡器时,-n 10000 -c 100 -k,结果非常令人失望。我只有~1600 tps。我试着记录每个请求的请求时间,但结果很好。每次往返得到< 1000微升/ 1毫升。
但是当我记录传入的请求间隔时,下一个请求处理了关于>收到当前请求5000微秒/ 5毫秒。也许任何人都可以建议一个更好的解决方案来优化套接字操作?谢谢。
答案 0 :(得分:6)
你使这个过于复杂。每个连接的线程不会超出简单的示例,请阅读C10K problem以获取更多详细信息。
我建议您阅读有关负载均衡器的Boost.Asio库。它在Linux系统上使用epoll(4)
进行异步事件多路分解,并且比每个连接的线程更好地扩展。
答案 1 :(得分:2)
嗯,问题在于你是为每个连接创建一个线程。这不会很好地扩展。那么为什么不创建一个只监视传入连接请求和epoll的in / out / hup事件的线程。该线程不做其他事情使其简单有效。当数据可用时,将其传递给执行工作的线程工作者。您可以通过输入/输出队列加入事件线程和线程工作者(初始化时创建的线程池)。
好吧,如果你有很多连接时效率不高,你就可以平衡多进程中的连接。然后,模型变为在初始化期间分叉多个子进程,并将服务器套接字传递给它们中的每一个。当连接请求进入时,每个子进程都有机会接受。真正的负载均衡与多进程。
根据上面的模型,一台服务器中的20,000多个连接不是问题。希望能帮助你:)