最近的工作(mina vs. yanf4j)

  最近工作上是在处理一个线程安全的问题,如何保证对某个资源的访问是独占的,不会有并发的隐患。在此过程中接了checkthread,一个线程安全的静态分析工具,通过annotation标记在编译期检查可能的并发隐患,提供了一个eclipse插件,有兴趣可以看看他的 example。这个东西有个最不好的地方就是要依赖他的自定义annotation,如果不介意的话还是不错的选择,一些常见的隐患都能够标示出来。
    另外就是去了解了下netty3,jboss的子项目,netty2和mina作者的另一个作品,关注它是因为在他的benchmark中,netty3的表现很优秀,可以看这篇报告《Performance comparision between java nio framework》。大概看了下他的设计思路,其实与mina并无多大区别,不过使用了一些有意思的trick,例如对于write的处理,一般的nio框架都是放入一个队列,然后注册写事件(队列为空的时候),等待写,写通常也是单线程去写。而netty3做了一个优化,发送消息时同样有一个队列,在放入队列后判断当前是否正在写循环中,如果正在写,那么就注册一个WriteTask唤醒selector等待写;如果没有,那么发送线程立即就去执行这个写操作,这里的一个好处是少了两个开销:注册事件等待触发以及线程切换。Selector.wakeup的操作是比较昂贵的,netty3也做了优化。更多东西等待探索。

   山寨nio框架yanf4j已经挺久没有做出任何改进,这次索性将很多过去考虑不成熟、实践中证明不必要的代码删除和简化,然后做了个与mina 2.0 -M5的性能对比,采用的netty3作者的benchmark源码,yanf4j的Echo Server如下:

Echo Server
import java.nio.ByteBuffer;

import org.jboss.netty.benchmark.echo.Constant;

import com.google.code.yanf4j.config.Configuration;
import com.google.code.yanf4j.nio.Session;
import com.google.code.yanf4j.nio.TCPController;
import com.google.code.yanf4j.nio.impl.HandlerAdapter;

public class Yanf4j {

    public static void main(String[] args) throws Exception {
        boolean threadPoolDisabled = args.length > 0
                && args[0].equals("nothreadpool");
        Configuration configuration = new Configuration();
        configuration.setCheckSessionTimeoutInterval(0);
        configuration.setSessionIdleTimeout(0);
        configuration.setTcpNoDelay(true);
        configuration.setReadThreadCount(Runtime.getRuntime()
                .availableProcessors());
        configuration.setPort(Constant.PORT);
        configuration
                .setSessionReadBufferSize(Constant.INITIAL_READ_BUFFER_SIZE);
        TCPController controller = new TCPController(configuration);
        controller.setHandler(new EchoHandler());
        if (!threadPoolDisabled) {
            controller
                    .setDispatchMessageThreadPoolSize(Constant.THREAD_POOL_SIZE);
        }

        controller.start();
        System.out.println("Yanf4j EchoServer is ready to serve at port "
                + Constant.PORT + ".");
        System.out
                .println("Enter 'ant benchmark' on the client side to begin.");
        System.out.println("Thread pool: "
                + (threadPoolDisabled ? "DISABLED" : "ENABLED"));
    }
    static class EchoHandler extends HandlerAdapter {
        @Override
        public void onReceive(final Session session, final Object msg) {
            session.send(((ByteBuffer) msg).duplicate());
        }
        @Override
        public void onException(Session session, Throwable t) {
            session.close();
        }

    }
}

   最后的分析报表,可以看到yanf4j的性能与mina2的性能相近,不过mina在内存使用上非常狠。此外,Xmemcached 1.1.3 将采用最新的yanf4j 0.7.0。

(横坐标是并发连接数,纵坐标是吞吐量,单位为M/s,测试JDK为1.6.4,具体硬件环境不再详细列出,与xmemcached的benchmark同)

四张图分别是在消息长度为64、256、1024、4096字节下的对比。

文章转自庄周梦蝶  ,原文发布时间2009-06-26

时间: 2024-08-21 19:48:45

最近的工作(mina vs. yanf4j)的相关文章

yanf4j 1.0-stable的一个压测报告

    采用的是jboss netty的benchmark,环境是两台linux机器,都是4核16G内存以及2.6内核,网络环境是公司内网,带宽是1Gbps,JDK1.6.0_07.对比的是mina 2.0M6和yanf4j 1.0-stable,两者都在压到16K,5000并发的时候客户端退出,因此后面给出的图有个16K的在5000并发为0,事实上只是几个连接失败,但是benchmark client就忽略了这个数据.实际过程还测试了1万并发连接的情况,但是由于测试客户端很容易退出,因此最后还

