`
vanadiumlin
  • 浏览: 508672 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

netty nio 框架性能压测

阅读更多
Netty NIO 框架性能压测 – 长链接
压测准备
需要将ulimit -n 改大,否则nio链接开不大。
准备4台机器(1台netty服务器,3台压测机)
使用apache的ab做压测工具



开始干活
压测代码:

package org.dueam.sample.netty;
package org.dueam.sample.netty;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.Executors;

import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.DynamicChannelBuffer;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFactory;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelHandler;
import org.jboss.netty.channel.ChannelHandler.Sharable;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;

public class ChatServer {

public static void main(String[] args) throws Exception {
if(args.length <1){
args = new String[]{"9876","true"};
}
ChannelFactory factory = new NioServerSocketChannelFactory(Executors
.newCachedThreadPool(), Executors.newCachedThreadPool());

ServerBootstrap bootstrap = new ServerBootstrap(factory);

ChatServerHandler handler = new ChatServerHandler();
ChannelPipeline pipeline = bootstrap.getPipeline();
pipeline.addLast("chat", handler);

bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.keepAlive", true);
int port = Integer.valueOf(args[0]);
bootstrap.bind(new InetSocketAddress(port));

boolean fillChat = "true".equals(args[1]);
if (fillChat) {
ChannelManagerThread cmt = new ChannelManagerThread();
cmt.start();
}

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String command = br.readLine();
if ("dump".equals(command)) {
System.out.println("当前活着的数量:" + channel.size());
} else if ("help".equals(command)) {
System.out.println("命令列表:");
System.out.println("dump:打印当前情况");
System.out.println("help:帮助文档");
}
}

}
final static Random random = new Random();
static int max = 0;
static class ChannelManagerThread extends Thread {
@Override
public void run() {
while (true) {
try {
if(max < channel.size()){
max = channel.size() ;
System.out.println("live:"+channel.size());
}

for (Channel s : channel.values()) {
if (random.nextInt(100)>70) {
ChannelBuffer cb = new DynamicChannelBuffer(256);
cb.writeBytes("Hey!有人来找你了!".getBytes());
s.write(cb);
}
}
sleep(500);
} catch (InterruptedException e) {

}
}
}
}

final static Map<Integer, Channel> channel = new HashMap<Integer, Channel>();

static void log(String message) {
System.out.println(message);
}

@Sharable
static class ChatServerHandler extends SimpleChannelHandler {
@Override
public void channelConnected(ChannelHandlerContext ctx,
ChannelStateEvent e) {
Channel ch = e.getChannel();
ChannelBuffer cb = new DynamicChannelBuffer(256);
cb.writeBytes("Hell!你来了啊!".getBytes());
ch.write(cb);
channel.put(e.getChannel().getId(), e.getChannel());
}


@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
}

@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
e.getCause().printStackTrace();
channel.remove(e.getChannel().getId());
log("remove channel by exception! id:" + e.getChannel().getId());

e.getChannel().close();
}

@Override
public void channelDisconnected(ChannelHandlerContext ctx,
ChannelStateEvent e) throws Exception {
channel.remove(e.getChannel().getId());
log("remove channel by exception! id:" + e.getChannel().getId());

}
}
}压测方式:

#加大超时和并发量,并使用keep-alive的方式保持住端口
./ab -n 20000 -c 20000 -k -t 999999999 -r http://192.168.216.30:9876/压测结果
内存损耗:

[root@cap216030 ~]# free -k -t -s 10
-- 原始内存
             total       used       free     shared    buffers     cached
Mem:       4149076     189828    3959248          0      13196      95484
-/+ buffers/cache:      81148    4067928
Swap:      2096472        208    2096264
Total:     6245548     190036    6055512

-- 执行 chat server之后
             total       used       free     shared    buffers     cached
Mem:       4149076     207236    3941840          0      13216      96244
-/+ buffers/cache:      97776    4051300
Swap:      2096472        208    2096264
Total:     6245548     207444    6038104

-- 59471 个nio连接之后
             total       used       free     shared    buffers     cached
Mem:       4149076     474244    3674832          0      13328      96132
-/+ buffers/cache:     364784    3784292
Swap:      2096472        208    2096264
Total:     6245548     474452    5771096结论:


Netty nio 可以轻松将链接开到6W,每个线程大概损坏5k左右的系统内存
后续压测方案
编写Java客户端做内容实时双向推送
使用100台机器每台机器起1000个线程来模拟客户端进行压测
分享到:
评论
1 楼 unika_ly12 2011-01-20  
啥叫“每个线程大概损坏5k左右的系统内存”

相关推荐

    NIO框架Netty实现高性能高并发

    Java异步NIO框架Netty实现高性能高并发无标题笔记 1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨 节点...

    Java_NIO框架Netty教程

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

    高性能框架Netty.doc

    Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制...

    Java NIO框架Netty教程.pdf

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

    NIO netty开发

    netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty...

    netty 新NIO框架 文档

    ### Netty新NIO框架知识点概述 #### 一、Netty框架简介 Netty是一款高性能的网络应用开发框架,它采用事件驱动的方式处理网络通信,主要用于简化网络编程的复杂度,提升开发效率与系统性能。根据给定文档的描述部分...

    基于netty的nio使用demo源码

    Netty是一个高性能、异步事件驱动的网络应用框架,它为Java开发人员提供了构建服务器和客户端应用程序的强大工具。NIO(Non-blocking Input/Output)是Java中的一个编程模型,用于处理大量的并发连接,尤其适用于高...

    Netty nio protocolbuf视频课程

    包含了Netty,NIO AIO,Mina知识的详解以及netty结合spring protocolbuf的源码

    NIO Netty框架

    NIO(Non-blocking I/O)框架是一种高性能的I/O模型,Netty和Mina都是基于NIO的框架。Netty和Mina都是Java开发的高性能网络框架,供开发者快速构建高性能的网络应用程序。下面是关于Netty和Mina的详细知识点: 开发...

    NIO框架netty

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

    Java视频教程 Java游戏服务器端开发 Netty NIO AIO Mina视频教程

    jaca视频教程 jaca游戏服务器端开发 Netty NIO AIO Mina视频教程 课程目录: 一、Netty快速入门教程 01、第一课NIO 02、第二课netty服务端 03、第三课netty客户端 04、第四课netty线程模型源码分析(一) 05、...

    netty nio 技术文档

    - **Netty**:一个高性能的异步事件驱动框架,专为服务器端开发设计,简化了网络应用程序的开发过程。 - **NIO (New I/O)**:Java平台的一种新的输入输出处理方式,它支持非阻塞模式,可以极大地提高处理高并发连接...

    Java_NIO框架Netty教程.pdf

    Netty是基于Java NIO构建的一个高性能、异步事件驱动的网络应用程序框架,它极大地简化了网络编程,特别是TCP和UDP套接字服务的开发。 Netty的特点: 1. **高度可定制化**:Netty允许开发者自定义各种协议编解码器...

    t-io是基于aio(nio2)的网络编程框架和netty属于同类

    t-io是基于aio(nio2)的网络编程框架,和netty属于同类,但t-io更注重开发一线工程师的感受,提供了大量和业务相关的API。基于t-io来开发IM、TCP私有协议、RPC、游戏服务器端、推送服务、实时监控、物联网、UDP、...

    最透彻的的Netty高性能原理和框架架构解析,使用文件和图形详细描述了netty的原理

    Netty 的高性能原理和框架架构是基于其对 JDK 原生 NIO 的改进、设计优雅、高性能和安全等方面的体现。 知识点: 1. Netty 的高性能原理是基于其对 JDK 原生 NIO 的改进的。 2. Netty 的设计优雅体现在其统一 API ...

    Android使用Netty网络框架实践(客户端、服务端)

    在Android开发中,有时我们需要构建高性能的网络通信应用,这时Netty框架就能派上大用场。Netty是一个异步事件驱动的网络应用程序框架,它为高性能、高可用性的网络服务器和客户端提供了一种简单易用的方式。本实践...

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

    Netty是一款强大的、高性能的网络应用框架,它基于Java NIO(非阻塞I/O)设计,为开发者提供了更高效、更易用的网络通信API。本实例将深入探讨Netty如何实现NIO在高并发场景下的优化和应用。 首先,让我们理解Java...

    Java-NIO-Netty框架学习

    Netty是基于Java NIO构建的一个高性能、异步事件驱动的网络应用框架,常用于开发网络服务器和客户端,如TCP、UDP协议的服务器和客户端,以及HTTP、FTP等高层协议的应用。 Netty的核心设计理念是减少系统开销,提高...

Global site tag (gtag.js) - Google Analytics