关于select()方法最大轮询数限制的更正
程序员文章站
2022-05-06 15:09:00
...
昨日和公司同事分享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
上一篇: 最高的境界是什么
下一篇: 揣测为何会两岸猿声啼不住