mina的HTTP性能测试

简介:

Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。

新项目里的web service需要高并发服务能力,tomcat目前最多支持到200个并发。远达不到要求。

0.测试环境:

client和server:CPU:单核2G,内存:4GB;

网络:局域网

1.下载mina2.0安装包
打开eclipse建立工程HelloServer,把mina-core-2.0.4.jar,mina-filter-compression-2.0.4.jar
,slf4j-api-1.6.1.jar导入,注意java必须要1.5以上
3.写代码
我的测试代码:
 
 
  1. package org.apache.mina.example.httpserver.codec;  
  2.     
  3.  
  4.   import org.apache.mina.core.future.IoFutureListener;  
  5. import org.apache.mina.core.service.IoHandler;  
  6.   import org.apache.mina.core.service.IoHandlerAdapter;  
  7. import org.apache.mina.core.session.IdleStatus;  
  8. import org.apache.mina.core.session.IoSession;  
  9.  
  10.     
  11.   /**  
  12.    * An {@link IoHandler} for HTTP.  
  13.    *  
  14.    * @author The Apache MINA Project (dev@mina.apache.org)  
  15.    * @version $Rev: 588178 $, $Date: 2007-10-25 18:28:40 +0900 (?, 25 10? 2007) $  
  16.    */ 
  17.   public class ServerHandler extends IoHandlerAdapter {  
  18.       @Override 
  19.       public void sessionOpened(IoSession session) {  
  20.           // set idle time to 60 seconds  
  21.  
  22.           session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 60);  
  23.       }  
  24.     
  25.       @Override 
  26.       public void messageReceived(IoSession session, Object message) {  
  27.           // Check that we can service the request context  
  28.  
  29.           HttpResponseMessage response = new HttpResponseMessage();  
  30.           response.setContentType("text/plain");  
  31.           response.setResponseCode(HttpResponseMessage.HTTP_STATUS_SUCCESS);  
  32.           response.appendBody("CONNECTED");  
  33.     
  34.           // msg.setResponseCode(HttpResponseMessage.HTTP_STATUS_SUCCESS);  
  35.  
  36.           // byte[] b = new byte[ta.buffer.limit()];  
  37.  
  38.           // ta.buffer.rewind().get(b);  
  39.  
  40.           // msg.appendBody(b);  
  41.  
  42.           // System.out.println("####################");  
  43.  
  44.           // System.out.println(" GET_TILE RESPONSE SENT - ATTACHMENT GOOD DIAMOND.SI="+d.si+  
  45.  
  46.           // ", "+new java.text.SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss.SSS").format(new java.util.Date()));  
  47.  
  48.           // System.out.println("#################### - status="+ta.state+", index="+message.getIndex());  
  49.  
  50.     
  51.           // Unknown request  
  52.  
  53. // response = new HttpResponseMessage();  
  54.  
  55. // response.setResponseCode(HttpResponseMessage.HTTP_STATUS_NOT_FOUND);  
  56.  
  57. // response.appendBody(String.format(  
  58.  
  59. // "<html><body><h1>UNKNOWN REQUEST %d</h1></body></html>",  
  60.  
  61. // HttpResponseMessage.HTTP_STATUS_NOT_FOUND));  
  62.  
  63.             
  64.         response = new HttpResponseMessage();  
  65.         response.setResponseCode(HttpResponseMessage.HTTP_STATUS_SUCCESS);  
  66.         response.appendBody("<html><body><h1>"+new java.text.SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss.SSS").format(new java.util.Date())+"</h1></body></html>");  
  67.     
  68.           if (response != null) {  
  69.               session.write(response).addListener(IoFutureListener.CLOSE);  
  70.           }  
  71.       }  
  72.     
  73.       @Override 
  74.       public void sessionIdle(IoSession session, IdleStatus status) {  
  75.           //IoSessionLogger.getLogger(session).info("Disconnecting the idle.");  
  76.  
  77.           session.close();  
  78.       }  
  79.     
  80.       @Override 
  81.       public void exceptionCaught(IoSession session, Throwable cause) {  
  82.           //IoSessionLogger.getLogger(session).warn(cause);  
  83.  
  84.           session.close();  
  85.       }  
  86.   } 
把代码写好,官方例子是1.x的,我在附件里把例子里的import错误改过来
 
另外为了好测试,把ServerHandler.java改为(粗体那段是我加的):
 
4.打成jar包
先运行一下工程
点击工程右键->export->Runable jar file->选择“server-HelloServer”(若是没有的话先运行一下工程就有了)->finish
5.测试
把jar上传到linux(192.168.13.120)下
执行:
 
在另外一台机器(192.168.13.105)上测试:
1)1个连接,10万次请求
  1. ab -n 100000 http://192.168.13.120:8080/
