首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化Linux套接字

优化Linux套接字
EN

Stack Overflow用户
提问于 2011-10-28 10:47:14
回答 2查看 1.9K关注 0票数 2

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

  1. 传入一个请求,tcp侦听器将接受一个套接字,只需将其称为clientSocket并创建一个新线程。
  2. 当线程启动时,它将创建一个后端套接字,只需将其称为后端服务器(服务)的serverSocket
  3. serverSocket建立之后,我生成一个新线程从serverSocket读取数据/响应到clientSocket
  4. 对于主线程,我调用一个函数,该函数将从clientSocket读取并发送到serverSocket
  5. 当这两个套接字中的一个无效时,工作人员将关闭两个套接字并死亡。

我还使用Waitset from ting库(使用epoll )在阻塞模式下生成recv方法,这样它将等待事件发生,然后从套接字读取数据。

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

但是,当我记录传入的请求间隔时,下一个请求从当前收到的请求中处理大约超过5000微秒/5毫秒。也许有人可以提出一个更好的解决方案来优化这里的套接字操作?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2011-10-30 02:25:02

你把这个弄得太复杂了。每个连接的线程不会扩展到琐碎的示例之外,请阅读C10K问题了解更多细节。

我建议阅读关于您的负载均衡器的Boost.Asio库。它在Linux系统上使用epoll(4)进行异步事件解复用器,并且比每个连接的线程要大得多。

票数 6
EN

Stack Overflow用户

发布于 2012-01-12 05:11:24

问题在于每个连接都要创建一个线程。不会扩大到很好。那么,为什么不创建一个线程来监视传入的连接请求和epoll的入/出/hup事件。线程不会做其他事情来使它简单有效。当数据可用时,将其传递给执行这项工作的线程工作人员。您可以通过入/出队列加入事件线程和线程工作者(init时创建的线程池)。

如果当你有很多连接的时候,这是不够有效的,你可以在多个进程中平衡连接。然后,模型将在初始化过程中分叉几个子进程,并将服务器套接字传递给每个子进程。当连接请求传入时,每个子进程都有接受的机会。多进程的实际负载平衡。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7928241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档