热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PipeComet测试

看这篇小分享前请务必先看看这个:http:blog.csdn.netcenwenchu79archive201105276450427.aspxPipeComet这个

看这篇小分享前请务必先看看这个:http://blog.csdn.net/cenwenchu79/archive/2011/05/27/6450427.aspx

PipeComet这个支持长连接,异步请求事件处理框架做了测试也快有5天了,这里做一个简单的总结,但这个文档中的数字不能作为最终容量的定论,后续还会在优化后有进一步的测试。同时这个文档更倾向于分享过程中的遇到的一些问题,可以避免走一样的弯路。

测试环境:

1台部署了Jetty Web容器作为PipeComet服务端。

2windows测试机部署了两个LoadRunner,作为压力测试客户端。(一个用于建立大量长连接,一个用于产生http请求模拟外部事件激发数据片段下发)

服务端配置如下:

Xen虚拟机,5核(2.40 GHz),8G内存。

Jetty 7.1.6版本,jdk 1.6.0_25

JVM配置:-Xms7g -Xmx7g -XX:PermSize=96m -XX:MaxPermSize=256m -Xmn3g

Jetty配置:

400//最小和最大线程池设置的都有一点大,后面大致说一下

800

3600000 //无数据传输的连接保持多久,单位毫秒

4

false

……

测试场景描述:

1.启动服务端,并建立有Condition模式的管道配置。

2.压力测试机A通过LoadRunner并发启动Nvuser,与服务端建立N个长连接会话,服务端建立N个事件挂起当前多个请求,等待外部消息激发下行数据片段或者关闭会话。

3.压力测试机B通过LoadRunner并发启动Pvuser,随机的发起激发某一个长连接会话下行数据片段的请求,服务端接收请求后,主动向下推送数据片段。

这里有两个参数NP,N就代表单机支持多少长连接,P代表并发创建多少个事件去激发下行数据。

事先环境准备:

Linux:(这块做过高并发测试的一般都还是会比较注意)

调整一下/etc/sysctl.conf的一些系统参数:(具体不解释了,看上面的英文注释)

#add by fangweng

fs.file-max = 65535

#Allow for more PIDs

kernel.pid_max = 65536

#Increase system IP port limits

net.ipv4.ip_local_port_range = 2000 65000

# TCP and memory optimization

# increase TCP max buffer size setable using setsockopt()

net.ipv4.tcp_rmem = 4096 87380 8388608

net.ipv4.tcp_wmem = 4096 87380 8388608

# increase Linux auto tuning TCP buffer limits

net.core.rmem_max = 8388608

net.core.wmem_max = 8388608

net.core.netdev_max_backlog = 5000

修改后:

sysctl -p /etc/sysctl.conf // 作用:重新载入/etc/sysctl.conf文件

Window调整(这个一定要注意)

放火墙和杀毒软件关掉!!!

注册表中修改

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/TCPIP/Parameters

修改里面:

TcpTimedWaitDelay 1(原来30)

MaxUserPort 65534

LoadRunner参数调整:

LoadRunner在为长连测试的时候,需要修改Run-time Settings,红色部分尽量大一些

测试:

1. 并发2000个连接保持会话。

2. 并发100VUser模拟向100个长连接发起事件驱动消息。

观察得到的结果:

1. 建立起2000个连接过程中load保持在0.10.3左右,完全建立好后也就0.1多。(表明建立连接后现在的事件驱动处理方式没有空转损耗)

2. 并发100Vuser开始循环压测的时候,会有少数几个连接主动掉线。(为了看是服务端主动断连还是客户端发起,执行了tcpdump,从抓包的结果可以看到客户端主动的发起了Fin消息,当前只能认为在大量数据包下行的情况下,系统还是有保护的将下发数据频率过高的连接断开了,当防火墙或者杀毒软件打开的时候,更是容易屏蔽,这点为将来长连在客户端的问题处理也积累经验)

3. 并发100Vuser测试时,Load有明显上升,在1-2.6之间,同时通过vmstat可以看到上下文切换数量递增了两个数量级。Sar方式统计也可以很明显的看到在数据大量输入输出时,整个框架的系统消耗不小。

于是,开始判断哪里出了问题。

Load变高作为java程序员如何判断哪里出了问题呢,以下是我的经验排查方式:

1. GC是否比较频繁。(直接看gc log或者jstat gcutil)

2. IO消耗是否比较大。(cpu占用率到不高,vmstat)

3. 是否有代码空转。(cpu占用率很高,往往就几个线程长期持有cpu)

4. 是否有大量的线程Blocked。(dump线程出来看看)

在刚才的测试基础上做了一个简单的对比,如果把一百个并发请求分散到500个事件随机触发上,整理的load要低于100个事件随机模拟,也就是说数据越集中到某几个连接的事件上,消耗越大。

本地jprofiler测试了一下,看到大量的blocked线程是在处理消息输出的时候。原来当时为了简单处理并发,在response上面就增加了一个写锁,保证每次输出时候能够支持并发,但write这个动作被放在锁里是否适合?其实就是把一个时间消耗较长的动作去做了同步,最终其实使得在并发比较高,压力比较大时,竞争和阻塞厉害,导致系统消耗增大。因此还是按照传统的tcp sendbuffer模式,挂接内容支持多线程并发,输出数据为单线程循环发送,再简单测试了一下,Load明显下去了,基本就在1左右。

你可以尝试着去看vmstat,里面的procs中的r其实表示统计瞬时需要执行的任务队列长度,你会发现有时候通过top看到的load很低,但是r还是会有些上下波动,但如果任务执行的快,其实对于load影响不大。

继续测试:

并发连接数

事件激发模拟用户数

Load(建立连接过程)

Load(事件处理过程)

2000

100(50个事件随机选取)

0.1 - 0.3

0.6 – 1.2

5000

100(50个事件随机选取)

0.1 – 0.3

0.7 – 1.4

5000

200(100个事件随机选取)

0.1 – 0.3

0.8 – 1.6

这个数据并不能反映容量,但是可以说明的是,长连接数量对于系统在高并发事件处理影响不是很大,建立长连接和管理长连接所属的事件并不消耗系统资源(cpu,内存都观察过)

这篇分享中没有介绍测试中对于并发处理在异步事件驱动中的修改,具体的后续可以比较一下上次公布出来的代码和新代码的区别,简单来说:

1. 原本可以状态不脱离于线程,使得状态不比担心多线程并发控制,现在需要关注状态和资源的并发控制(例如requestlazy解析,response的输出,ThreadLocal的数据传递和复制)。

2. 客户端可以主动断开服务端,服务端网络失败也可以断开客户端,因此在任何一个对于悬挂起的异步web请求处理时都需要做好检查和资源回收处理,防止资源泄露。

3. 系统的事件驱动模型状态变更及对象内容变化要提供接口来保证用户操作时可以支持多线程并发处理。

后续还会使用java写的客户端去测试接收和发送频率是否匹配,同时必要的情况下也尝试测试慢连接(外部服务器连接)支持的情况。

待续




推荐阅读
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • java线程池的实现原理源码分析
    这篇文章主要介绍“java线程池的实现原理源码分析”,在日常操作中,相信很多人在java线程池的实现原理源码分析问题上存在疑惑,小编查阅了各式资 ... [详细]
  • 一、死锁现象与递归锁进程也是有死锁的所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
author-avatar
美丽容颜L_738
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有