Optimizing Linux Socket
Optimizing Linux Socket
我想问一些关于优化linux套接字的问题。我尝试通过使用boost和简单的linux套接字来制作多线程负载均衡器。负载均衡器的工作步骤非常简单:
- 一个请求来了,tcp监听器将接受一个套接字,只需输入clientSocket并创建一个新线程 当线程启动时,它将创建一个后端套接字,只需将其写入serverSocket到后端服务器(service)
- 在serverSocket建立之后,我生成一个新的线程从serverSocket读取数据/响应发送到clientSocket 对于主线程,我调用一个函数,该函数将从clientSocket读取并发送到serverSocket
- 当这两个套接字中的一个无效时,工作线程将关闭两个套接字并死亡
我还使用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多个连接不是问题。希望对你有帮助
- 在C++/Linux中设置单调时钟的一些技巧
- Linux的Cpp上的计时器
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 在Linux中哪里可以找到互斥、未来等的源代码
- 如何在linux终端中同时编译和运行c++代码
- 在Linux for Windows上编译C++代码时出错
- 如何找到锁定Linux futex的C++行
- 在linux上调试巨大的C++项目
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- c++方法参数只能在linux的发布模式下自行更改
- 在Linux和C++中的Windows上,散列字符串值会产生不同的输出
- 操作系统 (Linux) 在使用 boost::asio::generic::raw_protocol::socket
- C++int via socket send():Linux/MacOS上TCP包中的different值
- Linux c++recvfrom()更改(销毁)[socket]文件描述符
- 在linux上接受时使用相同的SOCKET id
- Mac/IOS 是否使用与 Linux 内核相同的 sys/socket.h?
- Linux服务器,发送文件到windows客户端(Socket)
- Optimizing Linux Socket
- 在linux中调用socket.close之后,socket.read_some需要相当长的时间才能返回
- Linux上异步socket发送