C++基于reactor的服务器百万并发如何实现


这篇文章主要介绍“C++基于reactor的服务器百万并发如何实现”,在日常操作中,相信很多人在C++基于reactor的服务器百万并发如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++基于reactor的服务器百万并发如何实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!并发量和承载的概念
并发量:一个服务器能同时承载客户端的数量
承载:客户端发送给服务器的请求(http或tcp等)在200ms内可以返回正确的结果结构体代码主要构建的结构如图所示
链表结构,每个eventblock结点,包括一个ntyevent数组,数组中存储fd初始化fd 上树、下树代码回调函数代码的书写
注意看recv_cb的回调函数中,recv之后,立马下树,然后又重新初始化fd,上树。这样做的目的是因为代码逻辑是recv收到数据后,立即原样send,所以需要对fd的属性进行更改,需要重新初始化赋值,然后上树链表的初始化与销毁找到fd应在链表数组中存储的位置并返回上树,并初始化链表数组上对应的fdepollwaitmain函数;此服务器代码开设了100个监听的端口,目的是因为客户端测试程序也是运行在虚拟机的Ubuntu上,通过开三台来充当客户端来进行测试。有因为一台Ubuntu最多有6w个端口,3台有18w端口。如果服务器只开设一个监听端口,则最多有18w端口。因此要达到100w并发则应多开设端口完整服务器代码展示reactor的写法感觉和epoll的普通写法,感觉差别就是reactor多了个回调函数,具体没啥优点?
epoll是针对io的管理。 reactor对针对事件的管理
不同的事件,针对不同的回调函数
性能上没啥差异,但提高了代码的复用性。具体需要自己慢慢体会体会,呜呜呜呜还有体会到,编程思想不过关。限制是fd的限制,系统默认fd最多有1024个,按照一个连接一个fd的做法,那就需要百万个fd。这里有免费云主机域名两种修改方法,一是使用ulimit -n命令,这个命令重启就失效;二是修改/etc/security/limits.conf文件,这是永久有效的,重启或sysctl -p生效。hard是硬限制,不能超过该值,soft是软限制,可以超过,超过后就开始回收。
这个文件里还有一些其他的参数可以了解一下,fs.file_max是fd可取到的最大值,注意与fd最大个数区分。
突破这两个限制后,还会遇到一个问题,客户端会报错:connection timedout。连接超时,即是客户端未收到服务器对客户端connect()的回应包。这里有两种可能,客户端为收到服务器的包或是服务器未收到客户端的connect包。事实上,是因为系统有个防火墙iotables,这个防火墙是基于网卡和协议栈之间的过滤机制netfilter实现的。netfilter当连接数到达一定程度时,会不允许再向外发送connect包。修改也是通过/etc/security/limits.conf文件突破这些限制,就可以实现百万并发了。
这里再介绍/etc/security/limits.conf中几个参数
net.ipv4.tcp_mem=262144 524288 786432是所有TCP协议栈所占空间的大小,单位是页(4KB)。介绍一下后面写的三个值,当所占空间大小超过第二个值时,系统会进行优化,此时如果占用空间降到第一个值以下,不再优化,第三个值是上限,不允许分配超过比大小的空间。
net.ipv4.tcp_wmem=2048 2048 4096是每个socket对应的写缓冲区大小,三个值分别是最小值、默认值、最大值,单位是B。
net.ipv4.tcp_rmem=2048 2048 4096是每个socket对应的读缓冲区大小,三个值分别是最小值、默认值、最大值,单位是B。
做百万并发时,如果内存不大,可以相应调小。在实际应用中,如果传输大文件,调大;如果传输的都是字符,调小,就可以接收更多fd。到此,关于“C++基于reactor的服务器百万并发如何实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: 如何使用ASP.Net WebAPI构建REST服务

这篇文章主要介绍了如何使用ASP.NetWebAPI构建REST服务的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用ASP.NetWebAPI构建REST服务文章都会有所收获,下面我们一起来看看吧。首先创建一个Asp.Net…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 03/17 17:21
Next 03/17 17:26

相关推荐