测试结果:
  1. Concurrency Level: 1
  2.  
  3. Time taken for tests: 117.718673 seconds
  4.  
  5. Complete requests: 100000
  6.  
  7. Failed requests: 0
  8.  
  9. Write errors: 0
  10.  
  11. Total transferred: 39000000 bytes
  12.  
  13. HTML transferred: 6400000 bytes
  14.  
  15. Requests per second: 849.48 [#/sec] (mean)
  16.  
  17. Time per request: 1.177 [ms] (mean)
  18.  
  19. Time per request: 1.177 [ms] (mean, across all concurrent requests)
  20.  
  21. Transfer rate: 323.53 [Kbytes/sec] received
server的负载
  1. load average: 0.07, 0.02, 0.00
2)100个连接并发.10万次请求
  1. ab -n 100000 -c 100 http://192.168.13.120:8080/
  1. Concurrency Level: 100
  2.  
  3. Time taken for tests: 9.999371 seconds
  4.  
  5. Complete requests: 100000
  6.  
  7. Failed requests: 0
  8.  
  9. Write errors: 0
  10.  
  11. Total transferred: 39003900 bytes
  12.  
  13. HTML transferred: 6400640 bytes
  14.  
  15. Requests per second: 10000.63 [#/sec] (mean)
  16.  
  17. Time per request: 9.999 [ms] (mean)
  18.  
  19. Time per request: 0.100 [ms] (mean, across all concurrent requests)
  20.  
  21. Transfer rate: 3809.14 [Kbytes/sec] received
server负载
  1. load average: 0.62, 0.19, 0.06
3)1000个连接并发,10万次请求
  1. ab -n 100000 -c 1000 http://192.168.13.120:8080/
结果:
  1. Concurrency Level: 1000
  2.  
  3. Time taken for tests: 19.697403 seconds
  4.  
  5. Complete requests: 100000
  6.  
  7. Failed requests: 0
  8.  
  9. Write errors: 0
  10.  
  11. Total transferred: 39000390 bytes
  12.  
  13. HTML transferred: 6400064 bytes
  14.  
  15. Requests per second: 5076.81 [#/sec] (mean)
  16.  
  17. Time per request: 196.974 [ms] (mean)
  18.  
  19. Time per request: 0.197 [ms] (mean, across all concurrent requests)
  20.  
  21. Transfer rate: 1933.55 [Kbytes/sec] received
负载:
  1. load average: 1.76, 0.43, 0.14
结论:mina2.0在合理的负载下1000个并发,最高能达到5076.81rps(Requests per second),基本上能满足需求
end

      本文转自yifangyou 51CTO博客,原文链接:http://blog.51cto.com/yifangyou/615931,如需转载请自行联系原作者


相关文章
阿萨聊测试:如何用Postman查看HTTP消息相关内容?
阿萨聊测试:如何用Postman查看HTTP消息相关内容?
695 0
阿萨聊测试:如何用Postman查看HTTP消息相关内容?
|
JSON 搜索推荐 网络协议
玩转curl指令—测试简单的HTTP接口
玩转curl指令—测试简单的HTTP接口
2528 0
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
1629 23
|
监控 测试技术 定位技术
HTTP代理IP响应速度测试方案设计与指标体系
随着数字化发展,网络安全、隐私保护及内容访问自由成为核心需求。HTTP代理因其技术优势成为热门选择。本文介绍HTTP代理IP响应速度测试方案,包括基础性能、稳定性、地理位置、实际应用、安全性测试及监控指标,推荐测试工具,并提供测试结果评估标准。
439 2
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
917 3
快速上手|HTTP 接口功能自动化测试
|
测试技术 Python
我们假设要测试一个名为`http://example.com`的网站,并对其进行简单的GET请求性能测试。
我们假设要测试一个名为`http://example.com`的网站,并对其进行简单的GET请求性能测试。
|
数据采集 缓存 负载均衡
实测 | 芝麻代理,快代理、熊猫代理、豌豆代理HTTP代理质量测试
哈喽大家,欢迎来到本期知识分享!我们将探讨HTTP代理的质量分析方法,无论新手还是资深用户都能从中受益。首先介绍了HTTP代理的基本概念及其重要性。接着,我们通过两个关键指标——响应时间和可用性来评估代理质量。响应时间可通过`curl`命令测试并计算平均值;可用性则需设置定时任务持续检测,比如使用Python脚本。最后,通过具体案例分析了几家知名代理供应商的表现,其中青果网络在各项指标上表现突出,是进行数据采集等活动的优质选择。记得选择最适合自己的代理服务哦!
实测 | 芝麻代理,快代理、熊猫代理、豌豆代理HTTP代理质量测试
|
Shell Python
`pytest-httpserver`是一个pytest插件,它允许你在测试期间启动一个轻量级的HTTP服务器,并模拟HTTP请求和响应。
`pytest-httpserver`是一个pytest插件,它允许你在测试期间启动一个轻量级的HTTP服务器,并模拟HTTP请求和响应。
Swagger基本使用与RestTemplate发送http接口测试
Swagger基本使用与RestTemplate发送http接口测试
276 1
|
弹性计算 运维 监控
监控 HTTP 服务器的状态(测试返回码)
【4月更文挑战第28天】
407 0