我想问一些关于优化linux套接字的问题。我试图使用boost和简单的linux套接字来制作多线程负载均衡器。负载平衡器的工作原理与以下步骤一样简单:
我还使用Waitset from ting库(使用epoll )在阻塞模式下生成recv方法,这样它将等待事件发生,然后从套接字读取数据。
问题是当我用AB,-n 10000 -c 100 -k测试负载平衡器时,结果非常令人失望。我只得到了1600 tps。我试图记录每个请求所需的请求时间,但是结果很好。每次往返均小于1000微秒/1毫秒。
但是,当我记录传入的请求间隔时,下一个请求从当前收到的请求中处理大约超过5000微秒/5毫秒。也许有人可以提出一个更好的解决方案来优化这里的套接字操作?谢谢。
发布于 2011-10-30 02:25:02
你把这个弄得太复杂了。每个连接的线程不会扩展到琐碎的示例之外,请阅读C10K问题了解更多细节。
我建议阅读关于您的负载均衡器的Boost.Asio库。它在Linux系统上使用epoll(4)进行异步事件解复用器,并且比每个连接的线程要大得多。
发布于 2012-01-12 05:11:24
问题在于每个连接都要创建一个线程。不会扩大到很好。那么,为什么不创建一个线程来监视传入的连接请求和epoll的入/出/hup事件。线程不会做其他事情来使它简单有效。当数据可用时,将其传递给执行这项工作的线程工作人员。您可以通过入/出队列加入事件线程和线程工作者(init时创建的线程池)。
如果当你有很多连接的时候,这是不够有效的,你可以在多个进程中平衡连接。然后,模型将在初始化过程中分叉几个子进程,并将服务器套接字传递给每个子进程。当连接请求传入时,每个子进程都有接受的机会。多进程的实际负载平衡。
根据上面的模型,一个服务器上的20,000+连接不是一个问题。希望对你有帮助:)
https://stackoverflow.com/questions/7928241
复制相似问题