昨日和公司同事分享Netty入门的时候,讨论了如下两个问题:
1. Select的最大轮询数限制是1024
2. 当超过1024以后还能注册吗? 或者如何突破1024的限制
我昨天又查阅了一番文档,select最大轮询数不一定是1024,而是FD_SET这个参数,如FD_SET设置为128,则最大轮询数为128。一般为FD_SET的值设置为1024,为什么不设更大的值,应该是处于性能的考虑,轮询数越多,轮询一次的时间也就越长。
如何突破FD_SET的限制?
有两种方式可以突破FD_SET的限制
1.网上介绍的。修改/sys/types.h头文件中FD_SET中的值并重新编译内核。这并不是一个好方法,假设我们注册了10240个连接,那就意味了我们的一次轮询时间要增加好多。
2.还有更好的办法?现在已经是多核时代了,分而治之+负载均衡将连接注册在多个select上,并发select不仅能突破限制而且提高了性能。
有点map-reduce的思想。事实上主流的开源软件都是这样解决的,象tomcat,netty他会有一个acceptor线程和多个poller线程。
3.
这时还有一个问题当一个poller上的最大轮询数超过1024了还能注册吗?答案是肯定的。JDK的WindowsSelectorImpl是同样采用分而治之的多线程轮询策略,当少于1024时只开一个线程轮询,当超过1024时,会再开一个线程轮询超过的这部分。当然当轮询数减少时,也会适当的调整线程数.假如注册的连接数为2000时,线程的使用情况如下图
thread 1 thread 2
0 - 1023 1024-2000
分享到:
相关推荐
S7-200SMART PLC进行MODBUS通信轮询卡死时重新开启轮询的具体方法演示
本程序采用文件的形式,按照设定轮询时间对数据进行轮询显示
S7-200SMART PLC进行MODBUS通信轮询时正常轮询读操作,对写操作进行插队处理的具体方法演示
S7-200SMART通过循环移位实现MODBUS RTU轮询的具体方法示例
S7-200 SMART MODBUS轮询程序的示例及具体使用方法的解释说明
主要介绍了c# 实现轮询算法实例代码的相关资料,这里附有实例代码,具有一定的参考价值,需要的朋友可以参考下
图片轮询查看
单片机 程序架构 时间片轮询.
松下plc 轮询 标准 程序 程式,基于松下plc做的485通讯和几台其他设备通信
S7-200SMART_modbusRTU轮询程序(读轮询+写优先)附使用说明
init.c轮询注册事件init.c轮询注册事件init.c轮询注册事件init.c轮询注册事件
Ajax轮询,Ajax长轮询和websocket.docx
8通道输入,1通道输出,采取请求应答方式,对8通道输入进行仲裁,采用公平轮询机制;
zencart不跳转账号轮询
ViewPlipper常用方法: setInAnimation:设置View进入屏幕时候使用的动画 setOutAnimation:设置View退出屏幕时候使用的动画 showNext:调用该函数来显示ViewFlipper里面的下一个View showPrevious:调用该函数来显示...
本文实例为大家分享了Android实现轮询的方式,供大家参考,具体内容如下 1.通过rxjava实现(代码中使用了Lambda表达式) private static final int PERIOD = 10 * 1000; private static final int DELAY = 100; ...
S7-200SMART标准化程序(含MODBUS RTU轮询+可重复调用子程序+注释说明使用方法)
单片机中断方式与轮询方式 单片机中断方式与轮询方式
基于TIA PORTAL V15.0的MODBUS RTU轮询全局库FB,调用该FB之后,不需要再写大量的轮询程序。
vb6 modbus 进行轮询读取 接收数据长度正确后再轮询 并将接收数据依次写入三个textbox中