`
bjmike
  • 浏览: 283010 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

影响java nio框架性能的因数 (转)

阅读更多

最近打算用kilim做一个rpc框架, kilim有自己的nio框架 而在业界有强劲的netty和mina。
所以问了一下kilim的作者,他的回答说 因为底层用的都是java nio的api,所以留给nio框架最
主要的问题是这2点
(i) 为了处理很多socket连接和优化吞吐量,会导致了大量的线程切换。
Amount of thread switching done to handle n numbers of sockets and 
optimizing for throughput.

(ii) 有很多次的selector的中断和调用,唤醒seletor是很费资源的操作。

所以能做的优化有以下几点:
1,对read writer process操作分别作轻量级的scheduler,基于actor。
2,有个trick,就是read或者write操作时候,但没有读满或者写完的情况下,并不是
立即返回并再次注册channel到selector,而是再尝试若干次(3次),再返回并注册到
selector。在mina中也有同样的处理。不同之处在于kilim会yield的当前task,而mina为
了避免线程切换,只是做了简单的while循环。但目的都是减少线程切换和避免多次注册
selector。
mina 处理代码
Java代码
for (int i = WRITE_SPIN_COUNT; i > 0; i --)  

    localWrittenBytes = ch.write(buf.buf()); 
    if (localWrittenBytes != 0 || !buf.hasRemaining())  
    { 
       break; 
     } 



kilim nio的处理
Java代码
while (remaining > 0)  

    if (n == 0)  
    { 
        yieldCount++; 
       if (yieldCount < YIELD_COUNT)  
       { 
          Task.yield(); // don't go back to selector yet. 
       } else  
       { 
          pauseUntilWritable(); 
          yieldCount = 0; 
      } 
  } 
  n = ch.write(buf); 
  remaining -= n; 


除了上面说的2个因素以外,还有有哪些因素会影响nio的性能?

原文如下:
I have not tested netty, but here's my experience. All NIO frameworks, 
Kilim included, are comparable because they use the same underlying 
NIO API. The difference in performance _may_ stem from the following 
two  sources:

(i) Amount of thread switching done to handle n numbers of sockets and 
optimizing for throughput.

(ii) Number of times the selector is interrupted and invoked. Waking 
up the selector is an expensive operation.

The first one is entirely up to the user of the Kilim NIO library. A 
typical server request consists of one or more reads to accumulate the 
frame, processing the packet, and one or more writes to write a packet 
to the socket. One can split up this work between multiple schedulers 
if you wish. By default, all reading and writing is done outside of 
the selector's thread.  Which brings me to the next point.

I have optimized the access to the selector, by avoiding using it as 
much as possible. If a socket read or write is unable to transfer any 
bytes, then the task simply yields. Other runnable tasks get a chance 
to run. When the task is subsequently resumed, it retries the 
operation. This goes on for a fixed number of times (3), and if it 
still fails, it sends a message to the selector thread to wake it up 
whenever the socket is ready. See the comments on kilim.nio.EndPoint.

Please keep us posted about your netty experiments.
分享到:
评论

相关推荐

    Java NIO通信框架在电信领域的实践

    综上所述,Java NIO框架不仅解决了电信业务应用软件在高性能和高并发场景下的技术难题,还促进了电信软件架构的不断演进和发展。未来,随着5G和物联网等新兴技术的崛起,Java NIO框架及其衍生技术将继续在电信领域...

    java NIO和java并发编程的书籍

    java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...

    JavaNIO chm帮助文档

    Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...

    java NIO技巧及原理

    Java NIO相对于IO,在处理高并发、大数据量的场景下表现出更好的性能。IO模型更适合于顺序读写和少量连接,而NIO则更适合于高并发、短连接的场景。 **NIO技巧与陷阱:** 1. **缓冲区管理**:合理使用缓冲区可以提高...

    Java NIO英文高清原版

    Netty是一个基于NIO的高性能、异步事件驱动的网络应用框架,它简化了网络编程,广泛应用于服务器端应用开发。 NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。以下是对这些核心概念的...

    java NIO.zip

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统的I/O模型的新技术。自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发...

    Java_NIO框架Netty教程

    资源名称:Java_NIO框架Netty教程资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    Ioserver java Nio socket 框架

    Ioserver java Nio socket 框架 是个不错的NIO 通讯框架,本来想学习mina框架,看了看mina的源码太头痛,本人觉得看懂了Ioserver 再看mina的框架,想多的学习 java NIO 的也可以下载 看看,很值得学习啊!!!

    Java NIO与IO性能对比分析.pdf

    本文将分析Java NIO与Java IO在性能上的对比,并尝试找出性能差异的原因,以及探讨哪种编程模型更适合高并发的应用场景。 Java IO模型是一种阻塞型I/O模型,在数据的读写过程中,如果线程在等待数据,将会一直被挂...

    基于Groovy的NIO框架,仅供学习Java NIO使用。.zip

    总的来说,"基于Groovy的NIO框架"提供了一种学习和实践Java NIO技术的新途径,尤其是对于那些熟悉Groovy的开发者来说,他们可以利用Groovy的便利性来优化和简化NIO应用的开发。通过深入理解并应用上述知识点,可以...

    Java NIO 中文 Java NIO 中文 Java NIO 中文文档

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...

    java nio与io性能测试

    本文将深入探讨Java NIO与IO的性能测试,并通过代码实例来展示它们之间的差异。 首先,我们来看传统的Java IO模型。IO模型基于流,数据是从输入流到输出流的单向传输。例如,`FileInputStream`和`FileOutputStream`...

    java NIO异步框架

    Java NIO(New IO)是Java 2平台标准版(J2SE 1.4)引入的一个新特性,它为Java应用程序提供了非阻塞I/O操作的能力,极大地提升了I/O性能,并降低了多线程编程的复杂性。NIO与传统的IO(-blocking I/O)相比,最大的...

    java NIO 视频教程

    Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...

    高手使用Java NIO编写高性能的服务器

    Java NIO(New IO)是Java 1.4版本引入的一个新特性,它为Java程序提供了非阻塞I/O操作的能力,极大地提升了Java在处理网络通信和文件读写时的性能。NIO与传统的IO( Blocking IO)模型相比,最大的区别在于其非阻塞...

    java nio 包读取超大数据文件

    相较于传统的Java IO,NIO具有更高的性能和更丰富的功能,尤其适合处理大文件或高并发场景。 #### 二、Java NIO关键组件 Java NIO的核心组件包括: - **Channels**:用于表示IO源或目标的一个连接点。 - **Buffers*...

    Java NIO框架Netty教程.pdf

    ### Java NIO框架Netty教程知识点解析 #### 一、Netty框架简介 Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器与客户端。它提供了对多种协议的支持,如HTTP、WebSocket、...

    java NIO实例

    传统的Java I/O模型(BIO)在处理大量并发连接时效率较低,因为它基于阻塞模式,一个线程只能处理一个连接,而NIO则允许单个线程同时处理多个连接,大大提高了性能。 `NIOServer.java`和`NIOClient.java`这两个文件...

    Java NIO Socket基本

    NIO在实际开发中常用于构建高性能的网络服务器,如Tomcat、Netty等框架就大量使用了NIO技术。通过合理使用NIO,开发者可以编写出更加高效、可扩展的服务端代码。了解和掌握Java NIO对于提升Java程序员在服务器端编程...

Global site tag (gtag.js) - Google Analytics