`
xiaoZ5919
  • 浏览: 400973 次
  • 性别: Icon_minigender_1
  • 来自: 安平人@北京
博客专栏
Group-logo
Netty学习笔记
浏览量:72821
社区版块
存档分类
最新评论

Netty的Nio写优化

阅读更多

  今天又看了一遍boyan的《Nip trick and trip》,又有一些新的收获。比以前看地更深刻了。其中有一处写到Nio的写优化,当Nio的channel设置为nonblocking时,写操作不再阻塞,而是直接返回0,表示当时socket的写缓冲区已满不可写。通常的处理办法是返回本次loop并继续注册op_read或者op_write。这样会带来线程切换的开销,使当前select阻塞,直到有可写发生再次唤醒。Netty是怎么解决的?以前虽然看过Netty的代码但并没有深入到细节中去,看了boyanNetty采用writeSpinCount的介绍才深有感悟。好多知识都在细节里,就看我们对这个领域掌握地深不深,如果蜻蜓点水肯定发现了这些看似简单的代码的玄妙之处。话归正题,writeSpinCount如何解决这个问题的呢?类似自旋锁,还是看看Netty的代码吧,比较形象。

for (;;) {
                MessageEvent evt = channel.currentWriteEvent;
                SendBuffer buf;
                if (evt == null) {
                    if ((channel.currentWriteEvent = evt = writeBuffer.poll()) == null) {
                       //写事件队列为空,此时应该去除op_write
                        removeOpWrite = true;
                        channel.writeSuspended = false;
                        break;
                    }

                    channel.currentWriteBuffer = buf = sendBufferPool.acquire(evt.getMessage());
                } else {
                    buf = channel.currentWriteBuffer;
                }

                ChannelFuture future = evt.getFuture();
                try {
                    long localWrittenBytes = 0;
                    for (int i = writeSpinCount; i > 0; i --) {//此处为writeSpinCount的解决方式
                       //向channel写数据,为了使其fileChannel的transferTo接口一致。这样从file写向socket时避免四次copy,sendfile的功能
                        localWrittenBytes = buf.transferTo(ch);
                        //写入的数据大于0,跳出本次循环,如为零则循环writeSpinCount,如再次期间localWrittenBytes>0,说明再次可写。
                        if (localWrittenBytes != 0) {
                            writtenBytes += localWrittenBytes;
                            break;
                        }
                        if (buf.finished()) {
                            break;
                        }
                    }

                    if (buf.finished()) {
                        // Successful write - proceed to the next message.
                        //完整地写完,则继续处理下一个消息
                        buf.release();
                        channel.currentWriteEvent = null;
                        channel.currentWriteBuffer = null;
                        evt = null;
                        buf = null;
                        future.setSuccess();
                    } else {
                        // Not written fully - perhaps the kernel buffer is full.
                        //没能完整地写完当前的message,则继续设置op_write,并跳出外层循环
                        addOpWrite = true;
                        channel.writeSuspended = true;

                        if (localWrittenBytes > 0) {
                            // Notify progress listeners if necessary.
                            future.setProgress(
                                    localWrittenBytes,
                                    buf.writtenBytes(), buf.totalBytes());
                        }
                        break;
                    }
                } catch (AsynchronousCloseException e) {
                    // Doesn't need a user attention - ignore.
                } catch (Throwable t) {
                    if (buf != null) {
                        buf.release();
                    }
                    channel.currentWriteEvent = null;
                    channel.currentWriteBuffer = null;
                    buf = null;
                    evt = null;
                    future.setFailure(t);
                    if (iothread) {
                        fireExceptionCaught(channel, t);
                    } else {
                        fireExceptionCaughtLater(channel, t);
                    }
                    if (t instanceof IOException) {
                        open = false;
                        close(channel, succeededFuture(channel));
                    }
                }
            }
            channel.inWriteNowLoop = false;

            // Initially, the following block was executed after releasing
            // the writeLock, but there was a race condition, and it has to be
            // executed before releasing the writeLock:
            //
            //     https://issues.jboss.org/browse/NETTY-410
            //
            if (open) {
                if (addOpWrite) {
                    setOpWrite(channel);
                } else if (removeOpWrite) {
                    clearOpWrite(channel);
                }
            }
        }

 

0
0
分享到:
评论
1 楼 zkx1217 2013-09-11  
哥啊,是NIO trick and trip 不是Nip trick and trip 

相关推荐

    jvm、nio、netty优化使用.txt

    Netty是一个NIO客户端服务器框架,可以快速轻松地开发网络应用程序,例如协议服务器和客户端。它极大地简化和简化了TCP和UDP套接字服务器等网络编程。 “快速简便”并不意味着最终的应用程序将遭受可维护性或性能...

    Netty网络编程视频教程

    近百节视频详细讲解,需要的小伙伴...5. NIO vs BIO 二. Netty 入门 1. 概述 2. Hello World 3. 组件 4. 双向通信 三. Netty 进阶 1. 粘包与半包 2. 协议设计与解析 3. 聊天室案例 四. 优化与源码 1. 优化 2. 源码分析

    Netty4.1.101稳定版本

     简单地说Netty封装了JDK的NIO,不用再写一大堆复杂的代码。既然代替了原生的NIO,肯定有比它好的理由,主要有如下几点:  1.Netty底层IO模型可以随意切换,比如可以从NIO切换到BIO,但一般很少会这么做。  2....

    Netty教程源码资料

    本资源含Netty全系列教程:如NIO、Netty入门、Netty进阶、Netty优化与源码; 分为讲义、大纲、代码三个部分。

    互联网大厂Netty网络编程开发三部曲-Netty优化+进阶+ 入门 Netty协议设计与解析

    (1)\day01;目录中文件数:25个 ...├─(11) 第1章_11_bytebuffer-分散读集中写.mp4 ├─(12) 第1章_12_bytebuffer-黏包半包分析.mp4 ├─(13) 第1章_13_bytebuffer-黏包半包解析.mp4 ├─(14) 第1章_14_f

    基于Netty框架的demo项目

    项目中,你可以清晰地看到BIO与NIO模型在Netty中的灵活运用,如何通过Netty的高性能特性来优化网络通信。此外,demo还详细展示了如何通过自定义编解码器处理网络通信中的数据编解码问题,以及如何利用心跳机制确保...

    netty4.0.x安装包

    多种数据访Netty自带的拆包解包,异常检测等机制让你从NIO的繁重细节中脱离出来,让你只需要关心业务逻辑 Netty解决了JDK的很多包括空轮询在内的bug Netty底层对线程,selector做了很多细小的优化,精心设计的...

    netty+spring服务端-omen-1.3

    omen-1.3 自己基于netty开发的服务端,支持spring配置服务器启动模式:http,tcp,websocket等,并支持NIO和OIO方式,项目已应用于生产,可以通过jar形式加入其它项目,业务类实现业务service,启动不依赖于其他应用...

    JAVA版基于netty的物联网高并发智能网关.rar

    java 1.4起,jdk支持了NIO(NEW IO),因NIO(os nonblocking)的非阻塞式工作方式,让应用服务器可以极大的优化线程模型,相比传统的阻塞式IO线程和链路一对一的模式,NIO只需少量的线程即可处理所有的链路,这对广大的...

    Netty——基本使用介绍

    在对通信模型有了基本的认识时,学习到的仅仅是一个模型,如果想把这些真正的用于实际工作中,那么还需要不断的完善、扩展和优化。比如经典的TCP读包写包问题,或者是数据接收的大小,实际...Netty是最流行的NIO框架,

    java实现校园一卡通源码-netty4-samples:netty4-样本

    NIO来实现的,对NIO进行了非常多的优化,因此深受广大开发者尤其是一线大厂开发者的青睐。 作为一个Java开发人员,如果没有研究过Netty,那么你对Java语言的使用和理解仅仅停留在表面,会点SSH,写几个MVC,访问...

    Netty-Notes:Netty原始分析,包含各种流程图-源码包

    NIO,为Reactor模式,非附加I / O。类似点菜,等待被叫,先接收连接,当有请求时在去处理; AIO,为Procator模式,异步I / O。类似包厢,接收连接,当数据处理好通过替代给程序。 绑定端口最终会调用dobind()...

    百度地图毕业设计源码-Java-Notes:2020Java快速成长学习路线,从0到1的过程,打破你知识的盲区,渐渐爱上Java,我想对还是小

    JVM优化 数据结构算法 多线程高级 MINA Netty NIO 软件项目,代码管理 Markdown Maven SVN Git 码云 github Jenkins Sonar Part2: 热门框架&分布式服务 热门技术框架 Spring SpringMVC Mybatis Mybatis-Plus Spirng...

    my三期教程.txt

    并发编程与多线程 性能优化之JVM参数调优 性能优化之垃圾回收机制算法分析 性能优化之MySQL数据库性能优化 Mycat、sharding-jdbc 性能优化之Tomcat性能优化 设计模式与实战操作 ... Netty、NIO、序列化

    沙发螺栓:SOFABolt是基于Netty的轻便,易于使用和高性能的远程处理框架

    为了让Java程序员能够将更多的能源投入到基于网络通信的业务逻辑实现上,而不是过多的纠结于网络整合NIO的实现以及处理难以调试的网络问题,净值应运而生。为了让中间件开发者能将更多的能量放在产品功能特性上实现...

    eyer-rpc:一个几乎零依赖的RPC,通信网络抛弃了笨重了netty使用了原生的javaNIO包四个类完成封装。最新重构和优化在---->

    一个简单的服务 (单机版) public class TestServer { public static void main(String[] args) throws IOException { NioConfig.registered(new KryoSerializer()); final ServerHandler handler = new ...

    Java思维导图xmind文件+导出图片

    Netty 高性能NIO框架 IO 的基本概念、NIO、AIO、BIO深入分析 NIO的核心设计思想 Netty产生的背景及应用场景分析 基于Netty实现的高性能IM聊天 基于Netty实现Dubbo多协议通信支持 Netty无锁化串行设计及高并发...

    深入理解Java源码:提升技术功底,深度掌握技术框架,快速定位线上问题

    Netty的高并发高性能架构设计精髓包括:主从Reactor线程模型,NIO多路复用非阻塞,无锁串行化设计思想,支持高性能序列化协议,零拷贝(直接内存的使用),ByteBuf内存池设计,灵活的TCP参数配置能力,以及并发优化...

    Android代码-sofa-bolt

    为了让 Java 程序员能将更多的精力放在基于网络通信的业务逻辑实现上,而不是过多的纠结于网络底层 NIO 的实现以及处理难以调试的网络问题,Netty 应运而生。 为了让中间件开发者能将更多的精力放在产品功能特性实现...

    bolt:蚂蚁金融服务集团的SOFABolt基于Netty实现的网络通信框架源码阅读之旅途!-源码网

    SOFABolt是Ant Ant金融服务集团开发的一套基于Netty实现的网络通信框架。 为了让Java程序员能够将更多的能源投入到基于网络通信的业务逻辑实现上,而不是过多的纠结于网络插入NIO的实现以及处理难以调试的网络问题,...

Global site tag (gtag.js) - Google Analytics