博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于select()方法最大轮询数限制的更正
阅读量:4214 次
发布时间:2019-05-26

本文共 698 字,大约阅读时间需要 2 分钟。

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

转载地址:http://zqdmi.baihongyu.com/

你可能感兴趣的文章
【LKM】整合多个LKM为1个
查看>>
【Windows C++】调用powershell上传指定目录下所有文件
查看>>
Java图形界面中单选按钮JRadioButton和按钮Button事件处理
查看>>
小练习 - 排序:冒泡、选择、快排
查看>>
SparkStreaming 如何保证消费Kafka的数据不丢失不重复
查看>>
Spark Shuffle及其调优
查看>>
数据仓库分层
查看>>
常见数据结构-TrieTree/线段树/TreeSet
查看>>
Hive数据倾斜
查看>>
TopK问题
查看>>
Hive调优
查看>>
HQL排查数据倾斜
查看>>
DAG以及任务调度
查看>>
LeetCode——DFS
查看>>
MapReduce Task数目划分
查看>>
ZooKeeper分布式锁
查看>>
3126 Prime Path
查看>>
app自动化测试---ADBInterface驱动安装失败问题:
查看>>
RobotFramework+Eclipse安装步骤
查看>>
测试的分类
查看>>