2019独角兽企业重金招聘Python工程师标准>>>

今天测试netty,之前一直会出现阻塞,最后测试服务器所有线程挂起,最后无法正常工作,

  • ExecutionHandler,  使用了这玩意的,在网上翻来拂去的找,都一个莫子出来的,天朝咋都这样,希望转载别人的一定标注下地址啦,扯远了,使用了ExecutionHandler(有兴趣看看源码你会发现他对于读取数据流事件开的是true,写的话是false--默认),保证你提交的任务能够继续处理,worker线程返回,但是有个问题,他的pool参数,这里是用的MemoryAwareThreadPoolExecutor(长连接,业务复杂,就最好用这个咯,至于为什么,请看源码),他有两个重要参数 maxChannelMemorySize,  maxTotalMemorySize,,其他几个参数什么keepAliveTime, TimeUnit unit, keepAliveTime, TimeUnit unit, ObjectSizeEstimator objectSizeEstimator,这里就是问题的关键,当提交的任务超过maxTotalMemorySize,处理不过来,会根据你设置的线程工厂不断创建线程来处理,处理不过来,那么还是继续创建,直到你的cpu被搞死,worker线程也就阻塞了,应为无法添加任务,最后就完全挂起,在overfolw上面有个老外提问(韩国棒子,我还以为是天朝的,也有这个问题,但是貌似回答的都没有解决问题,没有找到答案,)为什么说这个呢,我想强调的是 ,大家找答案,实在不好搞,最好看源码,或则API,好继续正题,刚刚谈到线程挂起和挂起的原因,我是如下解决的,
  • Using an alternative task size estimation strategy
    Although the default implementation does its best to guess the size of an object of unknown type, it is always good idea to to use an alternative ObjectSizeEstimator implementation instead of the DefaultObjectSizeEstimator to avoid incorrect task size calculation, especially when:
    you are using MemoryAwareThreadPoolExecutor independently from ExecutionHandler,
    you are submitting a task whose type is not ChannelEventRunnable, or
    the message type of the MessageEvent in the ChannelEventRunnable is not ChannelBuffer.
    Here is an example that demonstrates how to implement an ObjectSizeEstimator which understands a user-defined object: public class MyRunnable implements Runnable {private final byte[] data;public MyRunnable(byte[] data) {this.data = data;}public void run() {// Process 'data' ..}}public class MyObjectSizeEstimator extends DefaultObjectSizeEstimator {@Overridepublic int estimateSize(Object o) {if (o instanceof MyRunnable) {return ((MyRunnable) o).data.length + 8;}return super.estimateSize(o);}}ThreadPoolExecutor pool = new MemoryAwareThreadPoolExecutor(16, 65536, 1048576, 30, TimeUnit.SECONDS,new MyObjectSizeEstimator(),Executors.defaultThreadFactory());pool.execute(new MyRunnable(data));

    在源码上(api也有)找到答案,根据你的业务,重写估算内存数目的策略,替换默认的估算策略(如果你的业务处理数据有缓存的策略话,建议 maxChannelMemorySize ,maxTotalMemorySize两个参数设置为0,即是不启用缓存限制,本身在实际项目中无法估计出队列的缓存大小,只有测试后才知道哦。如果启用了的话,超过了maxTotalMemorySize,将会导致业务线程阻塞,进而引发IOworker线程以及boss线程阻塞,导致程序崩掉!!!对与接受到来自c的数据,按理来讲应该缓存的,对于业务响应的数据,你可以直接write出去,没有必要缓存,本身底层也是有缓存的)我替换之后,测试10000(一万个,估计还可以加,因为笔记本限制怕出问题)个连接轮询发送数据,没有问题,没有阻塞,worker线程完全返回专注自己的事情,pool,接手业务逻辑处理,另外在工作站上测试200多个连接并行的发送死循环,毫无压力

  • 后记,今天测试连接数15000,呵呵毫无压力,

转载于:https://my.oschina.net/chenleijava/blog/95748

netty之ObjectSizeEstimator相关推荐

  1. 用netty实现zcool_Netty 如何玩转内存使用

    内存使用技巧的目标 目标: • 内存占用少(空间) • 应用速度快(时间) 对 Java 而言:减少 Full GC 的 STW(Stop the world)时间 Netty 内存使用技巧 - 减少 ...

  2. ktor框架用到了netty吗_教你如何构建异步服务器和客户端的 Kotlin 框架 Ktor

    Ktor 是一个使用 Kotlin 以最小的成本快速创建 Web 应用程序的框架. Ktor 是一个用于在连接系统(connected systems)中构建异步服务器和客户端的 Kotlin 框架. ...

  3. 实现分布式服务注册及简易的netty聊天

    现在很多地方都会用到zookeeper, 用到它的地方就是为了实现分布式.用到的场景就是服务注册,比如一个集群服务器,需要知道哪些服务器在线,哪些服务器不在线. ZK有一个功能,就是创建临时节点,当机 ...

  4. netty集成ssl完整参考指南(含完整源码)

    虽然我们在内部rpc通信中使用的是基于认证和报文头加密的方式实现安全性,但是有些时候仍然需要使用SSL加密,可能是因为对接的三方系统需要,也可能是由于open的考虑.中午特地测了下netty下集成ss ...

  5. Netty和JDK源码来看Netty的NIO和JDK的NIO有什么不同

    JDK底层提供了NIO实现,在Linux环境会调用内核epoll. 但是Netty通过JNI的方式提供了Native Socket Transport,为什么Netty要自己搞一套NIO呢? 这篇文章 ...

  6. 仿qq左滑删除listview_Java基于Swing和Netty仿QQ界面聊天小项目

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 来源:b ...

  7. Netty - ByteBuf

    2019独角兽企业重金招聘Python工程师标准>>> 1.ByteBuf类 - Netty的数据容器 ByteBuf维护了两个不同的索引: readerIndex:用于读取 wri ...

  8. Netty 之 Zero-copy 的实现(下)

    上一篇说到了 CompositeByteBuf ,这一篇接着上篇的讲下去. FileRegion 让我们先看一个Netty官方的example // netty-netty-4.1.16.Final\ ...

  9. Netty 粘包 拆包 编码 解码 序列化 介绍

    目录: 粘包 & 拆包及解决方案 ByteToMessageDecoder 基于长度编解码器 基于分割符的编解码器 google 的 Protobuf 序列化介绍 其他的 前言 Netty 作 ...

最新文章

  1. 苹果开源Swift底层非阻塞I/O框架SwiftNIO
  2. Qt实现FlatUI样式(开源)
  3. 最新综述:对话式检索数据集汇总
  4. JAVA——关闭ServerSocket
  5. linux系统安全详解
  6. java 几个实用的小工具
  7. session和cache的区别
  8. Android 4 学习(19):Services
  9. maven tomcat插件_Maven技术01
  10. Makefile:GCC CFLAGS变量和LDFLAGS变量
  11. 前端技术周刊 2018-08-06:ES Module
  12. Item 10.const成员函数 (Meaning of a Const Member Function)
  13. 偏差平方和说明什么_什么是平方误差和均方误差
  14. 使用MetaHuman Creator 塑造你心中的人物
  15. 华为外包测试2年,不甘被替换,168天的学习转岗成正式员工
  16. Blizzard的MPQ文件格式搜索算法
  17. 三循环流水灯电路的原理
  18. 【毕业设计】基于STM32的自动加油站加油系统 -物联网 单片机 嵌入式
  19. SMB2协议特性之oplock与lease(下)
  20. a标签,相对地址,绝对地址,锚点技术

热门文章

  1. Solarium简易使用
  2. [Android Pro] AndroidX重构和映射
  3. Vue实现左右菜单联动实现
  4. iOS开发之UIWebView
  5. javascript客户端检测技术
  6. Oracle技术之和分区表相关的一点总结(三)
  7. XP,2003下使用route命令增加永久路由(静态路由)
  8. mysql数据库从删库到跑路之mysql完整性约束
  9. HTTP长连接和短连接以及推送服务原理(转)
  10. Spring+Dubbo+Zookeeper简单框架与使用