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

Netty NIO 框架性能压测 – 长链接【转】

 
阅读更多
压测准备
  1. 需要将ulimit -n 改大,否则nio链接开不大。
  2. 准备4台机器(1台netty服务器,3台压测机)
  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

结论:

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

相关推荐

    Java_NIO框架Netty教程

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

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

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

    高性能框架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是一款高性能的网络应用开发框架,它采用事件驱动的方式处理网络通信,主要用于简化网络编程的复杂度,提升开发效率与系统性能。根据给定文档的描述部分...

    NIO Netty框架

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

    基于netty的nio使用demo源码

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

    netty 实现长连接

    标题中的“netty 实现长连接”指的是使用Netty框架构建能够维持长时间连接的网络通信应用。Netty是一个高性能、异步事件驱动的网络应用程序框架,适用于开发服务器和客户端的高性能、高可用性协议库。在传统的HTTP或...

    NIO框架netty

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

    Netty nio protocolbuf视频课程

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

    Java_NIO框架Netty教程.pdf

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

    netty nio 技术文档

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

    Java-NIO-Netty框架学习

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

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

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

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

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

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

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

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

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

    NIO和Netty框架的学习

    NIO(Non-blocking Input/Output)和Netty框架是Java平台上的两个核心概念,它们极大地提升了网络应用的性能和效率。本篇文章将深入探讨NIO的基本原理和Netty框架的使用,帮助你从初学者逐渐晋升为高级开发者。 ...

Global site tag (gtag.js) - Google Analytics