MINA 并发数 性能测

mina使用jmeter压力测试:500并发没有问题,但是500以上,机器就卡的不行,一启动,反应半天才运行,并发测试没法继续下去了。

测试mina最大连接数:

[java]  view plain copy
  1. package com.blazefire.client;  
  2.   
  3. import java.net.InetSocketAddress;  
  4. import java.util.Arrays;  
  5.   
  6. import org.apache.mina.core.future.ConnectFuture;  
  7. import org.apache.mina.core.service.IoConnector;  
  8. import org.apache.mina.core.session.IoSession;  
  9. import org.apache.mina.filter.codec.ProtocolCodecFilter;  
  10. import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;  
  11. import org.apache.mina.transport.socket.nio.NioSocketConnector;  
  12.   
  13. import com.blazefire.bean.BaseMessage;  
  14. import com.blazefire.bean.MessageBean;  
  15. import com.blazefire.util.BeanUtil;  
  16. import com.blazefire.util.MathProtocolCodecFactory;  
  17.   
  18. public class Client {  
  19.       
  20.     public IoConnector creatClient(){  
  21.         IoConnector connector=new NioSocketConnector();   
  22.         connector.setConnectTimeoutMillis(30000);   
  23.         connector.getFilterChain().addLast("codec",   
  24.         new ProtocolCodecFilter(new MathProtocolCodecFactory(false)));  
  25.         connector.setHandler(new ClientHandler());  
  26.         return connector;  
  27.     }  
  28.     public IoSession getIOSession(IoConnector connector){  
  29.         ConnectFuture future = connector.connect(new InetSocketAddress("192.168.1.112"9123));   
  30.         // 等待是否连接成功,相当于是转异步执行为同步执行。   
  31.         future.awaitUninterruptibly();   
  32.         // 连接成功后获取会话对象。 如果没有上面的等待, 由于connect()方法是异步的, session可能会无法获取。   
  33.         IoSession session = null;  
  34.         try{  
  35.             session = future.getSession();  
  36.         }catch(Exception e){  
  37.             e.printStackTrace();  
  38.         }  
  39.         return session;  
  40.     }  
  41.     public void sendMsg(IoSession session,String msg){  
  42.         BaseMessage baseMessage = new BaseMessage();  
  43.         MessageBean msgBean = new MessageBean();  
  44.         msgBean.setMessage(msg);  
  45.         baseMessage.setDataType(BeanUtil.MSG);  
  46.         baseMessage.setData(msgBean);  
  47.         session.write(baseMessage);  
  48.     }  
  49. //  public void sendByte(IoSession session,byte[] byteArray,String timeMsg){  
  50. //      BaseMessage baseMessage = new BaseMessage();  
  51. //      MessageBean msgBean = new MessageBean();  
  52. //      msgBean.setMsgByte(byteArray);  
  53. //      baseMessage.setDataType(BeanUtil.MSG);  
  54. //      baseMessage.setData(msgBean);  
  55. //      session.write(baseMessage);  
  56. //  }  
  57.     public static void main(String[] args) {  
  58.           
  59.                     // TODO Auto-generated method stub  
  60. //      Client  client = new Client();  
  61. //      IoConnector connector = client.creatClient();  
  62. //      for(int i=0;i<20000;i++){  
  63. //          IoSession session = client.getIOSession(connector);  
  64. //      }  
  65.         for(int i=0;i<4000;i++){  
  66.             Client  client = new Client();  
  67.             IoConnector connector = client.creatClient();  
  68.             IoSession session = client.getIOSession(connector);  
  69.             client.sendMsg(session,Arrays.toString(new byte[1000])+":"+System.currentTimeMillis());  
  70.             i++;  
  71.         }  
  72. //      Client  client = new Client();  
  73. //      IoConnector connector = client.creatClient();  
  74. //      for(int i=0;i<16000;i++){  
  75. //          IoSession session = client.getIOSession(connector);  
  76. //      }  
  77.     }  
  78. //      Client  client = new Client();  
  79. //      IoConnector connector = client.creatClient();  
  80. //      for(int i=0;i<10000;i++){  
  81. //          IoSession session = client.getIOSession(connector);  
  82. //      }  
  83. //      IoSession session = client.getIOSession(connector);  
  84. //      client.sendMsg( session,System.currentTimeMillis()+"");  
  85.     }  

只创建一次IoConnector,循环获取IoSession,

自己的程序只能运行到:16000的连接,再上去就报错。

官网的例子可以运行50000多的连接。http://mina.apache.org/report/trunk/xref/org/apache/mina/example/sumup/

      然后模拟真实情况:

[java]  view plain copy
  1. for(int i=0;i<4000;i++){  
  2.     Client  client = new Client();  
  3.     IoConnector connector = client.creatClient();  
  4.     IoSession session = client.getIOSession(connector);  
  5.     client.sendMsg(session,Arrays.toString(new byte[1000])+":"+System.currentTimeMillis());  
  6.     i++;  
  7. }  
发现自己的电脑运行上面那段程序只能开启2000多个连接,再开连接就报错。原因应该是操作系统线程数有限制。

没得办法,就一台电脑开2000个连接,两台电脑运行测试:

测试计划:4000连接数 每隔一秒发送一个1K数据包 连续运行一段时间,根据日志分析接收时间

运行半个小时后,程序划分时间90%都是1000,因为线程睡眠1S,所以减去1000,基本上没有时间消耗

说明4000连接数完全没问题。

统计分析:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值