muduo限制服务器的最大并发数

本文讨论了为何需要限制服务器的最大并发连接数,以防文件描述符耗尽导致CPU利用率升高的问题。muduo通过预先准备空闲描述符,在达到上限时关闭并重新分配,实现优雅地拒接新连接。在muduo的echoserver中,可以通过设置计数器和最大连接数限制来实现这一功能。测试显示,当超出限制时,服务器会自动断开超出的连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务器的文件描述符数量有限,因此需要一些手段来限制服务器的最大并发连接数。

需要这么做的原因是:

考虑一种情况:

某个时刻服务器文件描述符已经用完了,此时再来一个连接,将无法用描述符表示这个连接,也就无法关闭这个连接。在Reactor模式下,POLLIN事件就会一直被触发(level trigger模式),就会进入busy loop,cpu 利用率将到达100%。

因此有必要设计一个策略,当服务器并发数目到达上限时,主动的拒接连接。

muduo使用的办法很巧妙:

1.准备一个空闲的描述符
2.当遇到上述情况时,先close掉这个空闲的文件描述符,这样就多出一个可用描述符
3.接收新的连接后就有文件描述符来表示这个连接了。
4.此时close掉这个描述符,就关掉了客户端连接
5.再次打开这个空闲的描述符。

如何在muduo中限制并发连接数,以echoserver为例,只需简单设置一个计数器和最大连接数限制即可。

diff examples/simple/echo/echo.h examples/maxconnection/echo.h -u
--- examples/simple/echo/echo.h 2016-09-29 21:46:12.946963506 +0800
+++ examples/maxconnection/echo.h   2016-06-21 16:09:03.366311441 +0800
@@ -6,20 +6,23 @@
 // RFC 862
 class EchoServer
 {
-    public:
-   EchoServer(muduo::net::EventLoop* loop,
-       const muduo::net::InetAddress& listenAddr);
+ public:
+  EchoServer(muduo::net::EventLoop* loop,
+             const muduo::net::InetAddress& listenAddr,
+             int maxConnections);

-   void start();  // calls server_.start();
+  void start();

-    private:
-   void onConnection(const muduo::net::TcpConnectionPtr& conn);
+ private:
+  void onConnection(const muduo::net::TcpConnectionPtr& conn);

-   void onMessage(const muduo::net::TcpConnectionPtr& conn,
-       muduo::net::Buffer* buf,
-       muduo::Timestamp time);
+  void onMessage(const muduo::net::TcpConnectionPtr& conn,
+                 muduo::net::Buffer* buf,
+                 muduo::Timestamp time);

-   muduo::net::TcpServer server_;
+  muduo::net::TcpServer server_;
+  int numConnected_; // should be atomic_int
+  const int kMaxConnections_;
 };

 #endif  // MUDUO_EXAMPLES_SIMPLE_ECHO_ECHO_H

测试结果如下:

./maxconnection_echo 3 #设置最大并发数3

在终端用nc工具连接测试,结果如下,当超出限制后,将自动踢掉连接:
这里写图片描述

参考:
Linux多线程 服务端编程 使用muduo C++ 网络库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值