Optimizing Linux Socket

Optimizing Linux Socket

本文关键字:Socket Linux Optimizing      更新时间:2023-10-16

我想问一些关于优化linux套接字的问题。我尝试通过使用boost和简单的linux套接字来制作多线程负载均衡器。负载均衡器的工作步骤非常简单:

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

我还使用ting库中的Waitset,它使用epoll,使recv方法处于阻塞模式,以便它将等待,直到有事件发生,然后从套接字读取数据。

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

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

你把这个弄得太复杂了。每个连接一个线程只能扩展到一些简单的例子,请阅读C10K问题了解更多细节。

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

问题在于每个连接创建一个线程。这不会很好地扩展。那么为什么不创建一个线程来监视传入的连接请求和使用epoll的in/out/hup事件呢?线程不做其他事情以使其简单和高效。当数据可用时,将其传递给线程工作者,由它们来完成这项工作。你可以通过in/out队列来连接事件线程和线程工作者(init时创建的线程池)。

好吧,当你有很多连接时,如果这不够有效,你可以在多进程中平衡连接。然后模型变成在初始化期间派生几个子进程,并将服务器套接字传递给每个子进程。当连接请求进入时,每个子进程都有机会接受。真正的多进程负载均衡。

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