关于select()方法最大轮询数限制的更正

阅读更多

 昨日和公司同事分享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
 
    

你可能感兴趣的:(关于select()方法最大轮询数限制的更正)