欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于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