【发布时间】:2011-10-28 10:47:14
【问题描述】:
我想问一些关于优化 linux socket 的问题。 我尝试通过使用 boost 和简单的 linux 套接字来制作多线程负载均衡器。 负载均衡器的工作方式与以下步骤一样简单:
- 一个请求进来,tcp监听器会接受一个socket,直接说clientSocket并创建一个新线程
- 线程启动时,会创建一个后端socket,直接说serverSocket给后端服务器(服务)
- serverSocket 建立后,我生成一个新线程来读取 serverSocket 并将数据/响应发送到 clientSocket
- 对于主线程,我调用了一个函数,该函数将从 clientSocket 读取并发送到 serverSocket
- 当这两个套接字中的一个变为无效时,worker 将关闭这两个套接字并死亡
我还使用了ting库中的Waitset,它使用了epoll,使recv方法处于阻塞模式,这样它就会等到有事件发生,然后从socket中读取数据。
问题是当我用 AB 测试负载均衡器时,-n 10000 -c 100 -k,结果非常令人失望。我只有~1600 tps。我试图记录每个请求所花费的请求时间,但结果很好。每次往返都小于 1000 微秒/1 毫秒。
但是当我记录传入的请求间隔时,下一个请求处理的时间大约是从当前收到的请求开始 > 5000 微秒/5 毫秒。也许任何人都可以在这里提出一个更好的解决方案来优化套接字操作?谢谢。
【问题讨论】:
-
这和boost有什么关系?您的意思是提升性能吗?
-
我使用 boost::thread 生成线程。我这里说的是如何提高linux tcp socket性能。
-
每次收到 TCP 连接时生成一个新线程并不是一种非常有效的处理方式。您可能想查看 C10K 问题文章 (kegel.com/c10k.html) 以了解有关替代方案的想法。 (至少你可以实现一个线程池,这样在大多数情况下,一个已经运行的线程可以负责这项工作,而不是每次都产生一个新线程)
-
我不明白你在做什么。你真的每个连接创建两个线程吗?这是荒谬的。这些事情的完成方式是在每个 CPU 上绑定一个线程来处理 epoll 事件。
标签: c++ multithreading performance sockets boost