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

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 

相关推荐

    netty nio 技术文档

    ### Netty NIO技术文档知识点概述 #### 一、Netty与NIO的基本概念 - **Netty**:一个高性能的异步事件驱动框架,专为服务器端开发设计,简化了网络应用程序的开发过程。 - **NIO (New I/O)**:Java平台的一种新的...

    Java高并发编程代码(Netty NIO 实例)

    本实例将深入探讨Netty如何实现NIO在高并发场景下的优化和应用。 首先,让我们理解Java的NIO(Non-blocking I/O,非阻塞I/O)。传统的Java IO模型(BIO)是基于流(Stream)的,对每一个连接都需要一个线程来处理,当...

    jvm、nio、netty优化使用.txt

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

    NIO+Netty5视频教程与Netty源码剖析视频教程

    学习者将学习如何设计和实现自定义协议,以及如何利用Netty的灵活性和可扩展性来优化服务端和客户端的交互。此外,这部分还可能涉及负载均衡、服务发现、异常处理等高级话题,以帮助学员构建高可用、高并发的分布式...

    用netty实现文件传输

    - **零拷贝**:Netty 利用 NIO 的 FileChannel.transferTo 方法,实现了从文件到网络的直接传输,减少了数据拷贝的次数,提高了效率。 - **异步处理**:Netty 的非阻塞 I/O 允许在等待文件传输的同时处理其他任务...

    自己手写nio和netty,不建议下载

    NIO(Non-blocking Input/Output)是Java提供的一种...总之,NIO是一种改进的I/O模型,它提高了处理并发连接的能力,而Netty是建立在NIO之上的网络通信框架,提供了更高级别的抽象和优化,使得网络编程更为便捷高效。

    【项目实战】Netty源码剖析&NIO;+Netty5各种RPC架构实战演练三部曲视频教程(未加密)

    ### Netty源码剖析与NIO及Netty5各种RPC架构实战演练三部曲知识点解析 #### 一、Netty概述 Netty是一款基于Java NIO的高性能服务器端编程框架,用于快速开发可维护的网络应用程序。它简化了网络编程的复杂性,使...

    netty 新NIO框架 文档

    当处理如视频流等大数据量传输时,Netty提供了专门的机制来优化数据的读取和写入过程,确保高效率的同时减少资源占用。 #### 五、总结 Netty作为一个先进的网络框架,不仅解决了传统网络编程中的许多痛点,还提供了...

    BIO、NIO、AIO、Netty 、TCP全网最全解析!Netty中提供了哪些线程模型?

    本文将深入探讨BIO( Blocking I/O)、NIO(Non-blocking I/O)、AIO(Asynchronous I/O)以及Netty框架中的线程模型,并与TCP网络协议相结合,为您提供全网最全面的解析。 首先,让我们从基础开始,了解这些I/O...

    Java-NIO-Netty框架学习

    学习Netty,可以从基础的Socket编程开始,然后深入理解Java NIO的基本概念,接着熟悉Netty提供的各种组件和API,通过编写简单的服务端和客户端程序来实践。随着对Netty的理解加深,可以尝试实现更复杂的网络应用,如...

    用Netty实现NIO Socket聊天系统示例

    在本示例中,我们将深入探讨如何利用Netty实现一个基于NIO(非阻塞I/O)的Socket聊天系统。NIO是一种I/O模型,它允许Java程序在不阻塞线程的情况下处理多个输入/输出流,从而提高并发性能。 首先,Netty的核心组件...

    Socket 之 BIO、NIO、Netty 简单实现

    Netty基于NIO,但对NIO进行了优化和封装,提供了更高级别的API,使得编程更加简单。Netty的核心组件包括:Bootstrap(启动引导类)、ServerBootstrap(服务器启动引导类)、Channel(网络连接通道)、Pipeline(处理...

    NIO框架netty

    **NIO框架Netty详解** Netty是一款高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Netty源于Java NIO(Non-blocking I/O)技术,它提供了更高级别的抽象,使得开发者可以...

    NIO+Netty5视频教程2018

    此外,还可能探讨不同类型的RPC架构,如gRPC、Dubbo等,以及如何利用NIO和Netty的优势优化这些架构。 【标签】"java网络框架"表明本教程不仅涉及基础的NIO概念,还涵盖了Java平台上的高级网络编程框架。学习者将...

    BIO,NIO,AIO,Netty面试题.pdf

    ### BIO、NIO、AIO、Netty 面试题解析 #### 1. Java IO 基础概述 Java中的I/O操作是通过流(Stream)来实现的,所有的数据都...同时,了解这些概念也有助于开发者更好地利用Netty这样的框架来优化网络通信层的性能。

    java nio&netty系列之三netty网络模型代码以及简化版代码示例

    Java NIO(New IO)是Java 1.4版本引入的一种新的IO API,用来替代标准的Java IO API。NIO提供了非阻塞的I/O操作,可以提高在处理多个连接时的性能...结合源码阅读和实践,可以更深入地理解Netty的工作原理和优化技巧。

    跟闪电侠学Netty:Netty即时聊天实战与底层原理-book-netty.zip

    7. **Netty底层原理**:探讨Netty如何利用Java NIO实现异步非阻塞I/O,以及零拷贝技术的工作机制,帮助读者理解Netty的高效性。 8. **案例分析**:通过实际项目案例,展示Netty在实际场景中的应用,如P2P下载、...

    Netty In Action 中文版

    5. **性能优化**:讨论Netty在性能优化方面的策略,包括内存管理、零拷贝(Zero-Copy)技术、线程池配置等,帮助开发者实现高效且低延迟的应用。 6. **实战案例**:提供实际的示例和案例,帮助读者将理论知识应用到...

    Netty-讲义.zip

    这个“Netty 讲义.zip”压缩包包含了一系列关于 Netty 的学习资料,主要分为四个部分:入门、进阶、NIO 和优化与源码分析。 首先,我们来探讨 Netty 的入门知识。`Netty02-入门.md` 可能会涵盖以下内容:Netty 的...

Global site tag (gtag.js) - Google Analytics