yanf4j引入了客户端非阻塞API

yanf4j发布一个0.50-beta2版本,这个版本最重要的改进就是引入了客户端 连接非阻塞API,主要最近的工作要用到,所以添加了.两个核心类 TCPConnectorController和UDPConnectorController分别用于TCP和UDP的客户端 连接控制.例如,现在的UDP echo client可以写成: //客户端echo handler class EchoClientHandler extends HandlerAdapter { public void onRe

Apache Mina通信框架架构与应用

Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于 TCP/IP.UDP/IP协议栈的通信框架(当然,也可以提供 JAVA 对象的序列化服务.虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能.高扩展性的网络通信应用,Mina 提供了事件驱动.异步(Mina 的异步 IO 默认使用的是 JAVA NIO 作为底层支持)操作的编程模型.从官网文档"MINA based Application Architecture"中可以看到Mina作为一

Mina 2 编码解码协议 及 已经实现通信的完整代码

使用mina2通信的完整代码朋友们可以去http://download.csdn.net/detail/u013378306/8756861下载 下面只对编解码协议进行解释 package lhy.charest; import java.nio.ByteOrder; import java.nio.charset.Charset; import lhy.client_domain.MsgPack; import org.apache.mina.core.buffer.IoBuffer; imp

MINA 快速入门

Apache MINA 是一个网络应用的框架,可以帮助用户开发的高性能.高扩展性的网络应用程序.它通过 Java NIO 提供了一个抽象的事件驱动的异步 API 用在不同传输协议上,比如 TCP/IP 和 UDP/IP 等. 本教程介绍了如何构建基于 MINA 的应用的过程.这个教程介绍的是构建一个 Time Server(时间服务器). 本教程需要以下先决条件: MINA 2.0 + JDK 1.5 + SLF4J 1.3.0 + Log4J 1.2 用户:slf4j-api.jar.slf4

mina的编码和解码以及断包的处理,发送自定义协议,仿qq聊天,发送xml或json

最近一段时间以来,mina很火,和移动开发一样,异常的火爆.前面写了几篇移动开发的文章,都还不错,你们的鼓励就是我最大的动力.好了,废话少说.我们来看下tcp通讯吧. tcp通讯对于java来说是很简单的.就是socket,也就是大家常说的套接字.大家不要把它看的很难.说白了tcp通讯其实就是数据流的读写.一条输入流,一条输出流.分别复杂发消息和接收消息. 明白了这些,ok,我们来看看我写的例子吧.先看服务器端的测试类的源码: package com.minaqq.test; import co

一名3年工作经验的程序员应该具备的技能

细读本文需要6分钟 与你共勉 背景介绍 LZ坐标杭州,13届本科毕业,算上年前在阿里巴巴B2B事业部的面试,一共有面试了有6家公司(因为LZ不想请假,因此只是每个晚上去其他公司面试,所以面试的公司比较少),其中成功的有4家,另外两家失败的原因在于: 1.阿里巴巴B2B事业部的面试,两轮技术面试都过了,最后一轮面试是对方的主管,由于听说技术面试过了基本上90%都面试成功了,所以LZ在和主管的交谈中也是毫无顾忌,说得天花乱坠,很多自己介于知道和不知道的东西都直接脱口而出了,结果多次被对方一反问就问得

mina基础及服务端接口测试

最近接口测试的一个项目服务端是使用mina框架写的,顺便学习了下mina2.0.下面简单介绍下mina框架及测试相关的内容. 一.mina是什么 官方解释:Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序:它提供了一个抽象的.事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发. 官网地址:http:

Mina 在 Spring 中配置同时支持 SSL 加密连接和非 SSL 连接

iOS 的 socket ,那是在很久以前用过,当时编写确实费了一番周折,要忍受 SDK 的不完善. 之后,一直是 Web 服务器支撑着 http 与 https 实现 RestFul 或... 那么好吧,有需要,就行动,重新写一遍,也好过找那三块笔记本硬盘里成堆的工程代码, 目前 SSL 的证书转换学没搞定,需要将 Mina 中使用 keystore 转换成 iOS 可识别的格式,苹果的 APNS 确实使用的不是标准的东西,不能作为参考了, 所以,在研究出来之前,还是得确保链接正常使用,确保业